Moderatori: Anthony47, Flash30005
SOMMA(CONTA.SE(Foglio1!A2:O2;fOGLIO22!A5:O5))
...dove vanno messi i potenziali 200 risultati di ognuna delle 100 righe?...
..Ma non saprai quali sono le celle non uguali che eventualmente andrebbero sommate..
Azz... Io veramente pensavo di cavarmela con qualche buon consigliodata l'enorme mole di righe da esaminare sarebbe necessaria una macro molto veloce, perciò non ti fermare
alla " prima cosa che ti viene in mente "(citazione di un precedente post), hai tutto il tempo necessario.
miko oggi ha scritto:i risultati devono essere inseriti nel foglio2 affianco alle righe del range2
entrambi i range iniziano in cella H10 e finiscono in colonna V, quindi se puoi lascia una colonna vuota
e utilizza la colonna X.
miko ieri ha scritto:devo confrontare ciascuna riga del range1 di foglio1 con ciascuna e tutte le righe del range2 di foglio2.
quando tra 2 righe dei 2 range, trovo 1 solo numero uguale, oppure 2 ed al massimo 3 numeri uguali,
in qualunque colonna essi si trovano, devo sommare i numeri della riga di range2 che invece sono diversi dalla riga di range1.
si deve saltare il confronto, e quindi saltare la somma, quando il numero dei valori uguali è >= 4,
Questo conferma che non ho capito che cosa cerchi; perche' se ogni riga di foglio1 va confrontata con "ciascuna riga di foglio2" che cosa cambia tra cominciare a confrontare la prima di 1 con la prima di 2, l'ultima di 1 con la penultima di 2, la prima di 1 con la terzultima di 2 etc etc INVECE CHE la prima di 1 con la prima di 2, la prima di 1 con la seconda di 2, la prima di 1 con la terza di 2 etc etc?miko oggi ha scritto:ultima cosa se è possibile e se non è troppo complicato, il calcolo deve avvenire partendo dalla prima riga
del range1 di foglio1 fino all'ultima di range1, confrontandole a partire dall'ultima riga del range2 di foglio2 e procedendo fino alla prima di range2, in pratica per il range2 si deve procedere dall'ultima alla prima riga.
in quest' ultimo caso se confrontiamo prima riga di range1 con ultima riga di range2 il risultato va inserito
affianco dell' ultima riga di range2.
...pensavo di cavarmela con qualche buon consiglio...
...potresti usare all'interno di Evaluate la formula (tipo)
SOMMA(CONTA.SE(Foglio1!A2:O2;fOGLIO22!A5:O5))...
...Quindi io capisco che devi confrontare N righe (es 100) di foglio 1 con M righe (es 200) di foglio2; quindi accanto alle 200 righe di foglio2 ci vanno fino a 100 risultati. Come faccio a metterli tutti nella colonna X?...
... INVECE CHE la prima di 1 con la prima di 2, la prima di 1 con la seconda di 2, la prima di 1 con la terza di 2 etc etc?...
Sub JetCompare()
Dim RR1 As Range, RR2 As Range, kCol As Long, L As Long
Dim I As Long, J As Long, K As Long, mySum As Long, myCnt As Long
Dim oArr(), W1Arr, W2Arr, Lista1 As Range, Lista2 As Range
Dim hArr(), myDbg As Boolean
'
Set RR1 = Sheets("Foglio1").Range("H10") '<<< Le aree di partenza dei 2 intervalli
Set RR2 = Sheets("Foglio2").Range("H10")
kCol = 15 '<<< La larghezza delle liste in Colonne
'
ReDim hArr(1 To kCol)
myDbg = False
Set Lista1 = Range(RR1, RR1.End(xlDown))
W1Arr = Lista1.Resize(, kCol).Value
For I = 1 To UBound(W1Arr)
Set Lista2 = Range(RR2, RR2.End(xlDown))
W2Arr = Lista2.Resize(, kCol).Value
ReDim oArr(1 To UBound(W2Arr), 1 To 1)
For J = UBound(W2Arr) To 1 Step -1
For L = 1 To kCol
hArr(L) = W2Arr(J, L)
Next L
mySum = 0: myCnt = 0
For K = 1 To kCol
For L = 1 To kCol
If W1Arr(I, K) = hArr(L) Then
'' If myDbg Then Debug.Print I, J, K, L
myCnt = myCnt + 1
hArr(L) = 0
End If
Next L
Next K
If myCnt < 4 And myCnt > 0 Then
If myDbg Then Debug.Print I, J, myCnt
oArr(J, 1) = Application.WorksheetFunction.Sum(hArr)
Else
If myDbg Then Debug.Print I, J, myCnt * 10
End If
Next J
RR2.Offset(0, kCol + 1).Resize(UBound(oArr), 1) = oArr '?????
Stop
Next I
End Sub
… tu vorresti una macro velocissima che…
..quando hai il risultato scendi dalla bici e …
.. sia fortemente penalizzante, in termine di velocita' di esecuzione…
…sarebbe molto più efficiente cancellare…
Sub JetCompare2()
Dim RR1 As Range, RR2 As Range, kCol As Long, L As Long
Dim I As Long, J As Long, K As Long, mySum As Long, myCnt As Long
Dim oArr(), W1Arr, W2Arr, Lista1 As Range, Lista2 As Range
Dim hArr(), myDbg As Boolean
Dim lLimit As Long, uLimit As Long, cArr(), oRR As Range
'
Set RR1 = Sheets("Foglio1").Range("H10") '<<< Le aree di partenza dei 2 intervalli
Set RR2 = Sheets("Foglio2").Range("H10")
Set oRR = Sheets("FoglioZ").Range("A1") '<<< L'area dove sara' scritto il risutato
kCol = 15 '<<< La larghezza delle liste in Colonne
'
mytim = Timer
ReDim hArr(1 To kCol)
myDbg = False
Set Lista1 = Range(RR1, RR1.End(xlDown))
W1Arr = Lista1.Resize(, kCol).Value
Set Lista2 = Range(RR2, RR2.End(xlDown))
W2Arr = Lista2.Resize(, kCol).Value
For I = 1 To UBound(W1Arr)
lLimit = RR1.Cells(I, kCol + 2)
uLimit = RR1.Cells(I, kCol + 4)
ReDim oArr(1 To UBound(W2Arr), 1 To 1)
For J = UBound(W2Arr) To 1 Step -1
If W2Arr(J, 1) <> "" Then
For L = 1 To kCol
hArr(L) = W2Arr(J, L)
Next L
mySum = 0: myCnt = 0
For K = 1 To kCol
For L = 1 To kCol
If W1Arr(I, K) = hArr(L) Then
If myDbg Then Debug.Print I, J, K, L
myCnt = myCnt + 1
hArr(L) = 0
End If
Next L
Next K
If myCnt < 4 And myCnt > 0 Then
If myDbg Then Debug.Print I, J, myCnt
oArr(J, 1) = Application.WorksheetFunction.Sum(hArr)
If oArr(J, 1) < lLimit Or oArr(J, 1) > uLimit Then 'Elimina riga
W2Arr(J, 1) = ""
End If
Else
If myDbg Then Debug.Print I, J, myCnt * 10
End If
End If
Next J
RR2.Offset(0, kCol + 1).Resize(UBound(oArr), 1) = oArr 'SOLO per TEST
Stop 'SOLO per TEST
Next I
Call oArrCollapse(W2Arr, cArr)
oRR.Resize(UBound(cArr), UBound(cArr, 2)).Value = cArr
Debug.Print Format(Timer - mytim, "0.00")
MsgBox ("Completato, Sec. " & Format(Timer - mytim, "0.00"))
End Sub
Sub oArrCollapse(ByRef wArr, ByRef oArr)
Dim wInd As Long
ReDim oArr(1 To UBound(wArr), 1 To UBound(wArr, 2))
For I = 1 To UBound(wArr)
If wArr(I, 1) <> "" Then
wInd = wInd + 1
For J = 1 To UBound(wArr, 2)
oArr(wInd, J) = wArr(I, J)
Next J
End If
Next I
End Sub
Sub A()
Dim arr1() As Variant, arr2() As Variant
Dim I As Integer
With Worksheets("Foglio1")
.Range("H4:L23").ClearContents
arr1 = .Range("B4:F23").Value
ReDim arr2(1 To (UBound(arr1, 1)), 1 To 5)
I = 1
For J = 1 To (UBound(arr2, 1)) Step 2
'oppure con un ciclo che scorre le colonne
arr2(I, 1) = arr1(J, 1)
arr2(I, 2) = arr1(J, 2)
arr2(I, 3) = arr1(J, 3)
arr2(I, 4) = arr1(J, 4)
arr2(I, 5) = arr1(J, 5)
.Range("H4:L23").Value = arr2 'per test
I = I + 1
Next J
.Range("H4:L23").ClearContents
.Range("H4:L23").Value = arr2
End With
End Sub
Sub B()
Dim ArrSource As Variant, ArrDest As Variant, ArrSum As Variant
On Error Resume Next
myTim = Timer
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlManual
With ThisWorkbook.Worksheets("Foglio1")
.Range("H4:L23").ClearContents
ReDim ArrSum(1 To 20)
I = 1
For J = 1 To 20 Step 2
ArrSource = .Range(.Cells(J + 3, "B"), .Cells(J + 3, "F"))
'qui il range è una qualunque zona del foglio diverso dal range di confronto che deve essere pieno
'altrimenti non funziona, io ho messo = 0
ArrDest = .Range(.Cells(1, "B"), .Cells(1, "F"))
ArrSum(I) = Application.WorksheetFunction.MMult(Array(1, 1), _
Array(ArrSource, ArrDest))
.Range("H" & I + 3 & ":L" & I + 3).Value = ArrSum(I) 'POPOLA IL FOGLIO ok
I = I + 1
Next J
.Range("H4:L23").ClearContents
.Range("H4:L23").Value = ArrSum '<<<< non funziona
Erase ArrSource
Erase ArrDest
Erase ArrSum
End With
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Torna a Applicazioni Office Windows
Mettere tutto MAIUSCOLO un range di celle Autore: raimea |
Forum: Applicazioni Office Windows Risposte: 7 |
SOMMARE DUE VALORI IN DUE COLONNE DIVERSE Autore: millennia80 |
Forum: Applicazioni Office Windows Risposte: 1 |
Input box range di celle di destinazione variabile Autore: systemcrack |
Forum: Applicazioni Office Windows Risposte: 17 |
Visitano il forum: Nessuno e 18 ospiti