View Full Version : [VBA] UserForm/CommandButton in una macro
diabolik1981
03-07-2009, 11:14
Non so se è la sezione giusta (forse Programmi?), però si tratta di una cosa che riguarda prettamente la programmazione piuttosto che Excel vero e proprio. Ad ogni modo vi espongo il problema.
Sono abbastanza niubbo di programmazione, ma per necessità sto preparando un lavoro in excel in cui si fa abbondante uso di macro elaborate ed ora mi ritrovo a combattere con gli UserForm e di preciso con i Command Button.
Ho la necessità di far apparire ad una certa fase dell'esecuzione di una macro uno UserForm con 2 pulsanti, uno dei quali mi deve far proseguire l'esecuzione della macro da un certo punto (Lab100), mentre il secondo interrompe tutto. Ebbene il problema è far funzionare il primo pulsante di modo che la macro prosegua dal punto richiesto.
Vi posto la parte incriminata della macro
Sub QuotaAcqua()
Dim CausOperaz As String
Dim AnaInterno() As String
Dim AnaNomeCondomino() As String
Dim AnaImportoEntrate() As Single
Dim Indice As Integer
Dim IndiceAnag As Integer
Dim IndiceMovim As Integer
Dim Accoda As String
Dim NumeroCondomini As Integer
Dim CausTrim As String
Dim Periodo As String
Sheets("Mov.Boll").Select
If IsEmpty(Cells(2, 1)) Then GoTo Lab050
'Accoda = InputBox(Prompt:="File movimenti Pieno, devi accodare altri movimenti?", _
Title:="Accoda Movimenti")
UserForm1.Show
'If Accoda <> "si" Then GoTo LabFine
Lab050:
CausTrim = InputBox(Prompt:="Indicare il trimestre di riferimento, 8 se è il conguaglio", _
Title:="Indicare il trimestre di riferimento, 8 se è il conguaglio")
Sheets("Q.Acqua").Select
If CausTrim <> "" Then GoTo Lab075
MsgBox "Non hai specificato alcuna causale"
Sheets("Mov.Boll").Select
GoTo LabFine
Lab075:
If CausTrim = 1 Then GoTo Lab100
If CausTrim = 2 Then GoTo Lab100
If CausTrim = 3 Then GoTo Lab100
If CausTrim = 4 Then GoTo Lab100
If CausTrim = 8 Then GoTo Lab100
MsgBox "Hai indicato un valore errato; sono consentiti i trimesti 1,2,3,4 o 8 per conguaglio"
Sheets("Mov.Boll").Select
GoTo Lab050
Lab100:
La parte in rosso era la soluzione precedente con InputBox, che sebbene funzionante era poco funzionale e comoda da usare (dover digitare si/no è peggio dell'uso dei pulsanti).
Alla pressione del pulsante Si c'è il salto a Lab100 da cui procede regolarmente la macro.
Spero di essere stato chiaro e che qualcuno mi possa dare una mano.
scusami forse no ho capito io...
ma che c'è di male in un banale SI NO?
qualcosa tipo
Accoda = MsgBox("continuo?", vbYesNo, "TITOLO")
If Accoda = vbNo Then End
diabolik1981
03-07-2009, 13:27
scusami forse no ho capito io...
ma che c'è di male in un banale SI NO?
qualcosa tipo
Accoda = MsgBox("continuo?", vbYesNo, "TITOLO")
If Accoda = vbNo Then End
il fatto che devi scriverlo a mano, mentre buona parte del lavoro viene svolto via mouse
il fatto che devi scriverlo a mano, mentre buona parte del lavoro viene svolto via mouse
ma quello che ti ho postato ha i 2 pulsanti SI NO
diabolik1981
03-07-2009, 13:53
ma quello che ti ho postato ha i 2 pulsanti SI NO
ho provato ma mi da
Errore di compilazione
Previsto: parametro predefinito
ho provato ma mi da
Errore di compilazione
Previsto: parametro predefinito
beh nn ho visto bene il tuo codice
prova invece di goto end
goto labfine
diabolik1981
03-07-2009, 14:02
quell'errore compare non appena finisco di scriver vbYesNo, evidenziando in rosso la riga del MsgBox
quell'errore compare non appena finisco di scriver vbYesNo, evidenziando in rosso la riga del MsgBox
nn puoi postare il foglio?
diabolik1981
03-07-2009, 14:10
nn puoi postare il foglio?
è gigantesco, però posso postare l'intera macro
Option Explicit
' La subroutine richiamata da input Box Carica il file dei bollettini da stampare
'
Sub QuotaAcqua()
Dim CausOperaz As String
Dim AnaInterno() As String
Dim AnaNomeCondomino() As String
Dim AnaImportoEntrate() As Single
Dim Indice As Integer
Dim IndiceAnag As Integer
Dim IndiceMovim As Integer
Dim Accoda As String
Dim NumeroCondomini As Integer
Dim CausTrim As String
Dim Periodo As String
Sheets("Mov.Boll").Select
If IsEmpty(Cells(2, 1)) Then GoTo Lab050
Accoda = MsgBox(Prompt:="File movimenti Pieno, devi accodare altri movimenti?", Title:="Accoda Movimenti")
If Accoda <> "si" Then GoTo LabFine
Lab050:
CausTrim = InputBox(Prompt:="Indicare il trimestre di riferimento, 8 se è il conguaglio", _
Title:="Indicare il trimestre di riferimento, 8 se è il conguaglio")
Sheets("Q.Acqua").Select
If CausTrim <> "" Then GoTo Lab075
MsgBox "Non hai specificato alcuna causale"
Sheets("Mov.Boll").Select
GoTo LabFine
Lab075:
If CausTrim = 1 Then GoTo Lab100
If CausTrim = 2 Then GoTo Lab100
If CausTrim = 3 Then GoTo Lab100
If CausTrim = 4 Then GoTo Lab100
If CausTrim = 8 Then GoTo Lab100
MsgBox "Hai indicato un valore errato; sono consentiti i trimesti 1,2,3,4 o 8 per conguaglio"
Sheets("Mov.Boll").Select
GoTo Lab050
Lab100:
' Determino il numero dei condomini per il dimensionamento delle tabelle
Periodo = Cells(6, CausTrim + 2)
NumeroCondomini = 0
Do
NumeroCondomini = NumeroCondomini + 1
Loop Until IsEmpty(Cells(NumeroCondomini + 6, 1))
NumeroCondomini = NumeroCondomini - 1
ReDim AnaInterno(1 To NumeroCondomini) As String
ReDim AnaNomeCondomino(1 To NumeroCondomini) As String
ReDim AnaImportoEntrate(1 To NumeroCondomini) As Single
For Indice = 1 To NumeroCondomini
Sheets("Q.Acqua").Select
AnaInterno(Indice) = Cells(Indice + 6, 1)
AnaNomeCondomino(Indice) = Cells(Indice + 6, 2)
AnaImportoEntrate(Indice) = Cells(Indice + 6, CausTrim + 3)
Next
Lab200:
IndiceAnag = Indice
Sheets("Mov.Boll").Select
Indice = 0
IndiceMovim = 0
Lab250:
Do
IndiceMovim = IndiceMovim + 1
Loop Until IsEmpty(Cells(IndiceMovim, 1))
IndiceMovim = IndiceMovim - 2
Lab300:
CausOperaz = "Lettura acqua " + CausTrim + "° trimestre: " + Periodo
If CausTrim = 8 Then CausOperaz = "Conguaglio acqua"
Indice = Indice + 1
If Indice >= IndiceAnag Then GoTo LabFine
Cells(1 + Indice + IndiceMovim, 1) = AnaInterno(Indice)
Cells(1 + Indice + IndiceMovim, 4) = AnaNomeCondomino(Indice)
Cells(1 + Indice + IndiceMovim, 6) = AnaImportoEntrate(Indice)
Cells(1 + Indice + IndiceMovim, 8) = CausOperaz
GoTo Lab300
LabFine:
Cells.EntireColumn.AutoFit
End Sub
Accoda = MsgBox(Prompt:="File movimenti Pieno, devi accodare altri movimenti?", Title:="Accoda Movimenti")
nn devi mettergli nessun prompt sul msgbox....non avendo appunto nessun posto dove INSERIRE qualcosa
non posso chiaramente provarlo, ma così DOVREBBE andare
Option Explicit
' La subroutine richiamata da input Box Carica il file dei bollettini da stampare
'
Sub QuotaAcqua()
Dim CausOperaz As String
Dim AnaInterno() As String
Dim AnaNomeCondomino() As String
Dim AnaImportoEntrate() As Single
Dim Indice As Integer
Dim IndiceAnag As Integer
Dim IndiceMovim As Integer
Dim Accoda As String
Dim NumeroCondomini As Integer
Dim CausTrim As String
Dim Periodo As String
Sheets("Mov.Boll").Select
If IsEmpty(Cells(2, 1)) Then GoTo Lab050
Accoda = MsgBox("continuo?", vbYesNo, "TITOLO")
If Accoda = vbNo Then GoTo LabFine
Lab050:
CausTrim = InputBox(Prompt:="Indicare il trimestre di riferimento, 8 se è il conguaglio", _
Title:="Indicare il trimestre di riferimento, 8 se è il conguaglio")
Sheets("Q.Acqua").Select
If CausTrim <> "" Then GoTo Lab075
MsgBox "Non hai specificato alcuna causale"
Sheets("Mov.Boll").Select
GoTo LabFine
Lab075:
If CausTrim = 1 Then GoTo Lab100
If CausTrim = 2 Then GoTo Lab100
If CausTrim = 3 Then GoTo Lab100
If CausTrim = 4 Then GoTo Lab100
If CausTrim = 8 Then GoTo Lab100
MsgBox "Hai indicato un valore errato; sono consentiti i trimesti 1,2,3,4 o 8 per conguaglio"
Sheets("Mov.Boll").Select
GoTo Lab050
Lab100:
' Determino il numero dei condomini per il dimensionamento delle tabelle
Periodo = Cells(6, CausTrim + 2)
NumeroCondomini = 0
Do
NumeroCondomini = NumeroCondomini + 1
Loop Until IsEmpty(Cells(NumeroCondomini + 6, 1))
NumeroCondomini = NumeroCondomini - 1
ReDim AnaInterno(1 To NumeroCondomini) As String
ReDim AnaNomeCondomino(1 To NumeroCondomini) As String
ReDim AnaImportoEntrate(1 To NumeroCondomini) As Single
For Indice = 1 To NumeroCondomini
Sheets("Q.Acqua").Select
AnaInterno(Indice) = Cells(Indice + 6, 1)
AnaNomeCondomino(Indice) = Cells(Indice + 6, 2)
AnaImportoEntrate(Indice) = Cells(Indice + 6, CausTrim + 3)
Next
Lab200:
IndiceAnag = Indice
Sheets("Mov.Boll").Select
Indice = 0
IndiceMovim = 0
Lab250:
Do
IndiceMovim = IndiceMovim + 1
Loop Until IsEmpty(Cells(IndiceMovim, 1))
IndiceMovim = IndiceMovim - 2
Lab300:
CausOperaz = "Lettura acqua " + CausTrim + "° trimestre: " + Periodo
If CausTrim = 8 Then CausOperaz = "Conguaglio acqua"
Indice = Indice + 1
If Indice >= IndiceAnag Then GoTo LabFine
Cells(1 + Indice + IndiceMovim, 1) = AnaInterno(Indice)
Cells(1 + Indice + IndiceMovim, 4) = AnaNomeCondomino(Indice)
Cells(1 + Indice + IndiceMovim, 6) = AnaImportoEntrate(Indice)
Cells(1 + Indice + IndiceMovim, 8) = CausOperaz
GoTo Lab300
LabFine:
Cells.EntireColumn.AutoFit
End Sub
diabolik1981
03-07-2009, 14:19
Grazie mille, ora funziona. Purtroppo non sono un programmatore, e pur amando molto l'informatica mi mancano le basi e la conoscenza del linguaggio e delle funzioni, ed ovviamente scrivere codice non è una cosa così semplice.
Grazie mille, ora funziona. Purtroppo non sono un programmatore, e pur amando molto l'informatica mi mancano le basi e la conoscenza del linguaggio e delle funzioni, ed ovviamente scrivere codice non è una cosa così semplice.
eheheh no ti preoccupare!!
io sono partito ancora messo peggio...
e sono solo un passettino avanti!!!!
continua così e imparerai!!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.