› Sviluppare funzionalita su Microsoft Office con VBA › Reset Userform tramite macro
-
AutoreArticoli
-
Ciao a tutti,
Spero possiate darmi una mano, all'interno del mio file ho una userform con 2 checkbox ed 1 textbox che inseriscono in automatico delle note in una foglio. Dallo stesso file lancio stampe pdf e vorrei che alla fine della stampa pdf l'userform si resettasse togliendo la spunta alle checkbox ed eliminando il testo dalla textbox.
Come codice so di poter utilizzare questo aprendo l'userform ma io vorrei che tutto questo lo facesse la macro dopo la stampa ed essendo una Sub Private non la posso utilizzare. Qualche consiglio su come inserire due righe di codice aggiuntive che resettino l'userform?
la Private Sub è questa:
Private Sub btnCancellaNote_Click() Checkbox1 = False Checkbox2 = False TextBox1.Value = "" End Submentre il codice macro (questo è solo una parte di codice della macro intera) che lancia la stampa pdf è questo:
With wb2.Worksheets("Output") ' inserire il nome della cartella preventivi PDF al posto di Preventivi Excel .Select uRiga = .Cells(Rows.Count, "B").End(xlUp).Row .Range("$A$5:$D$65").AutoFilter Field:=4, Criteria1:="<>" With .PageSetup .PrintArea = "A1:D" & uRiga .Orientation = xlPortrait .Zoom = False .FitToPagesWide = 1 .FitToPagesTall = False End With .ExportAsFixedFormat Type:=xlTypePDF, _ Filename:=p & "\pdf\" & Replace(s, "/", "-") & ".pdf", _ Quality:=xlQualityStandard, IncludeDocProperties:=True, _ IgnorePrintAreas:=False, OpenAfterPublish:=False End With wb2.Worksheets("Input").Select wb2.Close True 'salva e chiude il nuovo foglio creato With wb1.Worksheets("Input") ' inizio istruzioni di resettaggio celle .Range("B1,B2,B4,B5,B12:D12,B6:D6,E7,B8:D12,B20:D20,G26,G28:G30,G33,G35,J27,N45,D56,D57,D58,J31:J33,D64").ClearContents .Range("B6:D6") = "8/11/2024" .Range("E7") = "7" .Range("B8:D8") = "2" .Range("B9:D9") = "1" .Range("A56:C56") = "Rigo personalizzabile" .Range("A57:C57") = "Rigo personalizzabile" .Range("A58:C58") = "Rigo personalizzabile" ' istruzione di aggiunta +1 al preventivo .Range("B3").Value = .Range("B3").Value + 1 End WithCome vedete dopo la stampa vengono lanciate una serie di operazioni di reset del foglio o reimpostazione celle. Ecco insieme a queste operazioni io vorrei aggiungere il reset totale dell'userform.
Grazie a tutti a disposizione per chiarimenti
Ma visto che le istruzioni di cancellazione sono così poche , perchè non le replichi a fine codice che genera il pdf?
immagino che siano a parte perchè il reset e la reimpostazione celle sono su un foglio mentre la stampa pdf viene lanciata su altro foglio ancora. ma naturalmente nella mia ignoranza posso sbagliare. Diciamo che cosi com'è funziona tutto benissimo quindi non mi sono mai posto il problema, rimane solo questo piccolo problema del reset userform.
Bè le istruzioni di reset del form sono le stesse di btnCancellaNote_Click solo che faranno riferimento al form. Il quale deve essere aperto o almeno caricato anche senascosto:
With Userform1 'qui ovviamente ci vuole il nome dell'userform reale .Checkbox1 = False .Checkbox2 = False .TextBox1.Value = "" End WithC'è un problema, il codice funziona però:
io tramite la userform gestisco 3 righe nel foglio "output" dove cliccando sulle checkbox o inserendo nella textbox inserisco delle note. Il codice inserito effettivamente resetta la userform perchè se la apro subito è tutto deselezionato, ma se poi la chiudo e vado a guardare nel foglio output le note sono rimaste e se riapro la userform automaticamente si sono ripopolate. io invece vorrei che funzionasse proprio come l'userform che quando tolgo le spunte mi toglie anche le note con questo codice:
Option Explicit Private Sub UserForm_Initialize() If Foglio2.Range("A75").EntireRow.Hidden = False Then CheckBox1.Value = True End If If Foglio2.Range("A74").EntireRow.Hidden = False Then CheckBox2.Value = True End If TextBox1.Value = Foglio2.Range("A72").Value2 End Sub Private Sub btnConferma_Click() If CheckBox1 = True Then Foglio2.Range("A75").EntireRow.Hidden = False Else Foglio2.Range("A75").EntireRow.Hidden = True End If If CheckBox2 = True Then Foglio2.Range("A74").EntireRow.Hidden = False Else Foglio2.Range("A74").EntireRow.Hidden = True End If If Len(TextBox1) > 0 Then Foglio2.Range("A72").Value2 = TextBox1 Foglio2.Range("A72").EntireRow.Hidden = False Call AutoFitMergedCellRowHeight Else Foglio2.Range("A72").Value2 = "" Foglio2.Range("A72").EntireRow.Hidden = True End If Unload Me End Sub Private Sub AutoFitMergedCellRowHeight() Dim CurrentRowHeight As Single, MergedCellRgWidth As Single Dim ActiveCellWidth As Single, PossNewRowHeight As Single Dim CurrCell As Range, rng As Range Application.ScreenUpdating = False Set rng = Range("A72:D72") rng.UnMerge CurrentRowHeight = Range("A72").RowHeight ActiveCellWidth = Range("A72").ColumnWidth For Each CurrCell In rng MergedCellRgWidth = CurrCell.ColumnWidth + _ MergedCellRgWidth Next CurrCell With rng '.MergeCells = False .Cells(1).ColumnWidth = MergedCellRgWidth .EntireRow.AutoFit PossNewRowHeight = .RowHeight .Cells(1).ColumnWidth = ActiveCellWidth .MergeCells = True .HorizontalAlignment = xlJustify .VerticalAlignment = xlCenter .WrapText = True .RowHeight = IIf(CurrentRowHeight > _ PossNewRowHeight, _ CurrentRowHeight, PossNewRowHeight) End With Application.ScreenUpdating = True Set rng = Nothing End Sub Private Sub btnCancellaNote_Click() TextBox1.Value = "" End SubQuesto mi permette di automatizzare tramite l'userform l'inserimento note ed il nascondere le righe vuote.
invece con quel codice mi resetta l'userform ma quando si rende conto che sul foglio ci sono ancora le note ripopola tutto.
allego file
Allegati:
You must be logged in to view attached files.ho notato che se dopo la stampa apro l'userform e clicco sul bottone conferma (dato che tutte le opzioni sono deselezionate) funziona. L'unico modo è capire se c'è un escamotage per automatizzare questa cosa
basterebbe da quello che vedo che la macro apra in automatico dopo la stampa l'userform (questo sono riuscito a farlo), successivamente lanciasse il comando del bottone conferma ed il gioco è fatto se cosi si può dire.
una cosa del genere:
` With UserForm1 'qui ovviamente ci vuole il nome dell'userform reale .CheckBox1 = False .CheckBox2 = False .TextBox1.Value = "" UserForm1.Show Unload Me '(questo però non funziona - anche se questo forse non è abbastanza dato che deve confermare le checkbox e textbox) 'oppure meglio questo btnConferma_Click() (anche questo non funziona) End With`Call UserForm1.btnConferma_Click
c'ho provato in vari modi ma mi mancava "userform1." prima del comando. vabbè ho imparato un altra cosa.
Come sempre perfetto. Grazie Fra
mi mancava "userform1." prima del comando
Poichè non è in un modulo pubblico ma in un modulo speciale di un oggetto particolare(l'userform) allora la routine deve essere qualificata per esteso.
-
AutoreArticoli
