Contare userform ed aprirle



  • Contare userform ed aprirle
    di Rita (utente non iscritto) data: 31/10/2014 12:51:12

    Ciao a tutti
    dovrei da un pulsante sul foglio aprire in sequenza tutte le userform che ho nel file
    qualcuno sa come poter conoscere il numero di userform nel file e poterle aprire in sequenza
    ho provato con l'istruzione qui sotto partendo dal presupposto che siano 4 ma non le vede


     
    for i= 1 to 4
    userform(i).show
    next i
    



  • di Zer0Kelvin data: 31/10/2014 13:30:20

    Ciao.
    L'istruzione

    userform(i).show

    e sbagliata; dovrebbe essere

    UserForms(i).show

    L'insieme UserForms contiene, però, tutte le UserForms CARICATE nel'applicazione.
    Se le userforms non sono state prima caricate, l'insieme sarà vuoto...

    PS: impara ad usare la dichiarazione obbligatoria delle variabili. e a dichiarare le variabili naturalmente!



  • di Rita (utente non iscritto) data: 31/10/2014 13:53:30

    Grazie della risposta
    non avresti un esempio come poter individuare il numero delle userform e poterle aprire in sequenza richiamandole dal foglio di lavoro
    io non so da dove partire



  • di Zer0Kelvin data: 31/10/2014 14:20:28

    Sarebbe meglio se spiegassi quello che devi fare.
    Comunque, per aprire tutte le userform devi usare un codice analogo a quello che riporto sotto.
    Bisogna prima caricare con
    Load NomeDellaUserForm
    le userform che si vogliono aprire e solo dopo si può utilizzare un ciclo per aprirle tutte.
    Le userform vanno aperte in modalità non a scelta obbligata (vbModeless) altrimenti il ciclo non và avanti se non viene chiusa la userform aperta.
    Tutto sommato è un metodo molto poco pratico.
    Un'alternativa, notevolmente più complicata, consiste nell'accedere al VBAProject e determinare quante userform contiene per poi aprirle tutte.
     
    Sub LoadForms()
        Load UserForm1
        Load UserForm2
        '...
    End Sub
    
    Sub ApriForms()
    Dim I As Long
        For I = 0 To UserForms.Count - 1
            UserForms(I).Show vbModeless
        Next I
    End Sub
    



  • di Rita (utente non iscritto) data: 31/10/2014 14:42:15

    <<<>>>

    esatto e' proprio quello che ti chiedevo, determinare quante sono ed aprilrle in sequenza





  • di Rita (utente non iscritto) data: 31/10/2014 14:44:17

    scusa ma mi sono espressa male
    volevo dire, tutto e' contenuto nell'ultima tua frase (Un'alternativa, notevolmente più complicata, consiste nell'accedere al VBAProject e determinare quante userform contiene per poi aprirle tutte.)

    ossia dovrei determinare quante sono le userform ed aprirle in automatico



  • di Zer0Kelvin data: 31/10/2014 15:21:20

    Prima di procedere in quel senso bisogna essere certi che vi sia un motivo valido per intraprendere quella strada.
    Cosa ti impedisce di scrivere semplicemente
     
    Userform1.Show vbModeless
    Userform2.Show vbModeless
    Userform3.Show vbModeless
    'eccetera...



  • di Rita (utente non iscritto) data: 02/11/2014 18:39:28

    Perché mi serve applicarla su diversi file all'interno dei quali non so quante form contengono



  • di isy (utente non iscritto) data: 02/11/2014 21:39:33

    Ciao

    Ho allegato il ciclo per mostrare tutti i form presenti nel foglio
     
    'In un modulo
    Option Explicit
    
    Sub Show_Form()
      Dim l         As Variant
      Dim FormName  As String
          For l = 1 To ActiveWorkbook.VBProject.VBComponents.Count
            With ActiveWorkbook.VBProject.VBComponents(l)
              If .Type = 3 Then
                 Dim oUserForm As Object
                  On Error GoTo err
                  FormName = .Name
                  Set oUserForm = UserForms.Add(FormName)
                  oUserForm.Show
              End If
            End With
          Next
    Exit Sub
    err:
        Select Case err.Number
    Case 424:
            MsgBox "The Userform with the name " & FormName & " was not found.", vbExclamation, "Load userforn by name"
    Case Else:
            MsgBox err.Number & ": " & err.Description, vbCritical, "Load userforn by name"
        End Select
    End Sub
    



  • di lepat (utente non iscritto) data: 02/11/2014 22:21:09

    stringendo un po'
     
    Sub ShowForm()
    Dim comp As Object
    For Each comp In ActiveWorkbook.VBProject.VBComponents
      If comp.Type = 3 Then
         UserForms.Add(comp.Name).Show vbModeless
      End If
    Next
    End Sub



  • di Rita (utente non iscritto) data: 03/11/2014 08:49:49

    Inizialmente ringrazio tutti per gli aiuti
    infatti le ultime due ricalcano quello che proprio stavo cercando
    Un ultimo aiuto
    nell'istruzione postata qui sotto che ho modificato in un foglio rileva quali sono le userform le apre in sequenza
    e gli ho aggiuntio la stampa
    il problemino sorge nel momento in cui ho l'istruzione in cui si apre la userform
    la stampo ma vorrei che sparisse per poi partire con l'istruzione successiva
    ho inserito
    ""UserForms.Add(comp.Name).Hide"" ma la userform rimane aperta
    come posso ovviare


     
    Sub ShowForm()
    Dim comp As Object
    For Each comp In ActiveWorkbook.VBProject.VBComponents
     If comp.Type = 3 Then
    UserForms.Add(comp.Name).Show vbModeless
    UserForms.Add(comp.Name).PRINTFORM
    UserForms.Add(comp.Name).Hide
      End If
    Next
    End Sub
    



  • di lepat (utente non iscritto) data: 03/11/2014 09:39:23

    prova così
     
    Sub ShowForm()
    Dim comp As Object
    For Each comp In ActiveWorkbook.VBProject.VBComponents
     If comp.Type = 3 Then
        UserForms.Add(comp.Name).Show 
        UserForms.Add(comp.Name).PRINTFORM
      End If
    Next



  • di Rita (utente non iscritto) data: 03/11/2014 09:47:14

    ciao lepat
    le userform cosi' rimangono sempre aperte ossia
    le apre e le stampa in sequenza solo che vorrei che poi sequenzialmente sparissero (per quello che avevo inserito l'istruzione hide) ma non funziona



  • di Zer0Kelvin data: 03/11/2014 12:00:51

    Se hai necessità di effettuare la procedura su più files, ti conviene usare una Sub che accetti una cartella come parametro:
     
    Sub PrintForms(Wkb As Workbook)
    Dim comp As Object
        For Each comp In Wkb.VBProject.VBComponents
         If comp.Type = 3 Then
            With UserForms.Add(comp.Name)
                .Show vbModeless
                .PRINTFORM
                .Hide
            End With
          End If
        Next
    End Sub
    
    Sub test()
        PrintForms ThisWorkbook
    End Sub
    



  • di Zer0Kelvin data: 03/11/2014 12:04:32

    per aprire e stampare le forms di una cartella:
     
    Sub test2()
    Dim NewWK As Workbook
        Set NewWK = Workbooks.Open("XYZ.xls")
        PrintForms NewWK
        NewWK.Close False
        Set NewWK = Nothing
    End Sub
    



  • di Zer0Kelvin data: 03/11/2014 12:07:48

    PS: se non usi
    .Show vbModeless
    l'esecuzione non prosegue finchè non chiudi la userform manualmente.



  • di Rita (utente non iscritto) data: 03/11/2014 12:31:27

    ok e' proprio quello che mi serve
    grazie



  • di Zer0Kelvin data: 03/11/2014 12:36:09

    PPS:
    Sembra che ci siano problemi ad usare UserForms.Add su files differenti.
    La procedura non riesce a caricare le userform contenute nell'altro file, non riconosce il nome.
    Vediamo...



  • di Zer0Kelvin data: 03/11/2014 20:23:22

    Risolto (credo).
    Ho creato una procedura che scrive la sub all'interno del file che contiene le userform da stampare, stampa le form e chiude il file senza salvare.
    E' sufficiente passare il nome del file con le form da salvare; es
    PrintForms "Pippo.xls"
     
    Sub PrintForms(FileName As String)
    Dim VBC As VBComponent
    Dim NewWK As Workbook
        Set NewWK = Workbooks.Open(FileName)
        NewWK.VBProject.VBComponents.Add(vbext_ct_StdModule).Name = "TmpMod"
        With NewWK.VBProject.VBComponents("TmpMod").CodeModule
            .InsertLines 3, _
            "Public Sub PrintFormsA(): Dim Comp As Object" & Chr(13) & _
            "For Each Comp In ThisWorkbook.VBProject.VBComponents" & Chr(13) & _
            "If Comp.Type = 3 Then" & Chr(13) & _
            "With UserForms.Add(Comp.Name): .Show vbModeless: .PRINTFORM: .Hide: End With" & Chr(13) & _
            "End If: Next: ThisWorkbook.Close False: End Sub" & Chr(13)
        End With
        Application.Run NewWK.Name & "!PrintFormsA"
        Set VBC = Nothing
        Set NewWK = Nothing
    End Sub