Condividi:        

array multipli

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

array multipli

Postdi miko » 06/03/13 19:53

buona sera a tutti;
ho alcuni poroblemi relativi agli array che non riesco a risolvere,
nonostante ricerche e "studi" su tale argomento;
ho 10 array chiamiamoli array150, array151, array152, ...., array160;
ciascuno di questi array deve contenere una quantita di numeri non nota in partenza;
credo che si possa affermare che ciascun array è in effetti un vettore monodimensionale.

primo quesito:
A) in fase di dichiarazione come posso scrivere, sostituendo alle ripetute linee del tipo:
Codice: Seleziona tutto
public array150
public array151
public array152
....
public array160

una unica linea del tipo
Codice: Seleziona tutto
public array.(i)
'oppure
public array.name

forse conviene usare un array multidimensionale, che comprenda tutti gli array?

secondo quesito:
B) dovendo usare questi 10 array in una macro trova, devo "ciclare" gli array in modo che
quando effettuo la ricerca del numero 150 devo inserire i risultati nell'array150;
quando eseguo la ricerca del numero 151 devo fare riferimento all'array151 e così via.

terzo quesito:
C) questi 10 array, ed i valori in essi contenuti devono essere disponibili
ad ogni apertura del foglio excel, ovviamente del workbook in cui essi si trovano;
se ad esempio a fine calcolo nell'array150 erano contenuti i valori 3,5,15, ....
chiudendo excel questi devono essere memorizzati in qualche modo,
cosicchè riaprendo excel questi valori sono subito disponibili
senza dover rieseguire lo stesso calcolo.
qualcosa del tipo save setting.
prima di chiudere excel, ho pensato di trasferire il contenuto degli array
in alcune celle, per poi reinserire i valori nei vettori all'apertura di excel.
come si può evitare questo macchinoso procedimento?
ho visto che nel modulo del workbook vi sono gli eventi "BeforeClose"
e "BeforeSave", ma non avendo mai visto macro che usano tali eventi
non so se rispondono al mio caso.
spero nella chiarezza del mio topic.
grazie per i vostri suggerimenti.
saluti
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Sponsor
 

Re: array multipli

Postdi Anthony47 » 06/03/13 22:35

Non c' e' alternativa alla dischiarazione di ognuno degli array, con nome /cognome /genere, nella forma esemplificativa Dim Array150(Dimensione) as Long; aiutera' certamente l' help on line del vba alla voce "Dichiarazione di matrici"
Se non conosci a priori la dimensione della matrice allora userai probabilmente una "matrice dinamica" (descritta nell' help on line di prima) e successivamente l' Istruzione ReDim.
Potresti anche utilizzare una unica matrice bidimensionale, ma questo rende piu' astratta la struttura dei dati, potresti poi trovarti in difficolta' nella gestione del contenuto; suggerisco questa soluzione se l' array a quel punto replica un insieme fisicamente ben identificabile di dati.

Se utilizzi le matrici a scopo di "velocizzare" le operazioni, tieni presente che stranamente non tutte le operazioni fatte in un array sono piu' veloci che se fatte nel foglio di lavoro; ad esempio e' piu' veloce eseguire un "Confronta" in un range che non nell' array.

Quanto al contenuto degli array, all' apertura del file essi sono "per statuto" vuoti; quindi devi crearti un sistema per salvarne il contenuto, ad esempio usando un foglio di appoggio su cui farai il dump degli array con una macro BeforeSave e da cui inizializzerai gli array con una macro di WorkBookOpen.

Questo per cominciare; immagino che vorrai porre altri quesiti su aspetti e situazioni specifiche.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: array multipli

Postdi miko » 07/03/13 22:49

buonasera,
grazie per le esaustive spiegazioni in merito a questo problema.
ho risolto, momentaneamente, anche perchè non trovo una soluzione differente,
introducendo un solo vettore, già ostico per me che non oso avvicinarmi
a quelli multidimensione;
anche se il codice funziona ho tuttavia stupidi problemi che non riesco a risolvere.
posto parte della macro che sto usando per la ricerca:
Codice: Seleziona tutto
option base 1
public VETRow()
Sub trova()
 With Worksheets("Foglio1").Range("B3:G21")
ValN=100
RIGA = 0
  Set C = .Find(ValN, LookIn:=xlFormulas)
  ......
     With ActiveCell.Characters(Start:=Car, Length:=2)
             C.Interior.ColorIndex = 3
             RIGA = RIGA + 1 
             ReDim Preserve VETRow(RIGA)
             VETRow(RIGA) = C.Row  'linea 1 <<<<<<<
         End With
    .....
 For CV = 1 To UBound(VETRow)   'linea 2 <<<<<<<
Sheets("Foglio2").Cells(CV, ValN).Value = VETRow(CV)
Next CV
End Sub

quando la macro trova il valore, in questo caso 100, inserisce i numeri di riga nel vettore VETRow
e con il ciclo for trasferisce tali numeri nel foglio2.
questo risolve i punti del mio post precedente;
non riesco tuttavia ad eliminare il VETRow in modo da avere un codice del tipo:
Codice: Seleziona tutto
....
C.Interior.ColorIndex = 3
             RIGA = RIGA + 1
Sheets("Foglio2").Cells(CV, ValN).Value =C.Row
.....

cioè senza l'uso di matrici, tale che quando trovo il numero 100
inserisco i numeri di riga in colonna A, successivamente quando trovo il numero 101
inserisco i numeri di riga in colonna B, e così via.
Usando il vettore ho comunque il seguente problema:
se non trova alcun numero mi inserisce in foglio2, i numeri di riga della ricerca
precedente;
quando si arriva alla linea 1 nel vettore non c'è nulla, ma poi alla linea 2
UBound(VETRow)=1.
ho provato ad inserire erase VETRow, oppure redim VETRow, oppure un if
ma evidentemente ho sbaglio il punto di inserimento oppure
non è il metodo esatto per superare il problema.
in ogni caso riscontro errore od inefficacia delle soluzioni.
grazie saluti
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: array multipli

Postdi Anthony47 » 07/03/13 23:14

Non conoscendo l' obiettivo del lavoro non sono in grado di comprenderlo per poter dare qualche suggerimento, ne' so valutare se l' approccio e' sintatticamente corretto.
Insomma (come sempre raccomando) prima di descrivere "come" hai provato a farlo dovresti spiegare "che cosa" vorresti fare.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: array multipli

Postdi miko » 08/03/13 00:21

ciao,
hai ragione ho descritto il problema ma ho dimenticato di spiegare
quello che sto cercando di realizzare.
si tratta della solita ricerca di numeri in un range.
nel range B3:G21 di foglio1 cerco il mumero 100;
per ogni riga ci può essere solo un numero 100, come anche per gli altri numeri da cercare;
una volta trovato coloro la sua cella, quest'ultima non è una condizione necessaria;
una volta trovato prendo il numero di riga;
proseguo la ricerca fino alla fine del range prendendo tutti i numeri di riga
in cui si trova il numero 100.
riporto questi numeri nella colonna A del foglio2.
ripeto la ricerca per il numero 101 e riporto i numeri di riga nella colonna B di foglio2.
successivamente cerco il numero 102 e metto i numeri di riga in colonna C di foglio2.
e così via fino a ricercare l'ultimo numero 110.
se non trovo un numero la colonna del foglio2 dedicata alle righe del numero rimane vuota.
come si può notare è una cosa banale ma che mi crea qualche difficoltà.
ciao e grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: array multipli

Postdi Flash30005 » 08/03/13 00:47

Non so se una soluzione "semplicistica" (senza uso di array) ti possa andare bene
Codice: Seleziona tutto
Sub trova2()
Worksheets("Foglio2").Range("A1:K10000").ClearContents
Worksheets("Foglio1").Range("B3:G21").Interior.ColorIndex = xlNone
For ValN = 100 To 110
Worksheets("Foglio2").Cells(1, ValN - 99).Value = ValN
 With Worksheets("Foglio1").Range("B3:G21")
  Set c = .Find(ValN, LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            c.Interior.ColorIndex = 3
            Worksheets("Foglio2").Cells(Rows.Count, ValN - 99).End(xlUp).Offset(1, 0).Value = c.Row
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With
Next ValN
End Sub


Se si, usala! ;)

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: array multipli

Postdi Anthony47 » 08/03/13 02:22

Flash ti ha gia' fatto notare come senza l' uso di alcun array si possa ottenere facilmente un buon risultato.
Immagino pero' che quello che hai pubblicato sia un esempio, ed e' evidente che, qualora l' area da ricercare sia piu' estesa di un' area 6*19, un approccio "array" potrebbe risultare utile se non necessario.
Quindi facciamo un esempio di soluzione array, che corrisponde a questo codice:
Codice: Seleziona tutto
Option Base 1
Sub DemoArr()
Dim VArr As Variant   '<< 1
Dim risult()          '<< 2
Foglio1.Range("K1") = Timer
myArea = "B3:G515"       'Area di ricerca
myIniz = 100
myFin = 110
'
Sheets("Foglio1").Select
'
VArr = Range(myArea).Value  '**1
Uy = UBound(VArr, 1)
Ux = UBound(VArr, 2)
ReDim risult(1 To Uy, 1 To (myFin - myIniz + 1))
For I = myIniz To myFin
    LL = 0
    For j = 1 To Uy
        For K = 1 To Ux
            If VArr(j, K) = I Then
                risult(LL + 1, I - myIniz + 1) = j - 1 + Range(myArea).Cells(1, 1).Row
                LL = LL + 1
                Range(myArea).Cells(1, 1).Offset(j - 1, K - 1).Interior.ColorIndex = 4      '***2
                Exit For
            End If
        Next K
    Next j
Next I
Foglio2.Range("A1").Resize(Uy, myFin - myIniz + 1).Value = risult     '**3
Foglio1.Range("K2") = Timer
End Sub

Essa usa due array bidimensionali, dichiarati nelle righe marcate <<; in realta' la prima e' una "variant" che pero' nell' esempio sara' riempita da un array (vedi **1).
La seconda viene ridimensionata dopo la dichiarazione (vedi Redim), preparandola a ricevere in larghezza tutti i valori tra myIniz e myFin e in altezza max le righe dell' area in cui si effettua la ricerca.
Poi con un ciclo For I -For J -For K /Next K -Next J -Next I si scansiona l' array sorgente e se si trova il valore cercato (I) si compila l' array Risult con il numero riga nella colonna del valore I.
Completata la ricerca si fa il "dump" di Risult in Foglio2 (vedi **3)
Il ricoloramento corrisponde alla riga **2.
Eliminado il ricoloramento, su un intervallo di 6*512 (vedy myArea) la macro con array richiede 0,03-0,04 secs; la macro con Find circa 0,8-0,9 sec (sempre senza ricoloramento). E' evidente cioe' che l' approccio tradizionale e' abbastanza semplice da impostare, ma potrebbe diventare esigente (in quanto a tempo di esecuzione) su grandi quantita' di dati; un approccio array ha una sua complicazione concettuale, che allunga i tempi di stesura e soprattutto di collaudo, ma potrebbe risultare utile all' aumentare della base dati da elaborare.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: array multipli

Postdi miko » 08/03/13 13:29

salve,
non so come esprimervi la mia gratitudine;
le macro sono eccezionali;
ho studiato tanto tempo array e soluzioni per risultati insoddisfacenti,
mentre voi esperti ne avete realizzate 2, semplici e veloci.
dalle mie parti si dice "vai dal patuto e non dal saputo" ;)
ho studiato la macro di flash, più semplice da comprendere, quella di anthony,
anche se ho compreso il concetto, grazie alle spiegazioni successive,
la sto studiando step by step e per ora non ho richieste in merito.
per qunto riguarda la macro di flash ho notato che:

A) i numeri delle righe nel foglio2 non vengono disposti in ordine crescente,
in quanto la macro trova una prima cella ad esempio in b20 e poi risale alla c5.
ho pensato di registrare una macro ordina e di inserire nella macro di flash una call;
ma mi chiedevo se si possono inserire direttamente nella macro di flash le linee necessarie all'ordinamento.

B) per eventuali usi-adattamente futuri della macro come o cosa doveri modificare per ricercare numeri del tipo
1,2,3,4,5....?
testando la macro per tale ricerca ho notato che trova ad esempio il numero 1 anche quando questo e parte
di un altro numero, ad esempio 100, 101, 108, 10, 11, 201, ....
sono riuscito a modificare solo le seguenti linee:
Codice: Seleziona tutto
Worksheets("Foglio2").Cells(1, ValN - 99).Value = ValN
Worksheets("Foglio2").Cells(Rows.Count, ValN - 99).End(xlUp).Offset(1, 0).Value = c.Row

ma per il resto non ottengo risultati.
grazie ad entrambi
cordiali saluti
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: array multipli

Postdi Flash30005 » 08/03/13 16:25

Il fatto dell'ordinamento dipende dalla funzione Find che, in un range di righe e colonne cerca verticalmente (sulla prima colonna) per poi passare alla seconda colonna.
Inoltre la funzione Find deve essere corredata con "LookAt:=xlWhole"
(per confrontare intero contenuto della cella altrimenti trova parti di valori-cella: trova 1 nella cella con 108)

A questo punto rendiamo la macro ancora più semplice (senza la funzione find) e avrai sicuramente l'ordinamento crescente ;)
Codice: Seleziona tutto
Sub trova3()
Worksheets("Foglio2").Range("A1:K10000").ClearContents
Worksheets("Foglio1").Range("B3:G21").Interior.ColorIndex = xlNone
For ValN = 100 To 110
Worksheets("Foglio2").Cells(1, ValN - 99).Value = ValN
For RR = 3 To 21
    For CC = 2 To 7
        If Cells(RR, CC).Value = ValN Then
            Cells(RR, CC).Interior.ColorIndex = 3
            Worksheets("Foglio2").Cells(Rows.Count, ValN - 99).End(xlUp).Offset(1, 0).Value = RR
        End If
Next CC
Next RR
Next ValN
End Sub



Tale soluzione risolve anche il punto B )
Tieni conto che se vorrai iniziare scrivere sulla prima colonna del foglio2 dovrai sottrarre a ValN un numero n fino ad ottenere 1
quindi se ricerchi i numeri 1, 2, 3, 4
non dovrai sottrarre nulla

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: array multipli

Postdi Anthony47 » 09/03/13 00:28

Vedi la macro di Flash sopra.
Volevo precisare che la Sub DemoArr e' gia' impostata per cercare in aree diverse da B3:G21 (variabile myArea), come pure i numeri da ricercare sono specificati in myIniz (inizio) e myFin (fine); non ci sono altri aggiustamenti da fare.
S.e.&o.
Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: array multipli

Postdi miko » 09/03/13 11:54

buongiorno,
grazie per le macro e le relative spiegazioni e precisazioni.
per il momento non ho altre richieste in merito a questo topic,
salvo poi in seguito qualche modifica per eventuali e diverse applicazioni future.
grazie ancora e buon sabato.
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44


Torna a Applicazioni Office Windows


Topic correlati a "array multipli":


Chi c’è in linea

Visitano il forum: Ricky0185 e 48 ospiti