Condividi:        

Confrontare un range di valori su diverse colonne

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

Confrontare un range di valori su diverse colonne

Postdi romant » 25/02/19 14:18

Salve a tutti,
torno a disturbarvi di nuovo perchè ho bisogno del vostro aiuto per realizzare una macro che mi confronti diverse colonne con migliaia di righe del foglio 2 con diverse colonne con decine di migliaia di righe del foglio 1. ho cercato di applicare delle macro trovate nel web, ma che confrontavano una colonna con un'altra colonna e poi adattarla con una variabile tipo:
X=Range("a1").end(xldown).row
y = Range("a1").End(xlToRight).Column
Range(cells(1,1),cells(x,y)).select
per evidenziare tutto il range che mi serve.
In pratica ho delle combinazioni nel foglio 1 che va dalla colonna A alla colonna E per decine di migliaia di righe e che dovrei confrontare con delle altre combinazioni presenti nel foglio 2 sempre dalla colonna A alla colonna E con righe variabili. Ma tutti i tentativi sono stati vani... Per cui non mi è rimasto altro che richiedere il vostro aiuto ringranziandovi in anticipo.
romant
Utente Junior
 
Post: 23
Iscritto il: 29/01/19 21:35

Sponsor
 

Re: Confrontare un range di valori su diverse colonne

Postdi Anthony47 » 25/02/19 16:14

Ma devi confrontare colonna per colonna, o intero record (tutte le colonne), o che cosa?
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Confrontare un range di valori su diverse colonne

Postdi romant » 25/02/19 21:37

Il confronto deve essere fatto riga per riga.. La prima riga del foglio2 con tutte le righe del foglio 1, per poi passare alla seconda riga del foglio 2 con tutte le righe del foglio 1. quando trova 3, 4 e 5 numeri di una delle righe mi copia l'intera riga nel foglio 3. Se mi dite come fare per postare il file di prova lo posto in modo che sia più chiaro
romant
Utente Junior
 
Post: 23
Iscritto il: 29/01/19 21:35

Re: Confrontare un range di valori su diverse colonne

Postdi Anthony47 » 26/02/19 01:31

Perdona, non capisco la storia dei 3, 4 e 5 numeri... Puoi allegare un file di test contenente sia una quantita' significativa di dati di Foglio1 che Foglio2; poi su questi dati spieghi che cosa va controllato e che cosa va fatto?

Per le istruzioni su come allegare un file:
viewtopic.php?f=26&t=103893&p=605487#p605487
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Confrontare un range di valori su diverse colonne

Postdi romant » 26/02/19 15:26

esempio: foglio 2 riga 1 7 14 18 19 40 ---- foglio 1 riga 100 8 14 18 34 40 confrontando i due elenchi si nota che ci sono 3 numeri che sono doppioni questa riga intera va estratta e copiata nel foglio 3. Così dovrà essere se ci sono 4 e o tutti i numeri uguali
Allego il file ridotto perché, ripeto il confronto può essere fatto anche con decine di migliaia di righe… spero di essere stato chiaro
http://www.filedropper.com/provaconfronta1_1
romant
Utente Junior
 
Post: 23
Iscritto il: 29/01/19 21:35

Re: Confrontare un range di valori su diverse colonne

Postdi Anthony47 » 27/02/19 01:41

Mah... quando vedo questi lavori di fine statistica applicata a giochi a estrazione mi viene sempre voglia di passare la palla...
Partendo da un precedente sviluppo ho realizzato questo codice:
Codice: Seleziona tutto
Dim F2Arr, F1Arr, RArr(), IndArr()


Sub Checc()
Dim mCnt As Long, iMax As Long
Dim LastA As Long, I As Long, I2 As Long, J As Long, J2 As Long
Dim rInd As Long, miVal As Long
'
miVal = 3
'
LastA = Sheets("Foglio2").Cells(Rows.Count, 1).End(xlUp).Row
F2Arr = Sheets("Foglio2").Range("A1").Resize(LastA, 5).Value
iMax = Application.WorksheetFunction.Max(F2Arr)
ReDim IndArr(1 To iMax)
For I = 2 To UBound(F2Arr)
    For J = 1 To 5
        IndArr(F2Arr(I, J)) = IndArr(F2Arr(I, J)) & "-" & I   'Format(I, "00000")
    Next J
Next I


LastA = Sheets("Foglio1").Cells(Rows.Count, 1).End(xlUp).Row
F1Arr = Sheets("Foglio1").Range("A1").Resize(LastA, 5).Value
ReDim RArr(1 To UBound(F1Arr), 1 To 6)
For I = 1 To UBound(F1Arr)
    If CkMinVal(I, miVal) Then
        rInd = rInd + 1
        RArr(rInd, 1) = I
        For J = 1 To 5
            RArr(rInd, J + 1) = F1Arr(I, J)
        Next J
    End If
Next I
Sheets("Foglio3").Range("A1").Resize(UBound(RArr), 6) = RArr
End Sub


Function CkMinVal(ByVal II As Long, ByVal minCk As Long) As Boolean
Dim MSA(1 To 5), lCnt As Long, lInd As String
Dim J As Long, K As Long
'
For J = 1 To 5
    MSA(J) = Split(" -" & IndArr(F1Arr(II, J)), "-", , vbTextCompare)
Next J
For J = 1 To 4
aaa = UBound(MSA(J + 1))

    For I = 1 To UBound(MSA(J))
    lInd = MSA(J)(I)
    If Len(lInd) > 0 Then
        lCnt = 0
        For K = J + 1 To 5
                If Not IsError(Application.Match(lInd, MSA(K), False)) Then
                    lCnt = lCnt + 1
                End If
                If lCnt >= minCk Then
                    CkMinVal = True
                    Exit Function
                End If
        Next K
    End If
    Next I
Next J
End Function
Va messo rigorosamente tutto su un Modulo standard del vba inizialmente vuoto.
Poi si manda in esecuzione la Sub Checc

L'elenco su Foglio3 sara' su 6 colonne: la prima indica il rigo di Foglio1 da cui la riga e' prelevata, le altre 5 sono i valori delle estrazioni.

Prova e fai sapere...
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Confrontare un range di valori su diverse colonne

Postdi romant » 28/02/19 23:12

Buonasera, Anthony, ho provato la macro mi da: ------ errore di compilazione Sub o function non definita -------
Function CkMinVal(ByVal II As Long, ByVal minCk As Long) As Boolean -------- questa riga la colora di giallo
MSA(J) = Split(" -" & IndArr (F1Arr(II, J)), "-", , vbTextCompare)
(F1Arr ---- questo lo colora di blu --------
romant
Utente Junior
 
Post: 23
Iscritto il: 29/01/19 21:35

Re: Confrontare un range di valori su diverse colonne

Postdi Anthony47 » 01/03/19 19:37

Secondo me non hai copiato tutte le istruzioni che ti ho dato, tutte nello stesso modulo inizialmente vuoto.

Se invece sei stato diligente nel seguire le istruzioni, allora allega il file in cui il comportamento e' anomalo e vedremo di trovare la gabola.

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

Re: Confrontare un range di valori su diverse colonne

Postdi Statix » 01/03/19 21:04

Ciao Anthony
anche io ho riscontrato questo errore.


Immagine
Statix
Windows 10,
Office 2013,
Statix
Utente Senior
 
Post: 1287
Iscritto il: 12/05/06 21:55
Località: Provincia di Caserta

Re: Confrontare un range di valori su diverse colonne

Postdi Anthony47 » 02/03/19 01:20

Anche per te faccio la stessa diagnosi e la stessa proposta:
Nella risposta a Romant, Anthony ha scritto:Secondo me non hai copiato tutte le istruzioni che ti ho dato, tutte nello stesso modulo inizialmente vuoto.

Se invece sei stato diligente nel seguire le istruzioni, allora allega il file in cui il comportamento e' anomalo e vedremo di trovare la gabola.


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

Re: Confrontare un range di valori su diverse colonne

Postdi Statix » 03/03/19 01:16

Ciao a tutti,
riallego il file per controllo errore,

http://www.filedropper.com/provaconfronta1_2
Statix
Windows 10,
Office 2013,
Statix
Utente Senior
 
Post: 1287
Iscritto il: 12/05/06 21:55
Località: Provincia di Caserta

Re: Confrontare un range di valori su diverse colonne

Postdi Anthony47 » 03/03/19 19:04

Hai ragione, Statix, a dire che va in errore ("indice non incluso nell'intervallo"), ma romant parlava di " errore di compilazione Sub o function non definita"...
La precedente Sub Checc calcola in modo insufficiente il valore iMax; per rimediare, anticipo la compilazione di F1Arr e calcolo iMax come max tra F1Arr e F2Arr.
La nuova Checc diventa:
Codice: Seleziona tutto
Sub Checc1()
Dim mCnt As Long, iMax As Long
Dim LastA As Long, I As Long, I2 As Long, J As Long, J2 As Long
Dim rInd As Long, miVal As Long
'
miVal = 3
'
LastA = Sheets("Foglio2").Cells(Rows.Count, 1).End(xlUp).Row
F2Arr = Sheets("Foglio2").Range("A1").Resize(LastA, 5).Value
iMax = Application.WorksheetFunction.Max(F2Arr)
'ANTICIPATO CALCOLO F1Arr:
LastA = Sheets("Foglio1").Cells(Rows.Count, 1).End(xlUp).Row
F1Arr = Sheets("Foglio1").Range("A1").Resize(LastA, 5).Value
If iMax < Application.WorksheetFunction.Max(F1Arr) Then        'VARIATO CALCOLO iMax
    iMax = Application.WorksheetFunction.Max(F1Arr)
End If
ReDim IndArr(1 To iMax)
For I = 2 To UBound(F2Arr)
    For J = 1 To 5
        IndArr(F2Arr(I, J)) = IndArr(F2Arr(I, J)) & "-" & I   'Format(I, "00000")
    Next J
Next I

'LastA = Sheets("Foglio1").Cells(Rows.Count, 1).End(xlUp).Row     'VANNO "ANTICIPATE"
'F1Arr = Sheets("Foglio1").Range("A1").Resize(LastA, 5).Value
ReDim RArr(1 To UBound(F1Arr), 1 To 6)
For I = 1 To UBound(F1Arr)
    If CkMinVal(I, miVal) Then
        rInd = rInd + 1
        RArr(rInd, 1) = I
        For J = 1 To 5
            RArr(rInd, J + 1) = F1Arr(I, J)
        Next J
    End If
Next I
Sheets("Foglio3").Range("A1").Resize(UBound(RArr), 6) = RArr
End Sub

Ho lasciato, ma "commentate", le due istruzioni che ho spostato (anticipandole)

La Sub Checc1 sostituisce la precedente Sub Checc; tutto il resto rimane invariato.

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

Re: Confrontare un range di valori su diverse colonne

Postdi romant » 04/03/19 21:15

Scusate tutti sono rientrato da poco… Provo Il file e ti faccio sapere...
romant
Utente Junior
 
Post: 23
Iscritto il: 29/01/19 21:35

Re: Confrontare un range di valori su diverse colonne

Postdi romant » 04/03/19 21:29

Mi da ancora errore…. ti allego anche tutto il file

[img]Function CkMinVal(ByVal II As Long, ByVal minCk As Long) As Boolean
Dim MSA(1 To 5), lCnt As Long, lInd As String
Dim J As Long, k As Long
'
For J = 1 To 5
MSA(J) = Split(" -" & IndArr(F1Arr(II, J)), "-", , vbTextCompare)
Next J
For J = 1 To 4
aaa = UBound(MSA(J + 1))

For I = 1 To UBound(MSA(J))
lInd = MSA(J)(I)
If Len(lInd) > 0 Then
lCnt = 0
For k = J + 1 To 5[/img]

http://www.filedropper.com/provaconfrontaanthony
romant
Utente Junior
 
Post: 23
Iscritto il: 29/01/19 21:35

Re: Confrontare un range di valori su diverse colonne

Postdi Anthony47 » 04/03/19 23:20

Qualche giorno fa, Anthony ha scritto:Secondo me non hai copiato tutte le istruzioni che ti ho dato, tutte nello stesso modulo inizialmente vuoto.

Se invece sei stato diligente nel seguire le istruzioni, allora allega il file in cui il comportamento e' anomalo e vedremo di trovare la gabola.
Come volevasi dimostrare...
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Confrontare un range di valori su diverse colonne

Postdi romant » 05/03/19 13:23

Scusa Anthony, cosa significa " come volevasi dimostrare " ? Se ho sbagliato dimmi dove... credo di aver messo tutte le istruzioni nel modulo 1, cosa altro dovevo fare?

http://www.filedropper.com/provaconfrontaanthony_1
romant
Utente Junior
 
Post: 23
Iscritto il: 29/01/19 21:35

Re: Confrontare un range di valori su diverse colonne

Postdi Anthony47 » 05/03/19 16:57

romant ha scritto:Scusa Anthony, cosa significa " come volevasi dimostrare " ? Se ho sbagliato dimmi dove... credo di aver messo tutte le istruzioni nel modulo 1, cosa altro dovevo fare?

http://www.filedropper.com/provaconfrontaanthony_1

Allora, io accetto di aiutare e voi accettate di fare la vostra parte, in piena collaborazione (bidirezionale).

Riscrivo il tuo messaggio come avrei voluto leggerlo:
Anthony fa finta che romant ha scritto:Hai ragione Anthony! Avevo tralasciare di copiare la prima riga del tuo codice.
Adesso pero' l'ho inserito, credo correttamente, ma mi compare un nuovo e diverso errore: Run time error 9, Indice non incluso nell'intervallo. La riga in errore e' la stessa che precedentemente mi veniva evidenziata in blu quando mi segnalava "Errore di compilazione, Sub o Function non definita", e cioe':
Codice: Seleziona tutto
MSA(J) = Split(" -" & IndArr(F1Arr(II, J)), "-", , vbTextCompare)


Che cosa ho sbagliato??
(il congiuntivo non lo posso inserire, perdonate)

A questo ipotetico messaggio io rispondo:
C'e' una differenza, relativamente a Foglio1, tra il layout dei dati allegato inizialmente e quello che usi oggi: prima cominciavano in riga 1, ora li fai cominciare in riga 2.

Se i dati cominciano in riga 2, allora devi modificare, nel codice della Sub Checc1, l'istruzione For I = 1 To UBound(F1Arr) in
Codice: Seleziona tutto
For I = 2 To UBound(F1Arr)


Prova con questa modifica e fai sapere...
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Confrontare un range di valori su diverse colonne

Postdi romant » 05/03/19 22:02

Chiedo scusa, se ho sbagliato…. è un momentaccio faccio le cose talmente di fretta che non mi rendo conto neanche di cose molto più semplici… Abbi pazienza...faccio queste modifiche e sto attento alla riga di partenza….e ti faccio sapere...
romant
Utente Junior
 
Post: 23
Iscritto il: 29/01/19 21:35

Re: Confrontare un range di valori su diverse colonne

Postdi romant » 05/03/19 22:12

Funziona tutto a meraviglia…. Sei un mito… Ti ringrazio infinitamente… e porta pazienza per noi poveri ignorantoni…
romant
Utente Junior
 
Post: 23
Iscritto il: 29/01/19 21:35


Torna a Applicazioni Office Windows


Topic correlati a "Confrontare un range di valori su diverse colonne":


Chi c’è in linea

Visitano il forum: Nessuno e 97 ospiti