Informazioni sulla formula
Hai un problema con Excel? 
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
Vuoi Approfondire?