Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Passare un argomento matrice ad una userform

330 views
Skip to first unread message

archimede

unread,
Dec 8, 2011, 4:16:34 PM12/8/11
to
Ciao a Tutti,
eccomi qua con una piccola richiesta di consiglio !
Vorrei caricare una matrice e poi scaricarla su una userform dove è
presente una listbox. Siccome ho un pò di difficoltà ho scritto questo
codice che mi permette di caricare la matrice e di leggerla in
qualsiasi parte del modulo in quanto ho dichiarato la variabile a
livello modulo.

Dim cognomi(5) As String 'variabile dichiarata a livello modulo

Sub carico_matrice()
Dim z As Integer
For z = 1 To 5
cognomi(z) = sheets(1).Cells(z, 1)
Next
End Sub

Sub leggo_matrice()
Dim z As Integer
For z = 0 To 5
MsgBox cognomi(z)
Next
End Sub

Prima domanda: adesso, mantenendo la variabile matrice a livello
modulo, come potrei fare sul verificarsi dell'evento Activate della
userform visualizzare i valori della matrice?
Sub UserForm_Activate()
Dim z As Integer
For z = 0 To 5
MsgBox cognomi(z)
Next
End sub

Seconda domanda:se non volessi dichiarare la variabile a livello
modulo , potrei passarla direttamente alla userform anche se è una
matrice?
Sub UserForm_Activate('forse dovrei scrivere qualcosa qua?')

PS All'inizio ho parlato di caricare una listbox presente su una
userform,infatti è quello che vorrei alla fine riuscire a fare, ma
adesso uso la msgbox per capire se questi valori di matrice riesco a
passarli alla userform e in che modo si deve fare.

Vi ringrazio e a presto , Ciao Ciao







Fabrizio

unread,
Dec 9, 2011, 10:32:57 AM12/9/11
to
Ciao, non so se ho capito
guarda se questo ti puo' essere utile

Private Sub UserForm_Activate()
Dim beta As Object
Dim delta As Range
Dim z As Integer
For z = 1 To 5
Set delta = Sheets("Foglio1").Cells(z, 1)
For Each beta In delta
ListBox1.AddItem beta.Value
Next
Next
End Sub

archimede

unread,
Dec 9, 2011, 11:37:02 AM12/9/11
to
Grazie Fabrizio,
il codice funziona perfettamente ed è quello a cui miravo ! Grazie!

Ho fatto anche questa prova (che funziona) per caricare una matrice e
poi scaricarla nella listbox:

Private Sub UserForm_Activate()
Dim delta(5) As String
Dim z As Integer
For z = 1 To 5
delta(z) = Sheets(1).Cells(z, 1)
UserForm1.ListBox1.AddItem delta(z)
Next
End Sub

Se possibile , vorrei provare a chiederti questa cosa che già avevo
anticipato al punto 2 della domanda postata:
nel codice che mi hai inviato e in quello ultimo che ho appena scritto
noi carichiamo la userform e la listbox sull'evento activate,
supponiamo però che io in precedenza abbia caricato una matrice e
all'attivazione della userform io voglia scaricarla nella sua listbox,
secondo te è possibile?
Penso che bisognerebbe passare la variabile alla userform ma non so ne
come fare e nemmeno se ciò sia possibile. Te lo chiedo solo a titolo
curiosità nel caso un giorno mi venga utile.

ad esempio: la matrice delta la carico prima a livello modulo e adesso
la scarico con activate
Private Sub UserForm_Activate('qui forse devo scrivere la variabile
matrice che passo.....delta.....)
For z = 1 To 5
UserForm1.ListBox1.AddItem delta(z)
Next
End Sub

Ti ringrazio intanto per l'ottimo consiglio ! Ciao ciao

elby

unread,
Dec 9, 2011, 1:34:35 PM12/9/11
to
Non puoi passare argomenti per una procedura di evento che non ne
prevede.
Se la matrice non vuoi venga ricavata da un foglio di lavoro durante
la procedura UserForm_Activate, ma crearla al momento di aprire /
attivare la UserForm
puoi dichiarare pubblica in un modulo una variabile dichiarata array,
riempirla con il codice della procedura che infine sarà la chiamante
la maschera.
Devi inoltre chiarire se vuoi che i valori dei controlli della
UserForm o i valori delle proprietà del modulo di classe della
UserForm devono mantenersi tra una chiamata ed un'altra. In sostanza
bisogna sapere se la UserForm la chiudi oppure semplicemente la
nascondi.


Ciao Elio

archimede

unread,
Dec 9, 2011, 2:23:58 PM12/9/11
to
Ciao Elio,
grazie per il tuo intervento, adesso almeno ho la conferma che questa
operazione non si può fare. Allo stato attuale infatti l'unico modo
che avevo trovato era quello di prelevare sempre il dato della
variabile dal foglio, diversamente sono ko.
Adesso tu mi scrivi la soluzione:
>puoi dichiarare pubblica in un modulo una variabile dichiarata array,
> riempirla con il codice della procedura che infine sarà la chiamante
> la maschera.
ma purtroppo siccome ho già provato a sperimentare questa soluzione e
non ci son riuscito ti vorrei chiedere un piccolo aiutino,con un
semplice esempio :
facciamo che ho una sub che mi carica cognome(1)="rossi"
cognome(2)="verdi" , a livello modulo io devo scrivere
dim cognome(2) as string ??
e poi quando apro la userform con activate come faccio a scaricare la
variabile nome () ?
Ho fatto numerose prove ma non riesco a venirne fuori , il codice che
mi ha inviato Fabrizio è perfetto perchè come dici anche tu o prelevi
i dati dal foglio o crei questa variabile a livello modulo ma qui io
mi inceppo..........al limite quando hai un pochino di tempo ,sulla
base del codice che uso che è quello postato nella domanda iniziale,
dove secondo te commetto errori?
Ti ringrazio nel frattempo. Ciao e Grazie

eliano

unread,
Dec 9, 2011, 4:22:22 PM12/9/11
to
Ciao Archimedes.
Vedo che sei in buone mani (ciao Elio) per una felice soluzione del
problema.
In attesa vedi se ti puo' essere utile il buon vecchio Ennius:
http://www.ennius.altervista.org/ con i suoi articoli,tipo:
http://www.ennius.altervista.org/vba/vba152.php
Saluti
Eliano

elby

unread,
Dec 10, 2011, 9:46:36 AM12/10/11
to
Crea una UserForm lasciando il nome UserForm1
Su di essa 4 controlli
Un pulsante cmdOK
Un Pulsante cmdCancel
Una combobox ComboBox1
Una TextBox TextBox1

Nel modulo della UserForm1
immettre il codice:
Option Explicit
Dim mbOK As Boolean


Private Sub cmdCancel_Click()
mbOK = False
Me.Hide
End Sub

Private Sub cmdOK_Click()
mbOK = True
Me.Hide
End Sub

Public Property Get OK() As Boolean
OK = mbOK
End Property


Private Sub UserForm_Activate()
Dim lngItems As Long
Dim i As Long
On Error Resume Next
lngItems = UBound(Cognome)
If Err.Number <> 0 Then
Exit Sub
End If
On Error GoTo 0
Me.ComboBox1.Clear
For i = 1 To lngItems
Me.ComboBox1.AddItem Cognome(i)
Next i
End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As
Integer)
If CloseMode = vbFormControlMenu Then
cmdOK_Click
Cancel = True
End If
End Sub

In un modulo standard immettere il codice:
Option Explicit
Public Cognome() As String

Sub Test()
Dim frmUserForm1 As UserForm1
Dim lngUBound As Long
On Error Resume Next
lngUBound = UBound(Cognome)
If Err.Number = 9 Then
ReDim Cognome(1 To 3)
Cognome(1) = "rossi"
Cognome(2) = "verdi"
Cognome(3) = "bianchi"
End If
On Error GoTo 0
If Not frmUserForm1 Is Nothing Then
frmUserForm1.Show
Else
Set frmUserForm1 = New UserForm1
frmUserForm1.Show
End If
'Recupera il valore dalla maschera nascosta
MsgBox frmUserForm1.TextBox1.Text
If Len(frmUserForm1.TextBox1.Text) > 0 Then
ReDim Preserve Cognome(1 To UBound(Cognome) + 1)
Cognome(UBound(Cognome)) = frmUserForm1.TextBox1.Text
End If
End Sub

Nella maschera la combobox presenterà i nomi della matrice cognomi e
si potrà aggiungere altri cognomi tramite la textbox

Ciao Elio

archimede

unread,
Dec 10, 2011, 3:18:04 PM12/10/11
to
Ciao Elby,
mi dispiace averti fatto scrivere tutto questo codice , ma nello
stesso tempo mi hai aiutato a risolvere il problema e a capire diverse
cose.
Il tempo che mi hai dedicato ha dato i suoi frutti e c'è nè di codice
da raccogliere!
Infatti io usavo Dim cognomi(5) As String e la dichiaravo a
livello Foglio1 non a livello modulo come dicevo, e non sapevo di
questa Public Cognomi(5) As String che va dichiarata creando un modulo
apposito.
Grazie al tuo codice ho capito come mettere il relazione delle
variabili tra diversi fogli di lavoro o altri oggetti come le
userform, ho già fatto delle prove e son tutte perfettamente
funzionanti.
Altre volte mi son trovato il problema di tenere queste variabile in
comune , ma non sono mai riuscito se non raggirando il problema
(nascondevo i valori in qualche parte del foglio di Excel). La cosa
non mi piaceva e la trovavo anche pericolosa perchè qualcuno ti
potrebbe cancellare un foglio o delle celle e ti inceppa poi tutto il
tuo codice. Così mi son sempre chiesto come poter risolvere questa
cosa, e in questa circostanza non volevo come al solito nascondere il
valore in qualche cella, mi sembrava così strano che si può passare
una variabile tra sub ma non si può tra sub e userform. E poi pensavo,
ma con Visual Basic una persona non ha un foglio di appoggio per cui
deve usare dei contenitori virtuali che ti tengono i valori, ed ecco i
moduli!
Il fatto delle matrici era nato dal fatto che il tutto è partito da un
file su cui sto lavorando che in base al cognome ti mostra se ci sono
più nomi corrispondenti visualizzati su una listbox e poi tu scegli
quello giusto.Per cui avevo bisogno di ricercare dei cognomi in un
elenco, memorizzarli entro una matrice e poi scaricarla nella listbox.
Da qui non sapevo come trasferire la ricerca entro una listbox, potevo
anche stavolta nascondere in un angolo del foglio la ricerca e poi
caricarla con la activate della userform ma ho detto basta.
Così dopo aver cercato nella rete senza risultati ho provato a postare
la domanda........ed ecco la magica risposta di Elby.
Nel codice ho trovato altre cose utili come CloseMode-
vbFormControlMenu che non sapevo e dovrò studiare alcune cose sulle
matrici che non sono ancora molto pratico.
Voglio così Ringraziarti infinitamente per il preziosissimo aiuto che
mi hai dato e il non poco tempo che mi hai dedicato per scrivere tutto
il codice.
Grazie e Ciao Ciao

archimede

unread,
Dec 10, 2011, 3:27:40 PM12/10/11
to
Ciao Eliano,
grazie per il link, ieri sera l'avevo già scaricato e in attesa che
Elio elaborasse il codice magico , avevo incominciato a riguardarmi
tutto il materiale su listbox/combox alla ricerca di qualche
soluzione.
Diciamo che non ci sarei mai riuscito perchè non era un problema
listbox ,additem,listfillrange o che altro, ero completamente fuori
rotta, non usavo il modulo perchè non lo sapevo.
Adesso il problema è stato risolto grazie alle buoni mani di Elio.
Comunque il sito di Ennius è molto utile e le spiegazioni sono ottime.
Grazie anche del tuo consiglio. Ciao Ciao

eliano

unread,
Dec 10, 2011, 5:33:25 PM12/10/11
to
Prego Archi, dovere; e felice che tu abbia risolto il tuo problema.
Vaya con Dios y sus profetas en VBA. pero recuerda que no hay
solo una unica manera de resolver un problema en Excel / VBA.
Hasta la vista y (se non hai visto l'asta) hasta luego y hasta
siempre.
Eliano

archimede

unread,
Dec 10, 2011, 6:48:30 PM12/10/11
to
Eliano Hola, yo soy un discípulo de vba, escuchar sus palabras y lo
del tesoro! gracias!

eliano

unread,
Dec 10, 2011, 8:06:57 PM12/10/11
to
On 11 Dic, 00:48, archimede <archimede...@gmail.com> wrote:
> Eliano Hola, yo soy un discípulo de vba, escuchar sus palabras y lo
> del tesoro! gracias!

A parte il "tesoro" (ma che vor di'!), tu insistiscitici.:-))
Della serie piu' siamo e piu' ci si diverte.
Ciao
Eliano

archimede

unread,
Dec 11, 2011, 6:47:07 PM12/11/11
to
Ciao Eliano,
intendevo , io sono un discepolo di vba excel ed ho ancora molto da
imparare dai miei Maestri, per cui farò tesoro del consiglio che mi
hai dato ". Anche google translator non mi capisce!
Ciao

0 new messages