PDA

View Full Version : Macro VBA Microsoft Excel


ciullo87
22-03-2010, 09:09
Buongiorno a tutti.
Tempo fa o creato una macro per excel per gestire delle consegne in base alle zone di consegna.
Facendo delle prove ho notato che la macro gira abbastanza bene però volevo tutto sommato far controllare il codice in quanto è la prima grande macro che scrivo. Se qualcuno fosse disposto ad a controllare i codici che ho scritto posso inoltrarvi i dettagli.
Vi comunico preventivamente che il ragionamento di funzionamento è abbastanza complesso e non vorrei farvi perdere tempo inutilmente.
Vi ringrazio anticipatamente.

MarcoGG
22-03-2010, 09:30
Dipende, quante righe di codice sono ? :D

ciullo87
22-03-2010, 10:41
Dipende, quante righe di codice sono ? :D

Sono diverse righe di codice...Le devo postare per dare almeno un'idea??

MarcoGG
22-03-2010, 22:54
Sono diverse righe di codice...Le devo postare per dare almeno un'idea??

Da quanto ho capito il tuo codice funziona. Il rischio è di postare un fiume di codice che per chi legge ed è estraneo al tuo progetto non significa molto. Inoltre chi vuole rispondere dovrà costruirsi un WorkBook adatto per poterlo testare... La vedo dura.
Il mio consiglio è di postare solo le parti su cui nutri dubbi, ovviamente corredate da commenti significativi...

ciullo87
23-03-2010, 07:41
Da quanto ho capito il tuo codice funziona. Il rischio è di postare un fiume di codice che per chi legge ed è estraneo al tuo progetto non significa molto. Inoltre chi vuole rispondere dovrà costruirsi un WorkBook adatto per poterlo testare... La vedo dura.
Il mio consiglio è di postare solo le parti su cui nutri dubbi, ovviamente corredate da commenti significativi...

Esatto...
Quelli che ho io sono dei dubbi sull'insieme del codice...Che possa essere scritto in modo migliore e che la procedura possa essere più veloce...Posterò in seguito parte di codice che forse potrebbe essere migliorata...Grazie per il momento dell'attenzione...

ciullo87
23-03-2010, 16:28
Esatto...
Quelli che ho io sono dei dubbi sull'insieme del codice...Che possa essere scritto in modo migliore e che la procedura possa essere più veloce...Posterò in seguito parte di codice che forse potrebbe essere migliorata...Grazie per il momento dell'attenzione...
Vi posto del codice per il caricamento di una list box all'apertura di un form.
Private Sub UserForm_Activate()
Dim CL As Object
Dim frazione As String, nota1 As String, nota2 As String, comune As String, zona As String
Dim n As Integer
ListaZona.Clear
n = 0
ListaZona.ColumnWidths = 90
For Each CL In Worksheets("Zone_list").Range("A2:A14")
ListaZona.AddItem CL.Value
frazione = CL.Offset(0, 1).Value
nota1 = CL.Offset(0, 8).Value
nota2 = CL.Offset(0, 9).Value
comune = CL.Offset(0, 2).Value
zona = CL.Offset(0, 7).Value
ListaZona.List(n, 1) = frazione
ListaZona.List(n, 2) = nota1
ListaZona.List(n, 3) = nota2
ListaZona.List(n, 4) = comune
ListaZona.List(n, 5) = zona
n = n + 1
Next
If ListaZona.ListCount > 0 Then
ListaZona.ListIndex = 0
Else
Note1.Caption = ""
Note2.Caption = ""
LabelComune.Caption = ""
LabelZona.Caption = ""
End If
End Sub


Di seguito invece la valorizzazione della listbox in base al valore inserito in una textbox. Funziona tutto solo che mi va a scatti la valorizzazione della listbox (forse ci sono troppe righe). Si può fare qualcosa?
Private Sub TestoRicerca_Change()
Dim testodacercare As String
Dim CL As Object
Dim a As String, b As String, c As String, d As String, e As String
Dim frazione As String, nota1 As String, nota2 As String, comune As String, zona As String
Dim n As Integer
Dim colonna As Integer
testodacercare = TestoRicerca.Value
If testodacercare = "" Then
Exit Sub
End If

ListaZona.Clear
n = 0
ListaZona.ColumnWidths = 90
For Each CL In Worksheets("Zone").Range("A2:B1320")
If CL.Value Like "*" & testodacercare & "*" Then
colonna = CL.Column
If colonna = 1 Then
ListaZona.AddItem CL.Value
frazione = CL.Offset(0, 1).Value
nota1 = CL.Offset(0, 8).Value
nota2 = CL.Offset(0, 9).Value
comune = CL.Offset(0, 2).Value
zona = CL.Offset(0, 7).Value
End If
If colonna = 2 Then
ListaZona.AddItem CL.Offset(0, -1).Value
frazione = CL.Value
nota1 = CL.Offset(0, 7).Value
nota2 = CL.Offset(0, 8).Value
comune = CL.Offset(0, 1).Value
zona = CL.Offset(0, 6).Value
End If
ListaZona.List(n, 1) = frazione
ListaZona.List(n, 2) = nota1
ListaZona.List(n, 3) = nota2
ListaZona.List(n, 4) = comune
ListaZona.List(n, 5) = zona
n = n + 1
End If
Next
If ListaZona.ListCount > 0 Then
ListaZona.ListIndex = 0
Else
Note1.Caption = ""
Note2.Caption = ""
LabelComune.Caption = ""
LabelZona.Caption = ""
End If
End Sub


Spero sia tutto chiaro (non ho inserito nessun commento perchè mi sembra molto semplice come codice). Grazie mille dell'attenzione.

MarcoGG
24-03-2010, 19:43
Non ho ben chiaro cosa intendi per "va a scatti la valorizzazione della listbox". In ogni caso puoi trarre beneficio nel filling di controlli particolarmente onerosi ( a quanto vedo riempi una ListBox su più colonne con oltre un migliaio di righe... ) sospendendo temporaneamente l'aggiornamentro grafico dell'applicazione e ripristinandolo quando il filling è terminato. Ad es.:

Application.ScreenUpdating = False

'...
'Fill Listbox
'...

Application.ScreenUpdating = True

Per il resto, personalmente non amo l'uso massiccio degli Offset...

ciullo87
25-03-2010, 09:02
Non ho ben chiaro cosa intendi per "va a scatti la valorizzazione della listbox". In ogni caso puoi trarre beneficio nel filling di controlli particolarmente onerosi ( a quanto vedo riempi una ListBox su più colonne con oltre un migliaio di righe... ) sospendendo temporaneamente l'aggiornamentro grafico dell'applicazione e ripristinandolo quando il filling è terminato. Ad es.:

Application.ScreenUpdating = False

'...
'Fill Listbox
'...

Application.ScreenUpdating = True

Per il resto, personalmente non amo l'uso massiccio degli Offset...

Grazie mille...
Ieri ho modificato leggermente il caricamento...
La colonna "A" contiene numeri (CAP delle città) mentre la colonna "B" testo (le frazioni da cercare) così ho usato la funzione IsNumeric e ora ho aggiunto le istruzioni che mi hai detto...
Già meglio...Purtroppo sono tante righe da controllare...
Grazie...

MarcoGG
25-03-2010, 13:31
Grazie mille...
Ieri ho modificato leggermente il caricamento...
La colonna "A" contiene numeri (CAP delle città) mentre la colonna "B" testo (le frazioni da cercare) così ho usato la funzione IsNumeric e ora ho aggiunto le istruzioni che mi hai detto...
Già meglio...Purtroppo sono tante righe da controllare...
Grazie...

Ma non è tutto, ovviamente. Se la ListBox MultiColonna è destinata ad esempio a rappresentare valori presenti su un Foglio in formato tabellare, è superfluo, e inoltre lento, caricare ogni singola Cella facendo uso massiccio di .AddItem e Offset. Si può caricare l'intera tabella dati in modo molto più elegante, facendo uso della proprietà RowSource.
Esempio > tabella dati su Foglio1 "A1:C30" :

Application.ScreenUpdating = False
With ListBox1
.ColumnHeads = True
.BoundColumn = 1
.ColumnCount = 3
.ColumnWidths = "50;100;100"
.RowSource = "Foglio1!A1:C30"
.ListStyle = fmListStyleOption
.ListIndex = 0
End With
Application.ScreenUpdating = True
;)

ciullo87
25-03-2010, 14:31
Ma non è tutto, ovviamente. Se la ListBox MultiColonna è destinata ad esempio a rappresentare valori presenti su un Foglio in formato tabellare, è superfluo, e inoltre lento, caricare ogni singola Cella facendo uso massiccio di .AddItem e Offset. Si può caricare l'intera tabella dati in modo molto più elegante, facendo uso della proprietà RowSource.
Esempio > tabella dati su Foglio1 "A1:C30" :

Application.ScreenUpdating = False
With ListBox1
.ColumnHeads = True
.BoundColumn = 1
.ColumnCount = 3
.ColumnWidths = "50;100;100"
.RowSource = "Foglio1!A1:C30"
.ListStyle = fmListStyleOption
.ListIndex = 0
End With
Application.ScreenUpdating = True
;)
Scusa ma forse non ho specificato che la listbox deve variare in base al valore che viene inserito (in pratica ogni digitazione deve variare il contenuto della listbox).

MarcoGG
25-03-2010, 15:12
Scusa ma forse non ho specificato che la listbox deve variare in base al valore che viene inserito (in pratica ogni digitazione deve variare il contenuto della listbox).

Non era in merito al tuo codice. Solo un consiglio di massima... ;)

ciullo87
25-03-2010, 16:26
Non era in merito al tuo codice. Solo un consiglio di massima... ;)
Scusa non avevo capito...Ti ringrazio del consiglio...Molto gentile...