Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Caricare Array

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Caricare Array

Postdi PcBase » 15/05/12 22:59

Ciao
Ho scritto questo codice che in apertura di un form memorizza alcuni valori, e vorrei modificarlo utilizzando un solo array a più dimensioni.
Questo il codice testato inserito in Userform

Codice: Seleziona tutto
Option Explicit

Public arrX As Variant
Public arrY As Variant
Public arrZ As Variant

Private Sub UserForm_Initialize()
    Dim ctl As Control
    Dim arrA() As String
    Dim arrB() As String
    Dim arrC() As String
    Dim Cnt As Long
    Cnt = 1
    For Each ctl In Me.Controls
        If TypeOf ctl Is MSForms.Label Then
            Cnt = Cnt + 1
            ReDim Preserve arrA(1 To Cnt)
            ReDim Preserve arrB(1 To Cnt)
            ReDim Preserve arrC(1 To Cnt)
            arrA(Cnt) = ctl.Name
            arrB(Cnt) = ctl.Left
            arrC(Cnt) = ctl.Top
        End If
    Next ctl
    arrX = arrA
    arrY = arrB
    arrZ = arrC
End Sub


Versione Excel 2003
Windows xp + Office 2003 Ita
Windows8 Office 2013
PcBase
Utente Senior
 
Post: 129
Iscritto il: 24/02/11 23:26

Sponsor
 

Re: Caricare Array

Postdi Anthony47 » 15/05/12 23:48

Per quello che ho capito vuoi tenere tutti i dati in un unico array da 3*x.
Premetto che io non userei il Redim con Preserve, abbastanza oneroso come cpu, ma dimensionerei una matrice da 10 /100 o 1000 (un valore ampiamente sufficiente per gestire le form che il file contiene; spero che non siano centinaia...)
Cio' detto probabilmente dovresti sostituire il tuo blocco da Dim arrA() As String a Next ctl (compresi) con qualcosa come
Codice: Seleziona tutto
Dim MArr() as string
Redim MArr(1 to 3,1 to 1)    'Nota *
Cnt=1
    For Each ctl In Me.Controls
        If TypeOf ctl Is MSForms.Label Then
            Cnt = Cnt + 1
            ReDim Preserve MArr(1 to 3, 1 To Cnt)    'Nota °
            MArr(1,Cnt) = ctl.Name
            MArr(2,Cnt) = ctl.Left
            MArr(3,Cnt) = ctl.Top
        End If
    Next ctl

Nota*: Se invece avessi optato per la scelta di un array di dimensione iniziale non pari a 1 allora avresti usato
Codice: Seleziona tutto
Redim MArr(1 to 3,1 to 100)
. . .
If Cnt>=Ubound(MArr,2) then Redim Preserve MArr(1 to 3,1 to Ubound(MArr,2)+100)  'Allunga di un blocco di 100 posizioni


Warning:
-non ho fatto collaudo, procedi con cautela...
-ricorda che Redim puo' lavorare solo sull' ultima dimensione

Spero che trovi lo spunto utile.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Caricare Array

Postdi ricky53 » 15/05/12 23:57

Ciao,
avevo iniziato a scrivere qualcosa ma Anthony ti ha già risposto ...
però visto che avevo iniziato ho finito e te lo propongo.
Ho fatto la stessa considerazione di Anthony sul "Preserve" ed ho dimensionato la matrice in base al numero dei controlli presenti nel userform.
Il codice è molto simile a quanto ti ha scritto Anthony.
Ho utilizzato "Option Base 1" ed ho inizializzato a zero "Cnt" per avere il primo elemento della matrice con dei dati.
Ho utilizzato una matrice a tre colonne la prima contiene il nome del controllo, la seconda "left" e la terza "Top".

Non capisco la necessità della matrice "arrX" che carichi con la "arrA"
Il resto lo vedrai provandolo ...
Eccolo
Codice: Seleziona tutto
Option Explicit
Option Base 1

Public arrX As Variant

Private Sub UserForm_Initialize()
    Dim ctl As Control
    Dim Cnt As Integer
    Dim arrA() As String
    Cnt = Me.Controls.Count
    ReDim arrA(Cnt, 3)
    Cnt = 0
    For Each ctl In Me.Controls
        If TypeOf ctl Is MSForms.Label Then
            Cnt = Cnt + 1
            arrA(Cnt, 1) = ctl.Name
            arrA(Cnt, 2) = ctl.Left
            arrA(Cnt, 3) = ctl.Top
        End If
    Next ctl
    arrX = arrA
End Sub
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Caricare Array

Postdi PcBase » 16/05/12 11:45

Ciao

Non capisco la necessità della matrice "arrX" che carichi con la "arrA"


Ho provato il tuo codice ricky tutto Ok (ci sono solo 8 label presenti), ma senza non funziona proprio.
Causa apparente non sono disponibili i dati di arrA
Codice: Seleziona tutto
For ciclo = 1 To UBound(arrA)

Qui si ferma la macro e mostra "Tipo non corrispondente"
Windows xp + Office 2003 Ita
Windows8 Office 2013
PcBase
Utente Senior
 
Post: 129
Iscritto il: 24/02/11 23:26

Re: Caricare Array

Postdi ricky53 » 16/05/12 11:56

Ciao,
quell'istruzione non è la mia ...
Non mi è chiaro cosa NON funziona e cosa, invece, funziona.

Puoi inviare il codice che hai utilizzato e ... ci lavoriamo su !
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Caricare Array

Postdi PcBase » 16/05/12 20:37

Ciao

Ricky mi riferisco sempre a:
Non capisco la necessità della matrice "arrX" che carichi con la "arrA"

Allego file come esempio dove riscontro il problema

http://www.sendspace.com/file/0x4x2j

Qualsiasi aiuto è ben gradito
Windows xp + Office 2003 Ita
Windows8 Office 2013
PcBase
Utente Senior
 
Post: 129
Iscritto il: 24/02/11 23:26

Re: Caricare Array

Postdi ricky53 » 16/05/12 21:29

Ciao
avevi definito due volte "arrA" una public ed un'altra nella macro "UserForm_Initialize".
Ecco la correzione.
Inoltre non serve più la "arrX"

Codice: Seleziona tutto
Private Sub UserForm_Initialize()
    Dim ctl As Control
    Dim Cnt As Integer
' Va tolta
'    Dim arrA() As String
'
    Cnt = Me.Controls.Count
    ReDim arrA(Cnt, 3)
    Cnt = 0
    For Each ctl In Me.Controls
        If TypeOf ctl Is MSForms.Label Then
            Cnt = Cnt + 1
            arrA(Cnt, 1) = ctl.Name
            arrA(Cnt, 2) = ctl.Left
            arrA(Cnt, 3) = ctl.Top
        End If
    Next ctl
' Anche questa va tolta
'    arrX = arrA
End Sub
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Caricare Array

Postdi PcBase » 16/05/12 22:45

Ciao

Grazie Ricky53, ora funziona correttamente.
Windows xp + Office 2003 Ita
Windows8 Office 2013
PcBase
Utente Senior
 
Post: 129
Iscritto il: 24/02/11 23:26

Re: Caricare Array

Postdi ricky53 » 16/05/12 23:01

Bene.
Alla prossima e ... buona prosecuzione.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia


Torna a Applicazioni Office Windows


Topic correlati a "Caricare Array":


Chi c’è in linea

Visitano il forum: Nessuno e 21 ospiti