La Function PapirAxB restituiva il numero di riga se i dati del quesito iniziale rispettavano le clausole date nel quesito iniziale; per fare il calcolo usavo due vettori (haArr e hbArr) di lunghezza pari al numero degli estratti, in cui "spuntavo"
la posizione degli estratti che rispettavano le condizioni; alla fine controllavo quante spunte fossero presenti e su questa base scrivevo il valore di uscita di quella riga.
La nuova funzione che vuoi creare immagino debba verificare le stesse condizioni quindi, partendo dal codice della PapirAxB ho elaborato questa variante:
- Codice: Seleziona tutto
Function PapirAnB(ByVal aaVal As Long, ByVal bbVal As Long, ByRef myRan As Range, ByVal Estraz As Long) As Variant
'Vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=111409
Dim oArr(), haArr(), hbArr(), I As Long, J As Long
Dim wArr, nEstr As Long
'
nEstr = myRan.Columns.Count / Estraz 'Quante estrazioni nella tabella
'
Mytim = Timer
ReDim oArr(1 To myRan.Rows.Count) 'Crea Output Array con abbastanza celle
wArr = myRan.Value 'Copia l'intervallo dati
For I = 1 To myRan.Rows.Count
ReDim haArr(0 To myRan.Columns.Count / Estraz) 'Erase haArr
ReDim hbArr(0 To myRan.Columns.Count / Estraz) 'Erase hbArr
For J = 1 To myRan.Columns.Count 'Scansiona le colonne
If wArr(I, J) = aaVal Or wArr(I, J) = bbVal Then
If hbArr(J Mod nEstr) = 0 Then haArr(J Mod nEstr) = 1 'Spunta haArr sulla colonna dell'estratto (1°,2°,..)
End If
If wArr(I, J) = bbVal Then
If haArr(J Mod nEstr) = 0 Then hbArr(J Mod nEstr) = 1 'Spunta hbArr sulla colonna dell'estratto
End If
Next J
'Verifica quante spunte ci sono
If (Application.WorksheetFunction.Sum(haArr) > 0 And Application.WorksheetFunction.Sum(hbArr) > 0) Or _
Application.WorksheetFunction.Sum(haArr) > 1 Or Application.WorksheetFunction.Sum(hbArr) > 1 Then
'Se ci sono le spunte giuste, compila array di output
oArr(I) = I + myRan.Cells(1, 1).Row - 1
End If
Next I
'Restituisce l'array di output
PapirAnB = Application.WorksheetFunction.Transpose(oArr)
''Debug.Print "B", Format(Timer - Mytim, "0.00")
End Function
Noterai qualche commento in piu' per indicare sinteticamente lo scopo delle istrzuzioni.
Rispetto alla versione precedente, e' necessario indicare nella formula quante estrazioni sono presenti nella tabella (2, secondo l'ultimo tuo messaggio); da questo parametro il codice calcolera' quanti sono gli estratti per ogni estrazione (6, in questo esempio; 5 nell'esempio iniziale) prima di procedere con il calcolo dei risultati.
Da quanto detto, la formula che potrai usare sara':
- Codice: Seleziona tutto
=PapirAnB(xx;zz;I4:T153;2)
Puoi usare la stessa PapirAnB nel file che aveva 5 estratti e 5 estrazioni; in questo caso la formula da usare sara'
- Codice: Seleziona tutto
=PapirAnB(aa;bb;I2:AG121;5)
Ciao