Marco Porzio
2018-03-06 09:58:01 UTC
Ciao,
ho la necessità di calcolare la media di 50 valori presi a caso all'interno di una colonna con 80 valori.
con il codice di seguito sono riuscito a fare tutto, l'unica cosa è che utilizza un foglio di "appoggio" per eseguire l'operazione.
Vorrei modificare la parte finale del codice al fine di fare tutto senza il foglio di appoggio se possibile.
Questa la riga di codice che mi da problemi:
Last_Row2 = Foglio2.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Questo il codice completo (Vorrei fare tutto in Foglio3):
Public Sub ElaboraDati()
Dim arr As New Collection
Dim i As Long
Dim IndiceCasuale As String
Dim DA_ESTRARRE As Integer
Dim Estratti As Integer
DA_ESTRARRE = Foglio3.Range("S1")
'-------------------------------------------------------------------------
Foglio2.Select
Foglio2.Range("A1:A150").Select
Foglio2.Range("A1:A150").ClearContents
Foglio3.Select
'-------------------------------------------------------------------------
'Individuo ultima riga non vuota dell'elenco
'Foglio3.Range("B9:B88").Select
Max = Foglio3.Cells.Find("B88", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
'Definisco intervallo inferiore (indice della prima riga contente i dati)
Min = 9 'é la riga del primo elemento dell'elenco
'Ripeto il ciclo DO-LOOP fino a quando il numero di elementi contenuti nel vettore 'arr'
'è uguale al numero degli elementi da estrarre 'DA_ESTRARRE
Do Until arr.Count = DA_ESTRARRE
'estraggo un numero da inserire in un vettore
IndiceCasuale = Int((Max - Min + 1) * Rnd + Min)
'Se il numero fosse già presente nel vettore, non sarebbe possibile inserirlo e si genererebbe un errore.
'Ottengo quindi il risultato voluto (estrazione senza ripetizione)
'e faccio riprendere il ciclo
On Error Resume Next
arr.Add IndiceCasuale, IndiceCasuale
Loop
For i = 1 To arr.Count
'Ricalcolo l'ultima riga vuota del foglio in cui estrarre i dati
Last_Row2 = Foglio2.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
'Last_Row2 = Foglio3.Cells.Find("T50", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
'Copio nel foglio ESTRAZIONE i valori del foglio DATI
'utilizzando i numeri di riga casuali estratti precedentemente ed inseriti nel vettore arr
'di cui prendo gli gli elementi 'i' dal numero 1 all'ultimo arr.Count
Foglio2.Cells(Last_Row2 + 1, 1) = Foglio3.Cells(arr(i), 2)
Next
End Sub
ho la necessità di calcolare la media di 50 valori presi a caso all'interno di una colonna con 80 valori.
con il codice di seguito sono riuscito a fare tutto, l'unica cosa è che utilizza un foglio di "appoggio" per eseguire l'operazione.
Vorrei modificare la parte finale del codice al fine di fare tutto senza il foglio di appoggio se possibile.
Questa la riga di codice che mi da problemi:
Last_Row2 = Foglio2.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Questo il codice completo (Vorrei fare tutto in Foglio3):
Public Sub ElaboraDati()
Dim arr As New Collection
Dim i As Long
Dim IndiceCasuale As String
Dim DA_ESTRARRE As Integer
Dim Estratti As Integer
DA_ESTRARRE = Foglio3.Range("S1")
'-------------------------------------------------------------------------
Foglio2.Select
Foglio2.Range("A1:A150").Select
Foglio2.Range("A1:A150").ClearContents
Foglio3.Select
'-------------------------------------------------------------------------
'Individuo ultima riga non vuota dell'elenco
'Foglio3.Range("B9:B88").Select
Max = Foglio3.Cells.Find("B88", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
'Definisco intervallo inferiore (indice della prima riga contente i dati)
Min = 9 'é la riga del primo elemento dell'elenco
'Ripeto il ciclo DO-LOOP fino a quando il numero di elementi contenuti nel vettore 'arr'
'è uguale al numero degli elementi da estrarre 'DA_ESTRARRE
Do Until arr.Count = DA_ESTRARRE
'estraggo un numero da inserire in un vettore
IndiceCasuale = Int((Max - Min + 1) * Rnd + Min)
'Se il numero fosse già presente nel vettore, non sarebbe possibile inserirlo e si genererebbe un errore.
'Ottengo quindi il risultato voluto (estrazione senza ripetizione)
'e faccio riprendere il ciclo
On Error Resume Next
arr.Add IndiceCasuale, IndiceCasuale
Loop
For i = 1 To arr.Count
'Ricalcolo l'ultima riga vuota del foglio in cui estrarre i dati
Last_Row2 = Foglio2.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
'Last_Row2 = Foglio3.Cells.Find("T50", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
'Copio nel foglio ESTRAZIONE i valori del foglio DATI
'utilizzando i numeri di riga casuali estratti precedentemente ed inseriti nel vettore arr
'di cui prendo gli gli elementi 'i' dal numero 1 all'ultimo arr.Count
Foglio2.Cells(Last_Row2 + 1, 1) = Foglio3.Cells(arr(i), 2)
Next
End Sub