Condividi:        

Interpretazione codice di una macro

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

Interpretazione codice di una macro

Postdi ikwae » 05/10/18 20:24

Ciao a tutti ... sono ancora a chiedere il vostro aiuto per “leggere” il listato di una macro ... l’aiuto che cerco e di verificare i commenti scritti se sono coerenti e di “completare” le due(2) righe marcate con il segno di minore ... li capisco come listato ma non so attribuire una motivazione ... ringraziando anticipatamente tutti quelli che mi aiuteranno ... 73 ikwae

Codice: Seleziona tutto
Sub Cerca_In_4Colonne_1_Num()
'Cerca in 4 colonne il numero scritto in P3
'e accoda i numeri rimati(3+il valore, quindi 4 numeri)
'della stessa riga, partendo da X2

Dim wArr, oArr(), lastC, I As Long, j As Long
Dim lFor As Integer, kO As Long, kV As Long, kJ As Long
' dimensiona martice e variabili

lastC = Cells(Rows.Count, 3).End(xlUp).Row
'      inizia dalla riga 3 fino in fondo(all'ultima riga utile presente)

wArr = Range("C3:G" & lastC).Value
'            Archivio vero e proprio
'            leggi attribuisci a wArr tutto l'archivio
'            ossia C3:G(end)

lFor = Range("P3").Value
'      attribuisci a lFor il valore di P3(ossia il numero cercato)

j = Application.WorksheetFunction.CountIf(Range("C3:G" & lastC), lFor)
'   attribuiisi a j le volte del numero cercato e trovato in archivio
 
ReDim oArr(1 To j, 1 To 4)
   'dimensiona una doppia matrice
   'la prima, per la j. con tutte le volte del numero trovato
   'la seconda uno a 4 elementi

For I = LBound(wArr) To UBound(wArr)
' attribuisci a I il range dell'archivio(valore minimo e massimo)
       
     For j = 1 To 4
      'cicla i numeri che sono in j a 4 alla volta (1 a 4)
                 
          If wArr(I, j) = lFor Then
          'se il numero trovato è uguale al numero scritto in P3 continua           
           
            kO = kO + 1: kJ = 0 '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<               
               
                For kV = 1 To 5
                'cicla da 1 a 5 e ogni elemento attribuiscilo a kV
                         
                    If kV <> j Then
                    'se l'elemento sopra è diverso da P3 continua
                       
                        kJ = kJ + 1
                        'aggiungi 1 a kJ che è era 0
                       
                        oArr(kO, kJ) = wArr(I, kV) '<<<<<<<<<<<<<<<<<<<<<<<<
                   
                    End If
                Next kV
            Exit For
            End If
    Next j
Next I

'cancella il range specificato
Range("X:AA").ClearContents

'scrivi i dati finali in X2
Range("X2").Resize(UBound(oArr, 1), 4) = oArr

'messaggio di chiusura
MsgBox ("Completato, Sec: " & Format(Timer - mytim, "0.00"))
End Sub
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Sponsor
 

Re: Interpretazione codice di una macro

Postdi Marius44 » 06/10/18 08:52

Ciao
Mai cose facili ...

Questo ridimensionamento mi sembra errato
Codice: Seleziona tutto
ReDim oArr(1 To j, 1 To 4)
Se non ricordo male col ridimensionamento si può intervenire solo nel secondo intervallo.

Se si toglie oArr() come dimensionamento e dopo invece di quanto sopra metti
Dim oArr(1 To j, 1 To 4)

non accetta il valore di j perchè vuole un valore costante.

Almeno, credo :D

Ciao,
Mario
Marius44
Utente Senior
 
Post: 655
Iscritto il: 07/09/15 22:00

Re: Interpretazione codice di una macro

Postdi ikwae » 06/10/18 12:10

Ciao Mario e grazie per la risposta .... Ho trovato questa macro e volevo capire come funziona a livello di codice e solo le due righe marcate non riesco a dare una spiegazione dato che devo fare altre modifiche uguali come struttura ma diversa nella "presa" quindi ne ho scelta una delle tante, non è farina del mio sacco, per capire come procedere... Cordialmente 73 ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Interpretazione codice di una macro

Postdi Anthony47 » 06/10/18 16:31

Non prendertela se non parto dai tuoi commenti, ma riprendo il codice originale (vedi viewtopic.php?t=109577 ) e inserisco qualche commento:
Codice: Seleziona tutto
Sub Cerca4C()
'Dichiarazione delle variabili usate:
Dim wArr, oArr(), lastC, I As Long, J As Long
Dim lFor As Integer, kO As Long, kV As Long, kJ As Long  'lFor:valore da cercare; kO:kontatore Output; kJ kontatore di servizio
'
myTim = Timer     'Memorizza il timer di avvio
lastC = Cells(Rows.Count, 3).End(xlUp).Row      'Cerca l'ultima riga usata in colonna 3
'lastC = 200000                'Questa e' commentata, non fa nulla (serviva durante le prove)
wArr = Range("C3:G" & lastC).Value      'Copia nell'array wARR i dati da "lavorare"
lFor = Range("P3").Value            'Salvo il valore da cercare (in P3)
J = Application.WorksheetFunction.CountIf(Range("C3:G" & lastC), lFor) 'Conta quante volte trovero' il valore cercato...
ReDim oArr(1 To J, 1 To 4)                '...e dimensiono di conseguenza l'array di Output
For I = LBound(wArr) To UBound(wArr)      'Ciclo per esaminare tutto il contenuto di wArr
    For J = 1 To 4                        'Ciclo per esaminare i primi 4 valori della riga (come da richiesta)
        If wArr(I, J) = lFor Then         'Se trova il valore cercato:
            kO = kO + 1: kJ = 0           '..incrementa i contatori kO e pone kJ=0
                For kV = 1 To 5           '..prepara ciclo per scorrere la riga
                    If kV <> J Then       '..e, ignorando la colonna del valore cercato,
                        kJ = kJ + 1       '..(aggiornamento del contatore kJ)
                        oArr(kO, kJ) = wArr(I, kV)   '..ne riporta il contenuto nell'array di Output
                    End If
                Next kV
            Exit For                      'Se ha "trovato" non cerca nelle colonne successive
        End If
    Next J
Next I
'Scansione completata di tutta la tabella; quindi:
Range("X:AA").ClearContents               'Azzera l'area di output...
Range("X2").Resize(UBound(oArr, 1), 4) = oArr   '...e la popola col contenuto dell'array di Output
MsgBox ("Completato, Sec: " & Format(Timer - myTim, "0.00"))      'Messaggino finale col tempo di esecuzione
End Sub

Sia chiaro che le stesse cose si potevan fare senza ricorrere a array di dati; ma l'accesso da vba alla singola cella e' relativamente lenta: si puo' accettare su 10-50 mila celle, ma su 5 milioni diventa proprio pesante.

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

Re: Interpretazione codice di una macro

Postdi ikwae » 06/10/18 18:49

Anthony47 ha scritto:Sia chiaro che le stesse cose si potevan fare senza ricorrere a array di dati; ma l'accesso da vba alla singola cella e' relativamente lenta: si puo' accettare su 10-50 mila celle, ma su 5 milioni diventa proprio pesante.
Ciao


Gentilissimo Anthony ... queste tue affermazioni sono indelebili nel tempo e nell’uso ossia “Sacrosante” di conseguenza non era in discussione l’operato della macro che sia chiaro ... io ho chiesto aiuto per una semplice motivazione dato che nel mio precedente post avevo chiesto un “supplemento” di aiuto

e dato che non pretendo nulla di quello che non mi venga offerto
e dato che se non si ha tempo non si evade la richiesta di aiuto
e dato che ci possa essere una semplice dimenticanza
e dato che tutto quello che vuoi ...
Per questi o altri motivi non ho avuto risposta quindi ho preferito con il “fai da me” (per quanto possibile) e cercato nelle mie “Chicche” di aiuti macro e ho scelto la più “consona” per le modifiche e l’ho messa solocome “lettura” listato(come da richiesta iniziale) ... Quindi ringraziandoti per il tuo tempo che mi hai ancora dedicato e con Profonda Stima e Rispetto 73 ikwae

@ Gentilissimo Mario....
Marius44 ha scritto:Ciao
Mai cose facili ...

Generalmente chiedo aiuto quando non ho più “conoscenze” per poter proseguire quindi la prossima volta ho ancora tre richieste di aiuto da fare
1) ho un foglio pieno di pulsanti “fantasma” che mi rallentano notevolmente i calcoli ...
2) scrivere sul tabellone dei numeri ma prima devono essere confrontati se non presenti
3) velocizzare una macro, già compilata, per mettere una “marcia” più alta ... da 5 a 4 colonne...

vedi quale ti piace la 1 o 2 o la 3 che io provvederò la prossima volta... CHE SIA CHIARO io mi rivolgerò a TUTTE le persone che mi possono dare aiuto e quindi di conseguenza la tua scelta sarà solo come INDICAZIONE di precedenza... Cordialmente 73 ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Interpretazione codice di una macro

Postdi Marius44 » 06/10/18 19:59

Ciao a tutti

meno male che avevo chiuso il mio intervento con " Almeno, credo :D "

Ringrazio Anthony per non aver infierito (chissà cosa stavo pensando). Il tutto m'è venuto fuori per una banalissima distrazione: non avevo inserito alcun numero in P3 !!!!!

Abbiate pazienza (ma tanta ...)

Ciao,
Mario
Marius44
Utente Senior
 
Post: 655
Iscritto il: 07/09/15 22:00

Re: Interpretazione codice di una macro

Postdi Anthony47 » 07/10/18 17:40

Marius ha scritto:Questo ridimensionamento mi sembra errato
Codice: Seleziona tutto
ReDim oArr(1 To j, 1 To 4)

Se non ricordo male col ridimensionamento si può intervenire solo nel secondo intervallo

Quello che avevi scritto non e' "totalmente" inesatto, ma si applica solo al casi di Redim + Preserve: in questo caso e' vero che si puo' modificare solo la seconda dimensione; anzi (per essere piu' precisi) "solo l'ultima dimensione".

La risposta di ikwae mi ha ricordato di una pendenza...
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Interpretazione codice di una macro":


Chi c’è in linea

Visitano il forum: Nessuno e 46 ospiti