Informazioni sulla formula



  • Informazioni sulla formula
    di ilFonta (utente non iscritto) data: 16/09/2013 17:14:09

    Salve

    ho scritto il seguente codice che dovrebbe eseguire la media di un range di caselle costituito dalla variabile sigma_lin, ma il risultato è invece una casella con scritto #NOME?.
    La stessa variabile è di seguito utilizzata per creare dei grafici e questa parte del programma invece funziona.

    Dove sbaglio?

    Grazie
     
     Sheets("statistiche").Select
        Cells(righe_stats, 6).Select
        ActiveCell.FormulaR1C1 = "=AVERAGE (sigma_dB)"
        righe_stats = righe_stats + 1



  • di HarryBosch data: 16/09/2013 19:15:29

    Prova a togliere lo spazio nella formula...
    =AVERAGE(sigma_dB)


  • Informazioni sulla formula
    di ilFonta (utente non iscritto) data: 16/09/2013 23:44:26

    Ciao Harry
    no, purtroppo non funziona
    Non capisco cosa sto sbagliando.

    Grazie



  • di HarryBosch data: 17/09/2013 00:35:06

    Il "range di caselle costituito dalla variabile sigma_lin" che citi all'inizio, come l'hai creato?
    Da come sei partito, ho dato per scontato che esista già questo intervallo sul foglio, giusto?
    A parte che vedo ora, hai scritto sigma_lin e poi nel codice utilizzi sigma_db...



  • di Grograman data: 17/09/2013 08:47:14

    Se hai dichiarato il nome "Sigma_DB" nel FOGLIO, allora ha ragione Harry e stai solo sbagliando la sintassi.
    Viceversa se intendi usare un "range" via codice, la sintassi sarebbe la seguente:
     
    Dim Sigma_DB As Range
    Set Sigma_DB = Range("A1:A7")
    Range("B1") = Evaluate("average(" & Sigma_DB.Address & ")")


  • Informazioni sulla formula
    di ilFonta (utente non iscritto) data: 17/09/2013 16:05:13

    Salve, la proposta di Grograman è la più corretta, rimane ora solo un problema: vorrei che il range di celle relative alla variabile sigmaLin appartenesse al foglio "istogrammi", ma vorrei che i risultati della media fossero riportati nel foglio "statistiche".
    Mi son quindi creato una nuova variabile "foglioLavoro" a cui ho provato a dare l'indirizzo del foglio e il Range, ma quado provo a far girare la macro
    mi compare un errore che mi dice " sub o function non definita" e si evidenzia la parola Worksheet.

    Grazie per l'aiuto
     
    Dim sigmaLin As Range
    Dim foglioLavoro As Worksheet
    Set foglioLavoro = Worksheet("istogrammi").Range(sigmaLin)
    Sheets("statistiche").Select
        Cells(righe_stats, 7) = Evaluate("average(" & foglioLavoro.Address & ")")
    



  • di Vecchio Frac data: 17/09/2013 16:09:46

    cit. "mi compare un errore che mi dice " sub o function non definita" e si evidenzia la parola Worksheet. "
    ---> Già, infatti l'insieme dei fogli si chiama "Worksheets" e non "Worksheet".
     
    Set foglioLavoro = Worksheets("istogrammi").Range(sigmaLin)





  • Informazioni sulla Formula
    di ilFonta (utente non iscritto) data: 17/09/2013 17:07:03

    Grazie Vecchio Frac. Adesso purtroppo mi dice che è impossibile trovare il metodo o il membro dei dati. Praticamente .Address non è compatibile con fogliolavoro (worksheet).

    Grazie
     
    Dim sigmaLin As Range
    Dim foglioLavoro As Worksheet
    Set sigmaLin = Range("B" + limSupROI + ":B" + limInfROI)
    Set foglioLavoro = Worksheets("istogrammi").Range(sigmaLin)
    Sheets("statistiche").Select
    Cells(righe_stats, 7) = Evaluate("average(" & foglioLavoro.Address & ")")
    



  • di Vecchio Frac data: 17/09/2013 17:12:29

    Uhm, qualcosa non quadra.
    foglioLavoro.Address funziona come dovrebbe (ho fatto adesso un test al volo e verificato che tutto è ok). Dire che .Address non è compatibile non ha senso, infatti .Address è un membro di Range e nel tuo esempio "fogliolavoro" è un oggetto range (si riferisce a "sigmaLin").





  • Informazioni sulla formula
    di ilFonta (utente non iscritto) data: 17/09/2013 17:24:39

    Vediamo se sto iniziando a capire:
    .Address è un oggetto Worksheet, perchè si riferisce a foglioLavoro?

    Grazie



  • di Vecchio Frac data: 17/09/2013 18:52:57

    Non esattamente: .Address è una proprietà (non è un oggetto esso stesso) dell'oggetto Range il quale identifica una zona del foglio di lavoro (una cella o un'insieme di celle). Questa proprietà, quando interrogata, restituisce un valore, che è una stringa.
    Con l'istruzione Set hai creato un riferimento ad un range, pienamente qualificato dal riferimento al suo oggetto contenitore (il foglio Worksheet "istogrammi" è il contenitore del Range "sigmaLin"). Dopo che hai creato un oggetto con Set (hai creato un nuovo oggetto di tipo Range e lo hai battezzato dandogli un nome significativo), questo oggetto eredita tutte le proprietà e i metodi dell'oggetto tipo. Quindi in "fogliolavoro" troverai una proprietà Address e te ne rendi conto battendo un punto dopo "fogliolavoro" (vengono elencati da Intellisense i metodi e le proprietà associati al tipo cui la variabile appartiene).
    Poichè hai assegnato (set) a "fogliolavoro" un range ben determinato ("sigmalin"), tale variabile contiene l'indirizzo di sigmalin.
    In pratica
    Worksheets("istogrammi").Range(sigmaLin).Address
    e
    fogliolavoro.Address
    restituiscono la medesima informazione perchè puntano al medesimo oggetto.





  • di HarryBosch data: 17/09/2013 23:01:02

    C'e un pò di confusione :)

    FoglioLavoro viene dichiarato come Worksheet quando poi gli viene assegnato un range:
    Set foglioLavoro = Worksheets("istogrammi").Range(sigmaLin)
    insomma, due cose completamente diverse.

    Il range "sigmaLin" viene settato senza il riferimento di foglio, generando così i più svariati errori di assegnazione soprattutto se non si è compreso appieno il metodo "Range". Nel tuo caso, mi sembra che ci sia una doppia istruzione:
    Set sigmaLin = Range("B" + limSupROI + ":B" + limInfROI)
    Set foglioLavoro = Worksheets("istogrammi").Range(sigmaLin)
    se "sigmaLin" è riferito al foglio Istogrammi allora la seconda istruzione non serve; basta direttamente :
    Set sigmaLin = Worksheets("istogrammi").Range("B" + limSupROI + ":B" + limInfROI)

    Quando un Range viene dichiarato 'Set myRange = Range("B1:B30")' non bisogna riferirsi ad esso riutilizzando l'istruzione Range! Si deve soltanto richiamare; esempio:
    Range(myRange).select --> errore!
    myRange.select -->corretto

    Se assegni "sigmaLin.Address" al metodo Evaluate, dovrai anche specificare il riferimento di foglio, altrimenti la stringa inserita farà riferimento al foglio attivo, rendendo vana una precedente assegnazione del tipo:
    Set sigmaLin = Sheets("istogrammi").Range("B" + limSupROI + ":B" + limInfROI)

    Quindi:
     
    Dim sigmaLin As Range
      
      Set sigmaLin = Sheets("istogrammi").Range("B" & limSupROI & ":B" & limInfROI)
      
      Sheets("statistiche").Cells(5, 7) = Evaluate("Average(istogrammi!" & sigmaLin.Address & ")")
        
     'oppure, e in questo caso il range sarà riferito in base al foglio indicato nel Set:
      'Sheets("statistiche").Cells(5, 7) = WorksheetFunction.Average(sigmaLin)


  • Informazioni sulla formula
    di ilFonta (utente non iscritto) data: 18/09/2013 11:35:23

    Salve, purtroppo sono di nuovo io
    Grazie mille Harry!
    Non riesco a capire cosa non vada.
    Adesso il programma mi restituisce un #DIV/0! nelle celle da me indicate.
    Vi allego solo la parte incriminata del mio codice, altrimenti sarebbe un po' lunga
    Grazie 1000
     
    Dim righe_stats As Integer
    righe_stats = 2
        
    Dim sigmaLin As Range
    
    
        For t = 1 To numero_ROI '--------------da questo ciclo dipende tutto-------------------
            If t < numero_ROI Then
                
                limSupROI = Str(indgroup(t))
                limSupROI = Right(limSupROI, Len(limSupROI) - 1)
                
                limInfROI = Str(indgroup(t + 1) - 2)
                limInfROI = Right(limInfROI, Len(limInfROI) - 1)
                
                sigmadB = "C" + limSupROI + ":C" + limInfROI
                Set sigmaLin = Sheets("istogrammi").Range("B" + limSupROI + ":B" + limInfROI)
                
            Else
                limSupROI = Str(indgroup(t))
                limSupROI = Right(limSupROI, Len(limSupROI) - 1)
                
                limInfROI = Str(numero_righe - 1)
                limInfROI = Right(limInfROI, Len(limInfROI) - 1)
                
                sigmadB = "C" + limSupROI + ":C" + limInfROI
                Set sigmaLin = Sheets("istogrammi").Range("B" + limSupROI + ":B" + limInfROI)
               
            End If
    
                sigma_dB_ord = Colonna(7 + (t - 1) * 2) + "2"
           
    '*************compilazione statistiche secondo foglio****************************
                
                Sheets("statistiche").Cells(righe_stats, 7) = Evaluate("Average(istogrammi!" & sigmaLin.Address & ")")
                righe_stats = righe_stats + 1



  • di Vecchio Frac data: 18/09/2013 13:10:31

    cit. "FoglioLavoro viene dichiarato come Worksheet"
    ---> Non mi ero accorto di questo piccolo ma importante particolare :(
    Il mio sproloquio ne esce, in parte, vanificato ;)





  • di HarryBosch data: 18/09/2013 14:10:27

    A parte il ciclo:
    For t = 1 To numero_ROI '--------------da questo ciclo dipende tutto-------------------
    If t < numero_ROI Then
    dove t sarà sempre < di numero_ROI fino all'ultimo valore, e dove alcune istruzioni si possono scrivere una sola volta dopo gli IF (vedi revisione in parte sotto).

    Da capire se l'istruzione "Evaluate" è all'interno della stessa sub, perché ho come l'impressione che tale istruzione sia in un'altra sub e la dichiarazione della variabile non sia pubblica.
    Puoi allegare un file di esempio senza dati fittizi?
     
        For t = 1 To numero_ROI    '--------------da questo ciclo dipende tutto-------------------
            limSupROI = Str(indgroup(t))
            limSupROI = Right(limSupROI, Len(limSupROI) - 1)
    
            If t < numero_ROI Then
                limInfROI = Str(indgroup(t + 1) - 2)
            Else
                limInfROI = Str(numero_righe - 1)
            End If
    
            limInfROI = Right(limInfROI, Len(limInfROI) - 1)
            
            sigmadB = "C" + limSupROI + ":C" + limInfROI
            Set sigmaLin = Sheets("istogrammi").Range("B" + limSupROI + ":B" + limInfROI)
        Next


  • Informazioni sulla formula
    di ilFonta (utente non iscritto) data: 18/09/2013 14:10:56

    Non importa, grazie lo stesso



  • di HarryBosch data: 19/09/2013 00:00:36

    Ma come, rinunci così? Hai letto il mio ultimo post, poco prima di gettare la spugna? :)


  • Informazioni sulla formula
    di ilFonta (utente non iscritto) data: 20/09/2013 01:13:56

    Salve, dove eravamo rimasti?
    Qui:

    Riepilogo: devo fare la media di alcuni valori che si trovano nella variabile "sigmaLin" nel foglio "istogrammi" e scrivere il risultato della media nel foglio "statistiche la formula che mi consente il risultato migliore è quella che allego, l'unico problema è che non mi riconosce il cambiamento di foglio e mi fa la media dei valori che si trovano nella variabile "sigmaLin" MA NEL FOGLIO STATISTICHE.

    se modifico questa istruzione
    Cells(righe_stats, 7) = Evaluate("AVERAGE(" & sigmaLin.Address & ")")
    e inserisco questa
    Cells(righe_stats, 7) = Evaluate("AVERAGE(istogrammi!" & sigmaLin.Address & ")")
    ottengo un valore
    #DIV/0!

    Garantisco che la colonna B del foglio istogrammi non è vuota
    Idee?

    Grazie, credo di averle provate tutte (quelle nelle mie capacità )




     
    Dim sigmaLin As Range
    Set sigmaLin = Sheets("istogrammi").Range("B" + limSupROI + ":B" + limInfROI)
    Sheets("statistiche").Select
    Cells(righe_stats, 7) = Evaluate("AVERAGE(" & sigmaLin.Address & ")")
    



  • di HarryBosch data: 20/09/2013 08:17:52

    Se ricostruisci lo scenario su un file nuovo, due fogli "istrogrammi e statistiche" con i valori nel foglio istogrammi nel range B1:B20, e la routine sotto, vedrai che tutto funziona a dovere.

    Secondo me il problema è legato alle variabili che compongono il Set, magari perché non sono pubbliche e le sub sono diverse. Se riesci ad allegare un estrapolato del tuo file senza dati sensibili, con le routine in questione vedrai che arriviamo a scoprire l'inghippo ^_^
     
    Sub calcola()
        Dim sigmaLin As Range
        Dim limSupROI As Integer, limInfROI As Integer
        Dim righe_stats As Integer
    
        limSupROI = 1
        limInfROI = 20
        righe_stats = 1
    
        Set sigmaLin = Sheets("istogrammi").Range("B" & limSupROI & ":B" & limInfROI)
        Sheets("statistiche").Select
    
        Cells(righe_stats, 7) = Evaluate("AVERAGE(istogrammi!" & sigmaLin.Address & ")")
    End Sub


  • Informazioni sulla formula
    di ilFonta (utente non iscritto) data: 20/09/2013 17:54:23

    Ho fatto una scoperta molto importante. Premetto che i dati della colonna B provengono dall'importazione di un file di testo. Ho provato a svolgere manualmente la media dei dati in colonna B tramite =media(B2:B4553) e ho ritrovato di nuovo un #DIV/0! I dati in colonna B sono formattati come GENERALE. Allora ho provato a convertirli in NUMERO e una volta fatto ottenevo le caselle col triangolino verde e l'informazione "numero memorizzato come testo". Ho provato di nuovo a svolgere la media manualmente ma ottenevo di nuovo l'errore. Se si clicca sul triangolino verde di ogni casella si accede all'opzione "converti in numero". Solo allora posso fare la media e ottenere un numero. Adesso devo trovare il modo per convertire l'intera colonna in numero in una botta sola. Comunque grazie


  • Informazioni sulla formula
    di ilFonta (utente non iscritto) data: 23/09/2013 12:49:41

    Risolto. Il problema non stava nella cattiva gestione dei fogli e dei Range, ma i fatto che i numeri che appartenevano al Range erano memorizzati come testo.


  • Grafici con VBA
    di ilFonta data: 23/09/2013 12:57:25

    Risolto. Il problema non era nella scelta dei fogli o dei range ma stava nel fatto che i dati numerici erano memorizzati come testo