Routine che si ripete VBA - Problema ME.

Anonimo
2012-03-02T14:17:17+00:00

Mi scuso con tutti voi ma ho letto mille cose senza riuscire a capire.

Ho una routine che ho creato tramite vba in un evento sottotabella.

Siccome ho tante sottotabelle quasi uguali non vorrei ripetere lo stesso codice.

Ho provato a definire una funzione creando un modulo.

Ma c'e' qualche problema dovuto solo alla mia ignoranza.

Nella routine si utilizza la parola chiave Me e la routine mi segnala l'incongruenza dell'utilizzo della chiave Me.

Come posso fare????

E' giusto appoggiare una "funzione" nel modulo???

Allego l'accrocchio che dovrebbe diventare "Funzione,Routine,Bho".

Grazie a tutti.

________________________

Private Sub Previsto_Click()

Dim Previsto, copertofino, interazione, annocorrente, count As Integer

Dim contratto, Categoria, Scadenza As String

Dim prezzo As Integer

Dim serieanni() As String

' Forms![tb-preventivi]![Durata contratto].SetFocus

Previsto = Me.[Previsto]

Scadenza = Me.[Scadenza]

contratto = Forms![tb-preventivi]![Durata contratto].Value

annocorrente = Year(Now())

If IsNull([Coperto fino]) Then

copertofino = 0

Else

copertofino = Me.[Coperto fino]

End If

If IsNull([Prezzo di listino]) Then

prezzo = 0

Else

prezzo = Me.[Prezzo di listino]

End If

If (copertofino - annocorrente) > 0 Then

copertofino = (copertofino - annocorrente)

End If

'______________________________________________________

If (Scadenza = "annuale") Then

Scadenza = "1,1,1,1,1,1"

End If

If (Scadenza = "biennale") Then

Scadenza = "1,0,1,0,1,0"

End If

If (Scadenza = "triennale") Then

Scadenza = "1,0,0,1,0,0"

End If

If (Scadenza = "quadriennale") Then

Scadenza = "1,0,0,0,1,0"

End If

If (Scadenza = "contratto") Then

Scadenza = "1,0,0,0,0,0"

End If

'______________________________________________________

If (contratto = "annuale") Then

interazione = 1

End If

If (contratto = "biennale") Then

interazione = 2

End If

If (contratto = "triennale") Then

interazione = 3

End If

If (contratto = "quadriennale") Then

interazione = 4

End If

If (contratto = "quinquennale") Then

interazione = 5

End If

If (contratto = "sessennale") Then

interazione = 6

End If

For i = 1 To copertofino

Scadenza = "0," & Scadenza

Next i

serieanni = Split(Scadenza, ",")

count = 0

For i = 1 To interazione

If (serieanni(count) = "1") Then

If (count = 0) Then

Me.[Anno1] = prezzo

End If

If (count = 1) Then

Me.[Anno2] = prezzo

End If

If (count = 2) Then

Me.[Anno3] = prezzo

End If

If (count = 3) Then

Me.[Anno4] = prezzo

End If

If (count = 4) Then

Me.[Anno5] = prezzo

End If

If (count = 5) Then

Me.[Anno6] = prezzo

End If

End If

count = 1 + count

Next i

If ([Previsto]) = 0 Then

Me.[Anno1] = ""

Me.[Anno2] = ""

Me.[Anno3] = ""

Me.[Anno4] = ""

Me.[Anno5] = ""

Me.[Anno6] = ""

End If

End Sub

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2012-03-02T15:29:18+00:00

Ciao,

penso che tu ti voglia riferire ad delle sottomaschere ed ai relativi eventi.

Non prendermi per pignolo, è solo che la chiarezza dei concetti aiuta te a capire e noi ad aiutarti.

Una funzione è una routine che restituisce qualcosa, (un valore), una sub invece "fa" delle cose senza restituirti un valore.

Da quello che vedo a te serve una sub pubblica (poichè deve essere richiamata da diverse parti del programma).

E' corretto quindi che tu abbia creato un modulo, non di classe, ed abbia pensato di inserirci dentro il codice comune.

Detto questo la routine va in errore perchè Me da indicazione al programma di riferirsi all'oggetto corrente, sia esso maschera o report. Spostando il codice fuori dalla tua form (principale o sottomaschera) il riferimento a Me non è più valido.

Serve quindi che sull'evento click del pulsante, che se ho inteso bene è stato creato nella sottomaschera, tu richiami la sub passandogli come parametro il riferimento alla sottomaschera corrente che ha richiamato la routine.

Interpreto bene dicendo che il nome della maschera principale è  tb-preventivi e che il pulsante da cui lanci la procedura si trova nella sottomaschera?

Prova in questo modo:

Nell'evento su click del pulsante inserisci questo codice.


    Call Aggiorna(Me)


Invece in un nuovo modulo inserisci questa routine


Public Sub Aggiorna(ByVal objSottomaschera As Form)

    Dim Previsto As Integer

    Dim copertofino As Integer

    Dim interazione As Integer

    Dim annocorrente As Integer

    Dim count As Integer

    Dim prezzo As Integer

    Dim i As Integer

    Dim contratto As String

    Dim Categoria As String

    Dim Scadenza As String

    Dim serieanni() As String

    Dim frmPri As Form

    Dim frmSub As Form

    Set frmPri = Forms![tb-preventivi]

    Set frmSub = objSottomaschera

    Previsto = frmSub![Previsto]

    Scadenza = frmSub![Scadenza]

    contratto = frmPri![Durata contratto].Value

    annocorrente = Year(Now())

    If IsNull(frmSub![Coperto fino]) Then

        copertofino = 0

    Else

        copertofino = frmSub![Coperto fino]

    End If

    If IsNull(frmSub![Prezzo di listino]) Then

        prezzo = 0

    Else

        prezzo = frmSub![Prezzo di listino]

    End If

    If (copertofino - annocorrente) > 0 Then

        copertofino = (copertofino - annocorrente)

    End If

'______________________________________________________

    If (Scadenza = "annuale") Then

        Scadenza = "1,1,1,1,1,1"

    End If

    If (Scadenza = "biennale") Then

        Scadenza = "1,0,1,0,1,0"

    End If

    If (Scadenza = "triennale") Then

        Scadenza = "1,0,0,1,0,0"

    End If

    If (Scadenza = "quadriennale") Then

        Scadenza = "1,0,0,0,1,0"

    End If

    If (Scadenza = "contratto") Then

        Scadenza = "1,0,0,0,0,0"

    End If

'______________________________________________________

    If (contratto = "annuale") Then

        interazione = 1

    End If

    If (contratto = "biennale") Then

        interazione = 2

    End If

    If (contratto = "triennale") Then

        interazione = 3

    End If

    If (contratto = "quadriennale") Then

        interazione = 4

    End If

    If (contratto = "quinquennale") Then

        interazione = 5

    End If

    If (contratto = "sessennale") Then

        interazione = 6

    End If

    For i = 1 To copertofino

        Scadenza = "0," & Scadenza

    Next i

    serieanni = Split(Scadenza, ",")

    count = 0

    For i = 1 To interazione

        If (serieanni(count) = "1") Then

            Select Case count

                Case 0

                    frmSub![Anno1] = prezzo

                Case 1

                    frmSub![Anno2] = prezzo

                Case 2

                    frmSub![Anno3] = prezzo

                Case 3

                    frmSub![Anno4] = prezzo

                Case 4

                    frmSub![Anno5] = prezzo

                Case 5

                    frmSub![Anno6] = prezzo

                Case Else

                    '???

            End Select

        End If

        count = 1 + count

    Next i

    If ([Previsto]) = 0 Then

        frmSub![Anno1] = ""

        frmSub![Anno2] = ""

        frmSub![Anno3] = ""

        frmSub![Anno4] = ""

        frmSub![Anno5] = ""

        frmSub![Anno6] = ""

    End If

    Set frmPri = Nothing

    Set frmSub = Nothing

End Sub


David

La risposta è stata utile?

0 commenti Nessun commento

4 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2012-03-05T08:52:19+00:00

    Scusa David, mi sono reso conto adesso di aver letto male quello che mi suggerivi prima.

    Avevo letto: invece "DI" un nuovo modulo inserisci questa routine.

    Scusa e grazie ancora

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2012-03-05T08:46:17+00:00

    Ciao,

    apri l'editor VBA (ALT + F11)

    Menù inserisci ---> Modulo (non di classe).

    Nello finestra che si aprirà sulla destra dello schermo incolla tutto il codice da

    Public Sub Aggiorna(ByVal objSottomaschera As Form)

    fino ad  End Sub

    David

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2012-03-04T10:38:41+00:00

    Invece in un nuovo modulo inserisci questa routine


    Public Sub Aggiorna(ByVal objSottomaschera As Form)

    ____________________________________________________

    Grazie per le risposte,

    Dove inserisco la routine???

    Grazie ancora.

    (ovviamente ho un' altra domanda che faro' adesso)

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2012-03-02T15:39:58+00:00

    Mi commuove la tua disponibilità!

    Non ci sarei mai riuscito.

    Grazie, adesso provo.

    La risposta è stata utile?

    0 commenti Nessun commento