| 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! |
|