Creazione Userform su file excel già esistente e strutturato con diverse macro

Anonimo
2015-05-07T14:45:59+00:00

Buongiorno a tutti.

Sono praticamente inesperto sulla creazione di userform.

Chiedo gentilmente una mano per creare sul mio file excel già strutturato con diverse macro una userform ad hoc.

Se mi spiegate come fare allego volentieri sia il file excel e sia un esempio della struttura della userform che mi servirebbe.

Ultima cosa: la userform dovrebbe partira all'apertura del file excel.

Grazie mille in anticipo a tutti.

Massimo

Microsoft 365 e Office | Excel | 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
2015-05-14T18:03:15+00:00

Ciao Massimo,

Sostituisci

 Private Sub UserForm_Initialize()

Dim rng As Excel.Range

con:

Private Sub UserForm_Initialize()

    Dim rng As Excel.Range

    Call deleteCaption(Me)

Se non riesci ancora di integrare il mio codice, carica un file di esempio che include la userform - i dati hanno poca importanza e possono essere cancellati - e posta un link al file qui.

===

Regards,

Norman

La risposta è stata utile?

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2015-05-12T20:43:23+00:00

Ciao Massimo,

no, il metodo Quit non prevede argomenti. Te ne puoi accorgere da solo se, quando digiti l'istruzione, arrivato a scrivere Application.Quit<spazio> non compaiono argomenti. Invece quando scrivi ThisWorkbook.Close<spazio> appare il suggerimento: Close([SaveChanges], [Filename], [RouteWorkbook]) a indicare che gli argomenti possibili di quel metodo sono tre e tutti facoltativi (perché racchiusi in parentesi quadra).

Quindi potresti scrivere:

Private Sub cmdClose_Click()

    ThisWorkbook.Close SaveChanges:=True

    Application.Quit

End Sub

In questo modo chiudi, salvando, la Cartella di lavoro nel cui Progetto VBA sta lo UserForm in cui viene eseguito quel codice e esci da Excel; così se ci sono altre Cartelle di lavoro aperte e non salvate ti viene proposto il solito messaggio: [Salva] [Non salvare] [Annulla].

Però, però... Non va mica bene fare così. È come se allo UserForm gli togliessimo la sedia mentre sta per sedersi.

Meglio fare così:

  • Aggiungi la variabile booleana a livello di modulo mblnQuitOnClose. Ovvero la scrivi subito dopo la lista delle costanti a livello di modulo:

Private Const mcstrColDat As String = "H"

Private mblnQuitOnClose   As Boolean

  • Nella routine-evento del pulsante cmdQuit scrivi:

Private Sub cmdQuit_Click()

    mblnQuitOnClose = True

    Unload Me

End Sub

  • E, per finire, la routine-evento che viene eseguita per ultima allo scaricamento dello UserForm:

Private Sub UserForm_Terminate()

    If mblnQuitOnClose Then

      With ThisWorkbook

        If Not .Saved Then .Save

        .Application.Quit

      End With

    End If

End Sub

La risposta è stata utile?

0 commenti Nessun commento

60 risposte aggiuntive

Ordina per: Meno recente
  1. Anonimo
    2015-05-14T17:33:27+00:00

    Ciao Norman.

    Innanzi tutto grazie per la risposta.

    Non so però come integrare i tuoi codici a quello che ho già io...

    Nella mia USERFORM ho questo codice:

    Option Explicit

    Private Const mcstrFoglio As String = "Foglio1"

     Private Const mcstrStart  As String = "A4"

    Private Const mcstrStop   As String = "A81"

     Private Const mcstrColST_ As String = "A"

     Private Const mcstrColOgg As String = "B"

     Private Const mcstrColRFR As String = "C"

     Private Const mcstrColOwn As String = "D"

     Private Const mcstrColApp As String = "E"

     Private Const mcstrColAmb As String = "G"

     Private Const mcstrColDat As String = "H"

     Private Const mcstrColNot As String = "L"

     Private mblnQuitOnClose   As Boolean

    Private Sub cmdInserisci_Click()

     On Error GoTo ExtP

    Dim wbk As Excel.Workbook

     Dim wsh As Excel.Worksheet

     Dim r   As Long

     Dim ctl As MSForms.Control

        Set wbk = Excel.Application.ThisWorkbook

         Set wsh = wbk.Worksheets(mcstrFoglio)

         With wsh

           r = .Range(mcstrStop).End(xlUp).Row + 1

          If r = .Range(mcstrStart).Row Then

             MsgBox "L'area dati è piena.", _

                    vbOKOnly Or vbExclamation, _

                    "Inserisci"

           Else

             .Range(mcstrColST_ & r).Value = Me.txtST.Value

             .Range(mcstrColOgg & r).Value = Me.txtoggetto.Value

             .Range(mcstrColRFR & r).Value = Me.txtRFR.Value

             .Range(mcstrColOwn & r).Value = Me.cboowner.Value

             .Range(mcstrColApp & r).Value = Me.cboapplicativo.Value

             .Range(mcstrColAmb & r).Value = Me.cboambiente.Value

             .Range(mcstrColDat & r).Value = Me.cbodata.Value

             .Range(mcstrColNot & r).Value = Me.txtnote.Value

           End If

         End With

    With Me

           For Each ctl In .Controls

             With ctl

               If TypeName(ctl) = "CommandButton" Then

                 If ctl Is Me.cmdNew Then

                   .Enabled = True

                   .SetFocus

                 End If

               Else

                 .Enabled = False

               End If

             End With

           Next

           .cmdInserisci.Enabled = False

         End With

    ExtP:

         With Err

           If .Number Then MsgBox .Description, _

                                  vbOKOnly Or vbCritical, _

                                  "ERRORE#" & .Number

         End With

         On Error Resume Next

         Set ctl = Nothing

         Set wsh = Nothing

         Set wbk = Nothing

     End Sub

    Private Sub cmdNew_Click()

     Dim ctl As MSForms.Control

         With Me

           For Each ctl In .Controls

             With ctl

               If TypeName(ctl) = "CommandButton" Then

                 If ctl Is Me.cmdInserisci Then .Enabled = True

               Else

                 Select Case TypeName(ctl)

                 Case "ComboBox", "TextBox"

                   .Enabled = True

                   .Value = Null

                 Case "Label"

                   .Enabled = True

                 Case Else

                   ' DO NOTHING

                 End Select

               End If

             End With

           Next

           .cmdNew.Enabled = False

           .txtST.SetFocus

         End With

         Set ctl = Nothing

     End Sub

     Private Sub UserForm_Initialize()

    Dim rng As Excel.Range

        For Each rng In ThisWorkbook.Worksheets("Foglio1").Range("Z83:Z89")

          Me.cbodata.AddItem VBA.FORMAT$(rng.Value, "dd/mm/yyyy")

        Next

        Set rng = Nothing

     With Me

            .BorderStyle = fmBorderStyleSingle

        End With

        'interrompo eventuali Alert e ridimensiono

        'a tutto schermo il file di Excel

        With Application

            .DisplayAlerts = False

            .WindowState = xlMaximized

        End With

        'ridimensiono la UserForm

        With Application

            Me.Top = .Top

            Me.Left = .Left

            Me.Height = .Height

            Me.Width = .Width

        End With

    End Sub

    Private Sub cmdTEST_Click()

         Unload Me

     End Sub

    Private Sub cmdQuit_Click()

         mblnQuitOnClose = True

         Unload Me

     End Sub

     Private Sub UserForm_Terminate()

         If mblnQuitOnClose Then

           With ThisWorkbook

             If Not .Saved Then .Save

             .Application.Quit

           End With

         End If

     End Sub

    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 'Disabilita la X di dx

    If CloseMode = vbFormControlMenu Then

    Cancel = True

    End If

    End Sub

    Mentre nel modulo deduco che devo copiare così com'è il tuo codice giusto?

    Se mi puoi aiutare con il codice della USERFORM te ne sarei grato.

    Massimo

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-05-14T17:35:10+00:00

    il pulsante di chiusura della Userform ha questo codice nella mia userform:

    Private Sub cmdTEST_Click()

         Unload Me

     End Sub

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2015-05-14T18:21:46+00:00

    ANDATA!!!!

    Grazie mille!!!

    La risposta è stata utile?

    0 commenti Nessun commento