Condividi:        

Matrice che legge stringhe in colonna

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

Matrice che legge stringhe in colonna

Postdi ikwae » 17/05/23 21:31

Ciao a tutti … Gentilissimo Anthony mi rivolgo a te perché ho modificato una tua macro
e sicuramente, credo, solo te mi puoi aiutare.
Sono riuscito a modificare una tua macro, che legge le stringhe in colonna e funziona al 100%.
Scrive le righe sul foglio alternativamente perché ho commentato una riga di codice quindi
si dovrebbe compattare la matrice e non lo so fare ma va benissimo così.

Richiesta di aiuto
Quindi non ti chiedo né di aggiustarla né tanto meno di modificarla o addirittura una nuova macro
ma ti chiedo, dato che in rete ho scaricato 70 macro e quasi 200 esercizi di array
e non ho trovato nessuna risposta alle mie domande vorrei, se è possibile e se hai del tempo
da dedicarmi per qualche info su come vengono incanalati i dati dopo che sono stati raccolti in memoria.
Con un esempio concreto ho in colonna B (foglio Scuola) migliaia di righe e tot colonne con delle
scritte biglia Verde, biglia Bianca, biglia Rossa quindi carico la mia matrice e, in memoria, ho
tutti i dati recuperati dall’intervallo in esame quindi le domande:

1a) all’uscita della memoria, come posso incanalare, le sole biglie verdi e i dati
(tutta la riga 4 celle) sul foglio di nome “Verde” accodandoli in cella B2?
Questo dato del salvare i dati sul foglio per me è difficoltoso perché c’è di mezzo il resize
che per me è ostico anche se so che l’intervallo di lettura deve essere uguale all’intervallo
di scrittura sul foglio di destinazione.

2b) Come posso, all’uscita della memoria, incanalare i dati dei 3 tipi di biglie colorate e scriverli
su un foglio “Verde” partendo dalla cella B2 e con una distanza fra loro di 5-6-7 colonne?

3c) Come posso contare, all’uscita della memoria, un solo tipo di biglia e, il risultato, scriverlo
in A2 del foglio “Verde”?

Allegati: un unico file con dentro tre fogli:
__Foglio1 con la struttura dei dati e la bandiera che cliccandola partono 4 macro tutte
uguali cambiano solo le stringhe da trovare.
La macro in pochissimi secondi cerca, confronta e scrive i dati nelle colonne assegnate.
C’è da dire che ci sono 4 macro e 60 tipi di stringhe diverse e oltre 800 mila righe che la
macro deve cercare, confrontare, copiare e accodarle nelle colonne assegnate con
“l’aggravante” che scrive una riga si e una riga no eppure impiega una mancata di secondi.
Con la mia macro casareccia impiegava scarso 4 ore quindi le matrici sono utilissime
non tanto per il risparmio di soldi in corrente ma quanto in risparmio di corrente ossia ecologiche.

__Foglio Scuola dove ci sono le righe con i nomi delle biglie colorate per eventuali prove cliccare
la bandiera e verranno scritte in colonna le i nomi Verde Bianca Rossa con relative
celle a dx (4 celle ad ogni riga)

__Foglio Verdi vuoto per eventuale prove.

Sotto la macro che ho usato per tutto il lavoro e clonato per 5 volte.
Ringraziandoti anticipatamente per eventuali risposte cordialmente ikwae

https://we.tl/t-ePCmymQP5z

Codice: Seleziona tutto
Sub Macro_Heads_2Punti_Rete()

Dim WArr, oarr(), oInd As Long, Heads

'Valori da cercare:
'lFor = Array(2, 3, 4, 5, 6)'org
 Heads = Array("01àDi2", "02àDi2", "03àDi2", "04àDi2", "05àDi2", _
               "06àDi2", "07àDi2", "08àDi2", "09àDi2", "10àDi2", _
               "11àDi2", "12àDi2", "13àDi2", "14àDi2", "15àDi2")

'Copia dati in array: ' org
 WArr = Range(Range("B2"), Range("B2").End(xlDown)).Resize(, 4).Value

'oArr stesse dimensioni (max): 'org
 ReDim oarr(1 To UBound(WArr), 1 To UBound(WArr, 2))

'Loop in array: ' org
 For I = 1 To UBound(WArr)
   
     If Not IsError(Application.Match(WArr(I, 1), Heads, False)) Then
                                             
        oInd = oInd + 1 'org
         For J = 1 To UBound(WArr, 2) 'org
           
           'oarr(oInd, J) = WArr(I - WArr(I, 1), J)     'copia riga 1 'org
            oarr(oInd + 1, J) = WArr(I, J)              'copia riga 2 'org
           
           Next J
        oInd = oInd + 1
    End If
Next I
If oInd > 0 Then
   
   Range("G" & Rows.Count).End(xlUp).Offset(1, 0).Resize(oInd, UBound(WArr, 2)) = oarr

End If
End Sub
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Sponsor
 

Re: Matrice che legge stringhe in colonna

Postdi Anthony47 » 18/05/23 18:37

Dunque si tratta di esercizi per fare pratica...

Quesito 1, Copiare su foglio VERDE le sole righe che in colonna D (giusto?) contengono la scritta Verdi, partendo dai dati gia’ copiati in una MatriceA.

In questo caso devi fare un lavoro intermedio, di Filtro
Potresti (a) scorrere il contenuto di colonna 7 della MatriceA e quando trovi Verdi copiare i dati da MatriceA alla prima riga libera del foglio di uscita; MA così facendo avresti annullato il vantaggio di lavorare con la Matrice perché andresti a scrivere cella per cella con tempi lunghi.
Molto meglio invece:
-creare una MatriceA della stessa dimensione di MatriceA
-scorrere MatriceA e copiare le righe giuste in MatriceB
-riempire in blocco l’area di uscita col contenuto di MatriceB
Ad esempio con questa macro:
Codice: Seleziona tutto
Sub DemoVerdi()
Dim MatriceA, MatriceB(), I As Long, J As Long, oInd As Long
Dim LastR As Long
'
Sheets("Scuola").Select                         'Per semplicità seleziono il foglio
LastR = Cells(Rows.Count, "E").End(xlUp).Row    'Mi pare che la colonna E possa servire bene
MatriceA = Range(Range("A1"), Range("J" & LastR)).Value             'Carica MatriceA
'
'Scan alla ricerca di Vedri in colonna 7=G
ReDim MatriceB(1 To UBound(MatriceA), 1 To UBound(MatriceA, 2))     'Dimensiono MatriceB
For I = 1 To UBound(MatriceA)
    If MatriceA(I, 7) = "Verdi" Then
        oInd = oInd + 1                             'aggiorno l'indirizzo di scrittura
        For J = 1 To UBound(MatriceA, 2)            'Loop su tutta MatriceA
            MatriceB(oInd, J) = MatriceA(I, J)      'Compilo MatriceB
        Next J
    End If
Next I
'
'Scrittura del risultato
Sheets("Verde").Range("B2").Resize(UBound(MatriceA), UBound(MatriceA, 2) + 1).ClearContents
If oInd > 0 Then
    Sheets("Verde").Range("B2").Resize(oInd, UBound(MatriceA, 2)).Value = MatriceB
End If
MsgBox ("Completato")
End Sub


La macro copia tutto quel che e’ stato caricato in MatriceA, quindi 10 colonne; se vuoi copiare un numero inferiore di colonne bisogna variare quel For J = 1 To UBound(MatriceA, 2) /Next J

Nota che con questo codice, la variabile oInd contiene il numero di righe copiate su MatriceB, e questo dovrebbe rispondete al tuo “quesito #3”


Quesito 2, Come posso, all’uscita della memoria, incanalare i dati dei 3 tipi di biglie colorate e scriverli
su un foglio “Verde” partendo dalla cella B2 e con una distanza fra loro di 5-6-7 colonne?

Premetto che foglio Scuola per me contiene 10 colonne, quindi nel mio demo distanziero’ Bianchi /Rossi /Verdi di 11 colonne.
In questo caso il lavoro e’ smile al precedente, ma quando si scorre MatriceA invece che “filtrare” si “smazza” e quindi si decide in quale colonna cominciare a scrivere.

Esempio:
Codice: Seleziona tutto
Sub Smazza()
Dim MatriceA, MatriceB(), I As Long, J As Long
Dim LastR As Long
Dim oInd(1 To 3) As Long            'Non 1 ma 3 Indici
Dim Colori, myMatch, oMax As Long
'
Colori = Array("Bianchi", "Rossi", "Verdi")              'Elenco colori
Sheets("Scuola").Select                                  'Per semplicità seleziono il foglio
LastR = Cells(Rows.Count, "E").End(xlUp).Row             'Mi pare che la colonna E possa servire bene
MatriceA = Range(Range("A1"), Range("J" & LastR)).Value  'Carica MatriceA
'
'Scan per smazzare in funzione di colonna 7=G
ReDim MatriceB(1 To UBound(MatriceA), 1 To (UBound(MatriceA, 2) + 1) * 3) 'Dimensiono MatriceB
For I = 1 To UBound(MatriceA)
    myMatch = Application.Match(MatriceA(I, 7), Colori, False)                'Identifico il colore
    If Not IsError(myMatch) Then                                              'Controlla che colore in elenco
        oInd(myMatch) = oInd(myMatch) + 1                                     'aggiorno l'indirizzo di scrittura di "quel" colore
        For J = 1 To UBound(MatriceA, 2)                                      'Loop su tutta MatriceA
            MatriceB(oInd(myMatch), J + 11 * (myMatch - 1)) = MatriceA(I, J)  'Compilo MatriceB
        Next J
    End If
Next I
Sheets("Verde").Range("B2").Resize(UBound(MatriceA), UBound(MatriceB, 2) + 1).ClearContents
oMax = Application.WorksheetFunction.Max(oInd(1), oInd(2), oInd(3))
If oMax > 0 Then
    Sheets("Verde").Range("B2").Resize(oMax, UBound(MatriceB, 2)).Value = MatriceB
End If
MsgBox ("Completato")
End Sub


Ambedue queste macro sono simili a quelle che trovo nel tuo file, non so se sono funzionanti o prove in corso; qui ho aggiunto qualche commento.

Quanto al discorso del “resizing”, la cosa credo sia piu’ semplice di quel che pensi:
-se hai una matrice 10 righe * 8 colonne, quando vai a scaricarla su un foglio devi indicare quante righe e quante colonne devi caricare; in genere io lo faccio definendo la cella di partenza e poi usando Resize per allungare (le righe) e allargare (le colonne) l’area.
Nota che potresti scaricare una matrice 10 * 8 su un’area anche inferiore (alcune righe o alcune colonne della matrice verranno ignorate); se invece provi a popolare una dimensione maggiore della matrice allora ti troveresti sul foglio con righe o colonne popolate con #N/D

Non so se ho risposto (bene o male) ai tuoi dubbi o se invece ne ho creato di nuovi...
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Matrice che legge stringhe in colonna

Postdi ikwae » 19/05/23 00:06

Gentilissimo Anthony sempre molto gentile a rispondermi….
Effettivamente dopo tante ricerche e ore di esercizi posso confermare che quello che hai
scritto è sostanzialmente il frutto dello studio e, di conseguenza, tranne qualche riga di
codice che sicuramente mi verrà chiarita automaticamente dopo aver applicato alla lettera
le tue indicazioni con altrettanti ore di esercizi.

Quindi rispondo alla tua domanda
Non so se ho risposto (bene o male) ai tuoi dubbi o se invece ne ho creato di nuovi...

Sei stato cristallino! E, senza nessuna smentita, posso affermare che quello che scrivi lo scrivi sempre bene.

Aggiungo se hai delle macro tue che non sono nell’archivio di pc-facile (le ho già scaricate tutte)
e che riportano, dopo che i dati sono stati raccolti in memoria, la ricerca di numeri a ritroso sarei
molto interessato.

L’invito vale per tutti coloro che mi possono aiutare.

Altro da dire sono i meritati e dovuti ringraziamenti per la tua indiscussa e apprezzatissima
disponibilità. Cordialmente ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Matrice che legge stringhe in colonna

Postdi Anthony47 » 19/05/23 10:44

Non ci sono macro per tutte le stagioni; quindi e' probabilissimo che abbia realizzato macro che avevano bisogno di trovare l'ultima occorrenza di qualcosa ma difficile che possa servire per immediadamente per "cercare numeri all'indietro"
Ma se (in una nuova discussione) illustri la base dati su cui lavorare e il bisogno da soddisfare e' probabile che si possa adattare il concetto (anzi: scegliere l'approccio migliore e adattarlo)
Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Matrice che legge stringhe in colonna

Postdi ikwae » 19/05/23 14:33

ciao
@Anthony ha scritto
Non ci sono macro per tutte le stagioni…
E io aggiungo altro che stagioni ogni macro è “unica” perché ha le proprie indicazioni.
Per questo motivo cerco solo indicazioni all’uscita della memoria perché c’è il “frutto” della macro.

Problema:(leggere superficialmente l'aiuto è scritto sotto)
Comunque dovrei cercare un numero in colona controllare la cella precedente è il
numero-1 e ancora la precedente se è numero-2 e fintanto trovo numero-x li devo ciclarle
tutte. Per info diciamo che trovo 3 celle (prima cella numero, cella sopra numero -1, cella
sopra numero- 2) quindi ho tre celle di queste tre celle devo controllare le tre celle a dx
che abbiano un numero qualsiasi ma deve essere uguali o almeno minimo 2 celle.
Se sono diverse proseguo il ciclo per trovare altri numeri se almeno due celle (a dx) i
numeri sono uguali devo copiare le due righe (8 celle) e accodarle in B2 del
foglio Pippo… proseguo il ciclo fino in fondo.

Io ho già la macro casareccia che fa il 60% ma anche se riesco a fare il 100% su un totale di
un centinaio di fogli e, ogni foglio, ha 15 “strisce” di tot righe con 4 colonne e, con i tempi
stretti, da martedì a giovedì le matrici sono indispensabili.

Richiesta di aiuto:

Sicuramente NON ti chiedo nulla del genere perché il mal di testa è garantito mi permetto di
chiederti solo naturalmente se hai tempo e voglia, la prima parte ossia trovare in colonna un
numero (scritto in A1) e controllare il/i numero/i precedenti che siano almeno due
(numero, numero-1) e colorarli di giallo… proseguire fino alla fine.

01àDi3 03/01/2023 1 27
01àDi3 25/03/2023 36 29
01àDi3 01/04/2023 47 42
01àDi3 22/04/2023 48 42
01àDi3 07/03/2023 28 43
01àDi3 02/02/2023 14 45

Ricapitolando in cella A1 c’è il numero da cercare (A1=48)
1a) memorizzare in numero scritto in cella A1.
2b) ciclare la colonna D per trovare il numero.
3c) trovato il numero controllare a ritroso quante celle ci sono con numero -1, numero -2 ecc.
4d) trovate le celle colorare di giallo.
5e) continuare a ciclare la colonna D fino alla fine per trovare altri numeri.

In allegato un solo file con due fogli:
__Foglio Scuola uno stralcio di colonne (manomesse per info) dove c’è l’intervallo per la macro.
A fianco la “striscia” originale. Se finita la macro si può fare il copia incolla e rilanciare la macro.
__Foglio Scuola_Fine e quello che si cerca di avere dopo che ha finito la macro di aiuto.
Nota importante: la “Striscia” ha un doppio ordinamento crescente di campionamento ossia la
colonna E (marrone) e la colonna delle estrazioni (blu).
È importante non modificare l’ordinamento altrimenti poi non si riesce a trovare la sestina
da giocare! e vincere i tre punti ….
Sto lavorando massicciamente per i cinque punti ma non mi dispiacerebbe avere anche una
vincita di due 4 alla settimana … Rammento che da qualche parte ho scritto e, adesso
confermo, che al Superenalotto non si vince mai quindi e solo un hobby.
Ringraziandoti mille e mille volte cordialmente ikwae

https://we.tl/t-t3XWsW2JJQ
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Matrice che legge stringhe in colonna

Postdi Anthony47 » 20/05/23 12:36

Hai allegato il file zIntel_CoreX-SeriesCPU_6_Core_or_above_DRAM_QVL_64GB_Fine(4x16)OSSO.odt; e' quello che volevi allegare??
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Matrice che legge stringhe in colonna

Postdi ikwae » 20/05/23 15:14

Gentilissimo Anthony...
Sono molto :oops: non per il file errato, probabilmente l'ho caricato erroneamente quando è saltata la corrente, ma di non aver letto con attenzione il tuo ultimo post dove mi consigli di aprire una nuova discussione. Mi dispiace moltissimo e, alla prima occasione, aprirò un nuovo post di aiuto.
Ancora tante scuse. Cordialmente ikvae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14


Torna a Applicazioni Office Windows


Topic correlati a "Matrice che legge stringhe in colonna":


Chi c’è in linea

Visitano il forum: Nessuno e 51 ospiti