Distribuzioni di frequenza

Storico discussioni

Distribuzioni di frequenza di Ivan
Salve a tutti! Sono un archeofemtoconoscitore di Visual basic, e come tale mi ostino a compilare i codici ancora con i numeri di riga (solitamente inizio con 10 CLS!), e con istruzioni del tipo PRINT e INPUT... Ora che le cose sono cambiate non so più che pesci pigliare!!!
Scherzi a parte... Sono parecchio in difficoltà riguardo una procedura: vorrei effettuare delle DISTRIBUZIONI DI FREQUENZA relativamente a due matrici dati e classi (la cui lunghezza può naturalmente variare), presenti in due fogli differenti. Il risultato naturalmente deve essere della stessa lunghezza della colonna "classi" e dovrebbe comparire accanto ad essa. In Excel utilizzerei la funzione FREQUENZA() relazionata alla matrice dati e alla matrice classi e non vi sarebbero problemi! Come posso fare per tradurre quel tipo di procedura in "computerese"? Vi ringrazio di cuore per il tempo che vorrete dedicarmi. Ivan.

di Mauro
Le applicazioni Office offrono un modo molto semplice per tradurre le azioni eseguite sull’interfaccia utente in codice visual basic ovvero il "Registratore di macro". Il processo è spiegato nel link:
MacroExcel
Prova a rieseguire i vari step di creazione col registratore di macro, poi ci sentiamo. Se però il tuo obiettivo è quello di ricreare la stessa funzione in un eseguibile esterno ad excel, scritto da te in VB, l'affare si complica!

di Ivan
Salve Mauro, innanzitutto ti ringrazio tanto per la tua risposta!
Sai, avevo già pensato ad una procedura del genere, d'altronde essendo un inesperto, quella di utilizzare il registratore di macro è sempre una delle mie prime mosse, in maniera tale da avere del "codice sano" da poter poi modificare secondo le mie esigenze. Il fatto è che però, per quel che riguarda la funzione FREQUENZA, non sono riuscito a compiere queste modifiche. Poco fa ho provato a ripetere la procedura che anche tu mi avevi consigliato ottenendo il seguente codice:

Sub ProvaFrequenze()
'
' ProvaFrequenze Macro
' Macro registrata il 03/11/2005 da Ivan

Sheets("Foglio2").Select
Range("H2:H20").Select
Selection.FormulaArray = _
"=FREQUENCY(Foglio3!RC[-7]:R[178]C[-7],RC[-7]:R[18]C[-7])"
End Sub

Purtroppo però non riesco a rendere i calcoli più "flessibili", ovvero non riesco a generalizzare il range selezionato sul quale verranno riportati i risultati, stesso discorso vale per le selezioni relative la "matrice dati" e la "matrice classi".
Successivamente ho pensato di includere il tutto in un ciclo FOR...NEXT (che sono riuscito a costruirmi con l'aiuto della rete e della mia "fantasia"!), lo stesso che mi consente di generare le classi a partire da una colonna di dati grezzi:

Sub Macro1()
'
' Macro1 Macro
' Macro registrata il 24/10/2005 da Ivan
'

'Calcolo del massimo e del minimo della matrice delle lunghezze
Worksheets("Foglio1").Range("a2").Formula = "=MIN(Foglio3!A:A)"
Worksheets("Foglio1").Range("b2").Formula = "=MAX(Foglio3!A:A)"
'Calcolo delle classi di taglia (1mm) tramite ciclo For... Next
valiniz = Worksheets("Foglio1").Range("a3")
valfinal = Worksheets("Foglio1").Range("b3")
Worksheets("Foglio2").Range("a2").Value = valiniz
For Cnt = 0 To valfinal - valiniz
Worksheets("Foglio2").Range("a2").Offset(Cnt, 0).Value = valiniz + Cnt
'Primo tentativo per il calcolo delle frequenze
Worksheets("Foglio2").Range("h2").Offset(Cnt, 0).Formula = _
"=FREQUENCY(Foglio3!a2,Foglio2!h2)"
Next Cnt
'Secondo tentativo per il calcolo delle frequenze
' Worksheets("Foglio2").Activate
' Range("h2").Select
' Selection.FormulaArray = "=FREQUENCY(Foglio3!.range("a2"):foglio2"h2"!)"

Ma nulla di fatto!
In ultimo pensavo alla possibilità di "variabilizzare" le due matrici che mi occorrono e poi utilizzare tali variabili nella formula FREQUENZA(), ma dubito che la "mia" procedura sia in qualche maniera utile ad Excel affinchè possa capire che "Lungh" e "Classi" siano le variabili che mi riguardano!

Sub Frequenza()
Dim Lungh() As Variant, CL As Object
Dim Classi() As Variant, CM As Object
Dim A, B, N, M
N = Worksheets("dati").UsedRange.Rows.Count
ReDim Lungh(1 To N)
A = 1
For Each CL In Range(Cells(1, 1), Cells(N, 1))
A = A + 1
Next
M = Worksheets("classi").UsedRange.Rows.Count
ReDim Lungh(1 To M)
B = 1
For Each CM In Range(Cells(1, 1), Cells(M, 1))
B = B + 1
Next
End Sub

Per chiarezza ti dico che "Foglio2" è quello che contiene le classi e dove andrebbero riportati i risultati e "Foglio3" è quello contenente i dati grezzi.
Questi sono i vari tentativi cervellotici che ho fatto per provare a risolvere il mio problemuccio, mi scuso sentitamente per essermi dilungato tanto, ma volevo essere il più chiaro possibile. Ah, per finire ti dico che è mia intenzione creare una macro iterna ad Excel, che mi consenta di compiere dei calcoli servendomi esclusivamente di dati riportati in Excel. Mi scuso di nuovo e ringrazio sentitamente per la pazienza!

di Mauro
Ho ipotizzato una situazione semplificata.
rimanendo su foglio1 ho la matrice dati B3:B11 e la matrice classi C3:C5.
La matrice frequenze sarà su D3:D6.

RigaIni = 3
Range("B3").Select
Selection.End(xlDown).Select
NumRiga1 = Selection.Row
Diff1 = NumRiga1 - RigaIni
Range("C3").Select
Selection.End(xlDown).Select
NumRiga2 = Selection.Row
Diff2 = NumRiga2 - RigaIni
Range("D3:D" & NumRiga2 + 1).Select
Selection.FormulaArray = "=FREQUENCY(RC[-2]:R[" & Diff1 _
& "]C[-2],RC[-1]:R[" & Diff2 & "]C[-1])"

Adesso se inserisco nuovi dati o classi cambia dinamicamente i range.
Vedi se riesci a prendere spunto.
Ciao

di Ivan
Perfetto! Provato e funziona! Grazie di cuore Mauro! Spero di diventare al più presto in grado di dare attivamente una mano a chiunque abbia difficoltà e si rivolga al nostro forum. Ciao!

Cognolato Studio © 2005