Condividi:        

[vab] memorizzare numero di colonne indefinito

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

[vab] memorizzare numero di colonne indefinito

Postdi ramset64 » 07/10/10 12:50

Mi scuso fin da subito se uso terminologia impropria ma le mie conoscenze in materia sono piuttosto limitate…. Io voglio memorizzare intere colonne di un foglio… se la colonna è nota basta fare:

Dim Rdata as Range
Set Rdata= Range(“Data”).value (che è appunto una colonna)
Quindi se io voglio richiamare la riga 18 del range data mi basta scrivere
Y = Rdata(18)

Fin qui nessun problema.

Ora avendo delle colonne di numero indefinito, ovvero variano da foglio a foglio in base al Range(“passo”), io ho pensato di fare cosi:

For I = 1 To Passo
ReDim RNome(I)
Set RNome(I) = Range(Foglio2.Cells(2 I), Foglio2.Cells(1048576 I))
Next I

Cosi ottengo ciò che voglio ovvero memorizzare tutte le colonne del foglio (che ricordo sono di numero variabile)…. Perché effettivamente il codice memorizza tutte le colonne che ho sul foglio, quindi ad esempio Rnome(5) ha memorizzato l’intera colonna E….

Il problema nasce (per me) nel richiamare quei dati ovvero, se ioo volessi avere il dato nella riga 18 del range RNome(5) come lo richiamo?

Pensavo di poter fare cosi:
Y= Rnome(18,5) ma non è cosi….

Grazie, saluti a tutti
ramset64
Utente Senior
 
Post: 396
Iscritto il: 29/10/08 10:41
Località: Torino

Sponsor
 

Re: [vab] memorizzare numero di colonne indefinito

Postdi maxmula » 07/10/10 13:27

Guarda, non sono molto esperto su questo preciso argomento... io farei così:

Codice: Seleziona tutto
Y= Rnome.Item(18, 5).Value


Potrebbe funzionare?

Ciao,
MAx
Avatar utente
maxmula
Utente Senior
 
Post: 965
Iscritto il: 18/08/04 18:28
Località: N44°59'45 E09°00'34

Re: [vab] memorizzare numero di colonne indefinito

Postdi ramset64 » 07/10/10 15:53

Direi di no Max, grazie comunque
ramset64
Utente Senior
 
Post: 396
Iscritto il: 29/10/08 10:41
Località: Torino

Re: [vab] memorizzare numero di colonne indefinito

Postdi ramset64 » 07/10/10 18:13

Credo che nel mio codice vi sia qualche altro errore... in poche parole, partendo dal presupposto che non so quante colonne ho in un determinato foglio, io voglio memorizzare tutte le colonne, quindi:

passo= 8 'supponiamo che il foglio abbia 8 colonne

Io devo creare 8 Matrici quindi qualcosa di simile:

for X=1 to passo
SET Matrice(X) = Range(Foglio2.Cells(1, X), Foglio2.Cells(1048576, X))
netx X

spero sia chiaro, grazie!!!
ramset64
Utente Senior
 
Post: 396
Iscritto il: 29/10/08 10:41
Località: Torino

Re: [vab] memorizzare numero di colonne indefinito

Postdi Anthony47 » 07/10/10 22:55

La maggioranza delle istruzioni con 2003 finiscono in errore, quindi vado a braccia.
Se vuoi mettere in una matrice il contenuto di un numero ignoto di colonne potresti usare qualcosa come

Codice: Seleziona tutto
Dim Rdata 'NB: Deve rimanere una variant
ColIniz = 2 '<< Colonna Iniziale;2=B
ColNum = 3  '<< Numero di Colonne
'
Set URange = Cells(1, ColIniz).Resize(ActiveSheet.UsedRange.Rows.Count, ColNum)
Rdata = URange.Value
'Quindi se io voglio richiamare la riga 18 della seconda colonna (C, nell' esempio)
Y = Rdata(18, 2)

RData avra' la prima dimensione pari al numero di righe usate sul foglio e la seconda dimensione pari al numero di colonne memorizzate.
Tu sai gia' quante colonne hai salvato, puoi sapere quante sono le righe usando qualcosa come
Codice: Seleziona tutto
Dimens1 = UBound(Rdata, 1)
Ovviamente potresti usere Dimens2 = UBound(Rdata, 2) per sapere quante colonne hai salvato.

RData non va definita as Range, ma as Variant o in modo esplicito o per assenza di altra definizione.
URange e' un' area che comincia alla colonna impostata come ColIniz, per una larghezza impostata in ColNum, per una altezza (numero di righe) pari a UsedRange; l' ho fatto per limitare l' occupazione di memoria delle variabili, visto che ogni colonna di 65k celle richiede circa 1 MB di memoria, se le celle sono vuote; insomma 15 MB per ogni colonna di XL2007.

Spero sia di qualche aiuto.

Ciao

PS: ma sei sicuro che mettere i dati in una matrice sia piu' veloce che non lasciarli nel foglio?
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [vab] memorizzare numero di colonne indefinito

Postdi ramset64 » 08/10/10 11:45

Anthony proverò ad utilizzare i tuoi consigli appena possibile, ma nel frattempo vorrei chiederti…. Anziché 1 matrice bi dimensionale, non esiste il modo di creare X matrici unidimensionali?

In merito alla tua domanda, resto perplesso…. Io utilizzo già i fogli in questione e richiamo i dati direttamente dal foglio, tutto funziona bene ma il tutto gira lentamente. In un file analogo, dove però il numero di colonne sono sempre le stesse, ho sostituito il richiamo dei dati direttamente dal foglio memorizzandoli in matrice e la velocità è aumentata notevolmente. Perché pensi che non sia più veloce?
Grazie, saluti
ramset64
Utente Senior
 
Post: 396
Iscritto il: 29/10/08 10:41
Località: Torino

Re: [vab] memorizzare numero di colonne indefinito

Postdi Anthony47 » 09/10/10 02:19

La domanda l' ho fatta perche' mi pare che tu voglia replicare in matrice "tutto" un foglio, non solo i dati piu' richiamati; questo potrebbe portare a tempi di caricamento della matrice e di retrieve dalla matrice non trascurabili.
Ma se confermi che anche cosi', cioe' copia in massa su matrice, e' piu' veloce lo prendo per buono.

C' e' un vantaggio a lavorare su N matrici invece che su una matrice a N dimensioni? Comunque, in linea di massima:
-definire N variabili come Variant (es Dim AArr, BArr, CArr, ...)
-usare poi una variabile alla volta, ma sempre caricandola solo dei dati potenzialmente presenti in colonna (uso di ActiveSheet.UsedRange.Rows.Count per impostare l' area da copiare)
-al momento dell' estrazione dalla matrice, usare UBound per calcolare quante righe ci sono in quella variabile

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

Re: [vab] memorizzare numero di colonne indefinito

Postdi ramset64 » 09/10/10 09:30

Anthony confermo che si ottiene un migiioramento dei tempi di esecuzione con la matrice. Ho già fatto ed è migliorato. Per la spiegazione di N matrici unidimensionali non ho capito sinceramente... il problema è sempre il numero di colonne indefinitito. Non che mi serva adesso perchè ho già risolto con il tuo primo suggerimento, ma tanto per saperlo... grazie, ciao
ramset64
Utente Senior
 
Post: 396
Iscritto il: 29/10/08 10:41
Località: Torino

Re: [vab] memorizzare numero di colonne indefinito

Postdi ricky53 » 09/10/10 10:41

Ciao,
qualche chiarimento, a mio avviso, è necessario:

1. numero di righe e di colonne che utilizzi (stima non valore esatto) ossia 1.000, 10.000, 50.000, ...
2. quali operazioni fai sui dati e sulle celle
3. usi Application.ScreenUpdating = False quando elabori i dati presenti sul foglio ???
4. perchè vorresti utilizzare N matrici unidimensionali al posto di 1 multidimensionale ??? Che differenza ritieni ci sia ???
5. come sono organizzati e dati
6. che versione di excel utilizzi

Per il momento direi che può bastare.

Più informazioni fornisci e più facile sarà poterti aiutare.

Concordo con Anthony ed aggiungo:
non sempre elaborare una matrice è conveniente (in termini di consumo risorse e di prestazioni) dipende dalle situazioni.
Inoltre tu devi caricare la matrice prendendo i dati dal foglio, elaborarli in memoria (nella matrice) e poi copiare i dati dalla matrice di nuovo sul foglio.
Sei sicuro che sia più economico ???

Ciao da Ricky53
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. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: [vab] memorizzare numero di colonne indefinito

Postdi ramset64 » 09/10/10 11:09

Ciao, cercherò di risponderti al meglio…
1. le colonne sono decisamente poche, da una decina a qualche centinaio
2. in pratica i dati che sposto da un foglio all’altro sono gli stessi ma in ordine diverso
3. si, perché da qualche problematica?
4. non voglio usare matrici unidimensionali, come ho già detto ho risolto con il consiglio di Anthony, volevo solo capire se in un caso del genere (numero di colonne che variano) come sia possibile creare queste matrici
5. vedi punto 2
6. excel 2007
A me pare che sia leggermente più veloce con l’utilizzo delle matrici ma potrei anche sbagliare.

Ciao
ramset64
Utente Senior
 
Post: 396
Iscritto il: 29/10/08 10:41
Località: Torino

Re: [vab] memorizzare numero di colonne indefinito

Postdi ricky53 » 09/10/10 22:25

Ciao,
allora:
a. con poche colonne non si riesce a notare la differenza di tempi elaborativi. Prova con 50.000 righe e 100 colonne e facci sapere;
b. quando si elaborano dati che impostano celle con valori è “necessario” utilizzare “Application.ScreenUpdating = False” in modo da non aggiornare i dati a video e risparmiare tempo elaborativo
c. excel 2007 assorbe più risorse del 2003 ma ha più funzionalità, non tutte le funzioni del VBA 2003 sono compatibili con il 2007.

Ciao da Ricky53
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. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: [vab] memorizzare numero di colonne indefinito

Postdi Flash30005 » 10/10/10 00:50

Sto leggendo solo ora questo argomento e devo dire, dalle risposte, che avete compreso meglio di quanto abbia compreso io, soprattutto perché non mi è chiara la disposizione dei dati (come dice Ricky)
ma cerco di dare il mio contributo (sperando non sia una stupidata)
Parto da questo concetto
ramset64 ha scritto:Ora avendo delle colonne di numero indefinito, ovvero variano da foglio a foglio in base al Range(“passo”),

Non avendo capito se passo è termine noto o no mi ricavo le colonne del foglio
con un codice tipo questo
Codice: Seleziona tutto
Col = Range("A1").CurrentRegion.Columns.Count

(A1 è fittizio deve essere una cella che ha colonne unite dalle righe, anche una sola riga)
e mi ricavo il famoso Passo

ramset64 ha scritto:for X=1 to passo
SET Matrice(X) = Range(Foglio2.Cells(1, X), Foglio2.Cells(1048576, X))
netx X


Da questo deduco che conosci le righe delle quali vorresti il valore (per poi farne cosa?)
se hai problemi con la tua matrice io farei una cosa spartana ma funzionante sicuramente

Codice: Seleziona tutto
Dim VettA(1000) as integer ' se numerico o
Dim VettA(1000) as String  ' se stringa

Idem per il dato alla 1048576ª riga
Codice: Seleziona tutto
Dim VettB(1000) as integer ' se numerico o
Dim VettB(1000) as String  ' se stringa

Ora con il cilco For... next assegno il valore ai vettori
Codice: Seleziona tutto
for X=1 to Col '(o Passo)
VettA(X) = Worksheets("Foglio2").Cells(1, X).value
VettB(X) =  Worksheets("Foglio2").cells(1048576, X).value
netx X


Ora puoi inserire i tuti valori (contenuti nei vettori) ovunque

Fai sapere
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: [vab] memorizzare numero di colonne indefinito

Postdi Anthony47 » 10/10/10 21:14

Scusate se provo a fare un riepilogo sulla domanda iniziale di Ramset64:
-e' cosa buona e giusta usare Application.ScreenUpdating = False quando si vuole ridurre i tempi di esecuzione
-se dici che e' piu' veloce ci credo; puoi misurare il tempo di esecuzione di una macro inserendo in testa e in coda rispettivamente queste istruzioni
Codice: Seleziona tutto
[Z1]=Timer
[Z2]=Timer
Presuppone che Z1 e Z2 siano libere; poi si calcolano i secondi di esecuzione come Z2-Z1
-se vuoi lavorare su tante matrici monodimensionali le devi dichiarare; non e' necessario dichiararle tutte all' inizio (come sembra dal mio post precedente) ma devi necessariamente avere un elenco di nomi da dichiarare man mano che ti servono; non puoi cioe' scrivere Dim VARR & I as Variant per definire VARR1, VARR2, etc
-non vedo pero' nessun vantaggio da doverne dichiarare N matrici monodimensionali invece che una
-mai caricare le colonne complete, visto che ognuna chiederebbe 15 MB di ram, quindi una decina=150 MB e "qualche centinaio"=qualche volta * 1.5 GB

Il post di Flash mi lascia perplesso...

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

Re: [vab] memorizzare numero di colonne indefinito

Postdi ramset64 » 10/10/10 22:47

Avete ragione un pò tutti, non ci sta nessun motivo valido per utilizzare tante matrici unidimensionali anzichè una bidimensionali..... ho effettuato una misurazione della velocità del codice vecchio e nuovo ovvero facendola lavorare sul foglio prima e con la matrice dopo.... 16.75 secondi la prima, 8,55 la seconda.... non male direi :-)
grazie
ramset64
Utente Senior
 
Post: 396
Iscritto il: 29/10/08 10:41
Località: Torino


Torna a Applicazioni Office Windows


Topic correlati a "[vab] memorizzare numero di colonne indefinito":


Chi c’è in linea

Visitano il forum: Gianca532011 e 87 ospiti