Hai ragione, era meglio non complicarti la vita con l'array (che ha senso solo se hai tanti risultati da scrivere)
Questa versione e' piu' simile alla tua
- Codice: Seleziona tutto
Sub Baam2()
Dim I As Long, J As Long, ValMin As Long
Dim ValIn As Long
'
ValMin = Range("CB2").Value '<<< Dove trovo scritto il Min valore
'
Range("CB4").Resize(Cells(Rows.Count, "BC").End(xlUp).Row - 3, 90).ClearContents
For I = 4 To Cells(Rows.Count, "BC").End(xlUp).Row
For J = 1 To 90
ValIn = Application.WorksheetFunction.CountIf(Cells(I, "BC").Resize(1, 25), J)
If ValIn >= ValMin Then
Range("CB1").Cells(I, J) = J
End If
Next J
Next I
MsgBox ("Completato")
End Sub
Seguono i commenti nel confronto tra le tue istruzioni e le mie:
- Codice: Seleziona tutto
For i = 1 To i
Vs
For I = 4 To Cells(Rows.Count, "BC").End(xlUp).Row
La tua istruzione esegue un solo ciclo; la mia esegue tanti cicli quante sono le righe di dati disponibili
- Codice: Seleziona tutto
Cells(3 + i, 79 + j).Value = Application.WorksheetFunction.Count(Range(Cells(3 + i, 54), Cells(i + 79))) = Cells(1, 80).Value
Vs
ValIn = Application.WorksheetFunction.CountIf(Cells(I, "BC").Resize(1, 25), J)
If ValIn >= ValMin Then
Range("CB1").Cells(I, J) = J
End If
La tua istruzione vorrebbe compilare una cella se un certo numero (dei 90 sondati) e' presente almeno un tot di volte nella riga in esame; in realta' COUNT conta i numeri presenti nella riga, e il risultato che verra' scritto e' comunque il risultato del confronto (Vero /Falso). Siccome COUNT restituisce sempre "25" il risultato sara' sempre Falso
Le mie istruzioni fanno le cose per gradi: contano usando COUNTIF, poi confrontano col valore minimo desiderato, poi eventualmente scrive il numero nella sua casella.
Inoltre, non volendo sbattermi a controllare se
54 e 79 sono proprio la colonna di inizio e di fine dei dati da esaminare uso
"BC" come colonna di partenza (come si vede dall'immagine da te allegata) e poi uso Resize per allargare di
25 colonne visto che i dati da esaminare sono larghi 25 colonne
Insomma ho usato
Cells(I, "BC").Resize(1, 25) invece che Range(Cells(3 + i, 54), Cells(i + 79)) perche' mi sembra piu' semplice da scrivere e piu' semplice da capire
Per lo stesso motivo ho usato
Range("CB1").Cells(I, J) invece che Cells(3 + i, 79 + j) per indirizzare la cella in cui scrivere
Le altre istruzioni sono di contorno a questo nucleo