msg box e subroutine



  • msg box e subroutine
    di ritz75 (utente non iscritto) data: 29/05/2016 20:39:13

    Ciao a tutti.
    di seguito vi sottopongo un problema vba dal quale non riesco ad uscirne...

    Ho predisposto una macro abbastanza complessa che di seguito descrivo.

    Nel file1 al foglio1 definisco un elenco di variabili (n° di contratto), in base alla quale la macro lavorerà su alcuni file e fogli di lavoro definiti. L'esecuzione della macro sarà in sequenza: pertanto prima elabora tutti i passi per la variabile 1 ed una volta terminati passa alla variabile 2 con un semplice ciclo For Next.

    Pertanto all'esecuzione della macro:
    1- apre il file2, fa una copia del foglio1 rinominandolo e cerca in questo file le righe che contengono la variabile 1, eliminando tutte quelle che non sono relative alla stessa variabile (crea un foglio con i dati della sola variabile 1). Fatto il lavoro salva e chiude il file. La macro prosegue con il secondo passo.
    2- apre il file 3 fa una copia del foglio1 rinominandolo e cerca in questo le righe che contengono la variabile 1, eliminando tutte quelle che non sono relative alla stessa variabile (crea un foglio con i dati della sola variabile 1). Fatto il lavoro salva e chiude il file
    Questo lavoro viene fatto per altri 6 file/passi identici a questi.
    Una volta completati tutti i passi (variabile 1 in esame definita nel file1 al foglio1), passa alla variabile 2 dell'elenco (definita sempre al file1 al foglio1) e fa i soliti passi di cui sopra e così via... per N volte quante sono le variabili dell'elenco.

    Ho strutturato la macro definendo 1 modulo per ogni passo (file da aprire, copiare il foglio, ricercare ed eliminare i valori non congrui con il contratto ecc, in modo da rendere più agevole la manutenzione). I vari moduli sono richiamati in sequenza con una funzione "call nome_macro"e definita nel primo modulo (chiamiamolo di lancio macro in quanto contiene le definizioni di set, directory di lettura file ecc.).

    Quello che vorrei fare è inserire dei msg box che compaiano in determinate situazioni e che diano all'utente che esegue la macro, la possibilità di scegliere come proseguire. Ovvero, nel caso in cui in uno dei file apre non sia presente il valore della variabile in esecuzione, vorrei che con un msgbox YesNoCancel, l'utente possa:
    - proseguire con l'esecuzione dei moduli successivi (opzione yes) sempre per la stessa variabile (contratto);
    - decidere se passare alla variabile (contratto) successiva (opzione no) dell'elenco, pertanto passare al prossimo contratto (next N) interrompendo anzitempo l'esecuzione precedente.
    - stoppare l'esecuzione di tutta la macro ed uscire dal file.

    Ho provato a mettere giù un codice che vi propongo di seguito (si riferisce ad un caso creato ad hoc ed estremamente semplificato e nel quale non apre file e funziona solo per la prima variabile visto che va ad eliminare le righe... però simula abbastanza il lavoro... nella realtà se funziona con la prima funziona anche con le successive).
    La prima parte è il modulo 1 che poi con la call richiama il modulo 2 (macro prima) che riporto in esempio e il modulo 3 (macro seconda) che riporto.
    Se eseguo la macro "Esecuzione" va in errore e mi dice Next senza For.
    Se deseleziono i msg box la macro funziona perfettamente.
    Cosa c'è di sbagliato? si può fare o non si può fare ed eventualmente che trucchetti potrei usare?

    Vi allego il file che è un esempio semplificatissimo.

    Grazie sin d'ora per l'aiuto!!!!
     
    Public var0, wk1
    
    Sub Esecuzione()
    wk1 = ActiveWorkbook.Name
    sh1 = "dati"
    da = 2
    a = 3
    
    For n = da To a
       crea = Workbooks(wk1).Sheets(sh1).Range("A" & n).Value
    
        If crea = 1 Then
          var0 = Workbooks(wk1).Sheets(sh1).Range("B" & n).Value
        End If
    
        Call Prima
          If msg0 = 1 Then
          msg1 = MsgBox("contratto non presente: proseguire con il contratto o passare al successivo?", vbYesNo)
          
          If msg1 = vbYes Then
        Call Seconda
          Else
          MsgBox "ciao"
          End If
    Next n
    End Sub
    
    
    
    Public msg0
    Sub Prima()
        Workbooks(wk1).Sheets("prima").Activate
    Dim var1(1) As String
    var1(1) = var0
        For C = 1 To 1
            ur = Range("A" & (Rows.Count)).End(xlUp).Row
            For CR = ur To 2 Step -1
                If var1(C) <> UCase(Cells(CR, 1).Value) Then Rows(CR & ":" & CR).Delete shift:=xlUp
            Next CR
        Next C
        If Range("A2").Value <> var0 Then
            msg = MsgBox("contratto non presente", vbOKOnly)
        End If
     End Sub
    
    Public msg1
    Sub Seconda()
        Workbooks(wk1).Sheets("seconda").Activate
    Dim var1(1) As String
    var1(1) = var0
        For C = 1 To 1
            ur = Range("A" & (Rows.Count)).End(xlUp).Row
            For CR = ur To 2 Step -1
                If var1(C) <> UCase(Cells(CR, 1).Value) Then Rows(CR & ":" & CR).Delete shift:=xlUp
            Next CR
        Next C
        If Range("A2").Value <> var0 Then
            msg1 = MsgBox("contratto non presente", vbOKOnly)
        End If
     End Sub
    



  • di patel data: 30/05/2016 14:48:17

    ci sono due IF aperti ed un solo End If
    se indenti correttamente il codice lo vedi subito
     
    For n = da To a
       crea = Workbooks(wk1).Sheets(sh1).Range("A" & n).Value
       If crea = 1 Then
          var0 = Workbooks(wk1).Sheets(sh1).Range("B" & n).Value
       End If
       Call Prima
       If msg0 = 1 Then
          msg1 = MsgBox("contratto non presente: proseguire con il contratto o passare al successivo?", vbYesNo)
          If msg1 = vbYes Then
            Call Seconda
          Else
            MsgBox "ciao"
          End If
       End If '<<<<<<<<<<<
    Next n