PopAds.net - The Best Popunder Adnetwork

Distribuzioni di frequenza

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