Pagina 1 di 2 12 UltimaUltima
Risultati da 1 a 15 di 26

Discussione: EXCEL: Inserire una variabile all'interno di una formula

  1. #1
    New Member
    Data Registrazione
    08-02-2010
    Messaggi
    8

    EXCEL: Inserire una variabile all'interno di una formula

    Ciao a tutti

    Ho il seguente problema, non riesco a far passare il valore si una variabile dentro una formula, ho visionato anche questa discussione PROBLEMA VBA EXCEL PASSARE LE VARIABILI AD UNA FORMULA provandola ma non ho risolto il problema

    Devo inserire dati provenienti da file di excel all'interno di un grafico, in sostanza l'utente indica tramite Msgbox quale anno di riferimento desidera e il programma "dovrebbe" inserire nel campo "valori" all'interno della serie 2 del grafico il riferimento ad un determinato intervallo di una determinata pagina di un determinato file di excell.
    Questi files si chiamano RISOLUTORE2009.xls, RISOLUTORE2008.xls ecc.

    Ho creato una variabile chiamata STRINGA che riporta come valore di testo RISOLUTORE2009.xls o RISOLUTORE2008.xls ecc. ma all'interno dei valori del grafico viene riportato la parola STRINGA e non il valore di STRINGA
    ECCO LA PARTE DEL CODICE

    Dim STRINGA As String
    STRINGA = ""
    STRINGA = ("[RISOLUTORE" & anno_precedente & ".XLS]")


    ActiveChart.SeriesCollection(2).Name = anno_precedente
    ActiveChart.SeriesCollection(2).Values = _
    "=([STRINGA]PRESENZE!R2C9:R31C9,[STRINGA]PRESENZE!R33C9:R63C9,[STRINGA]PRESENZE!R65C9:R94C9,[STRINGA]PRESENZE!R96C9:R126C9,[STRINGA]PRESENZE!R128C9:R158C9,[STRINGA]PRESENZE!R160C9:R188C9)"


    come potrei risolvere il problema cioè passare il valore della variabile alla formula?

    PS. excel 2000
    VBA 6.0

    SE FOSSE NECESSARIO ECCO TUTTO IL CODICE

    Sub Macro6()
    '
    ' Macro6 Macro
    ' Macro registrata il 06/02/2010
    '

    Dim anno_in_corso As String
    Dim anno_precedente As String
    anno_in_corso = ""
    anno_precedente = ""


    Dim Message, Title, Default, MyValue
    Message = "Immetti l'anno in corso con formato aaaa" ' Imposta il messaggio.
    Title = "Impostazione anno in corso" ' Imposta il titolo.
    Default = "2010" ' Imposta il valore predefinito.
    ' Visualizza il messaggio, il titolo e il valore predefinito.
    MyValue = InputBox(Message, Title, Default)

    anno_in_corso = MyValue


    Sheets("Comparazione Presenze x data").Select ' si posiziona sul grafico "Comparazione Presenze x data"
    ActiveChart.SeriesCollection(1).Delete ' cancella le due serie
    ActiveChart.SeriesCollection(1).Delete
    ActiveChart.SeriesCollection.NewSeries
    ActiveChart.SeriesCollection.NewSeries
    ActiveChart.SeriesCollection(1).XValues = _
    "=(PRESENZE!R2C3:R31C3,PRESENZE!R33C3:R63C3,PRESEN ZE!R65C3:R94C3,PRESENZE!R96C3:R126C3,PRESENZE!R128 C3:R158C3,PRESENZE!R160C3:R188C3)"
    ActiveChart.SeriesCollection(1).Values = _
    "=(PRESENZE!R2C9:R31C9,PRESENZE!R33C9:R63C9,PRESEN ZE!R65C9:R94C9,PRESENZE!R96C9:R126C9,PRESENZE!R128 C9:R158C9,PRESENZE!R160C9:R188C9)"
    ActiveChart.SeriesCollection(1).Name = anno_in_corso

    Dim Message2, Title2, Default2, MyValue2
    Message2 = "Immetti l'anno precedente con formato aaaa" ' Imposta il messaggio.
    Title = "Impostazione anno in corso" ' Imposta il titolo.
    Default2 = "2009" ' Imposta il valore predefinito.
    ' Visualizza il messaggio, il titolo e il valore predefinito.
    MyValue2 = InputBox(Message2, Title2, Default2)

    anno_precedente = MyValue2

    Dim STRINGA As String
    STRINGA = ""
    STRINGA = ("[RISOLUTORE" & anno_precedente & ".XLS]")


    ActiveChart.SeriesCollection(2).Name = anno_precedente
    ActiveChart.SeriesCollection(2).Values = _
    "=([STRINGA]PRESENZE!R2C9:R31C9,[STRINGA]PRESENZE!R33C9:R63C9,[STRINGA]PRESENZE!R65C9:R94C9,[STRINGA]PRESENZE!R96C9:R126C9,[STRINGA]PRESENZE!R128C9:R158C9,[STRINGA]PRESENZE!R160C9:R188C9)"

    End Sub

  2. #2
    Senior Member L'avatar di LS66
    Data Registrazione
    23-01-2007
    Messaggi
    438
    Prova questa modifica:

    STRINGA = ("[RISOLUTORE" & Anno_precedente & ".xls]")
    Valori = "=" & STRINGA & "PRESENZE!R2C9:R31C9," & STRINGA & "PRESENZE!R33C9:R63C9," & STRINGA & "PRESENZE!R65C9:R94C9," & STRINGA & "PRESENZE!R96C9:R126C9," & STRINGA & "PRESENZE!R128C9:R158C9," & STRINGA & "PRESENZE!R160C9:R188C9"
    ActiveChart.SeriesCollection(2).Name = Anno_precedente
    ActiveChart.SeriesCollection(2).Values = Valori

    Cioè, quando poni STRINGA tra "" non viene considerata variabile, e quindi non viene analizzato il suo valore. STRINGA deve essere fuori dagli "" e quindi devi modificare la modalità con la quale costruisci i valori della serie.
    Ho fatto una piccola prova e mi sembra funzionare.


    Ciao.
    Ultima modifica di LS66; 08-02-2010 alle 23.37.19

  3. #3
    New Member
    Data Registrazione
    08-02-2010
    Messaggi
    8
    Strepitoso funziona alla grande.!!
    Solo una curiosità:
    perchè non sarebbe stato possibile scrivere la striga & STRINGA & nel campo Value della seconda serie anzichè trasformarla prima nel campo Valori per poi utilizzare quest'ultimo?

    e ancora:

    questo sistema vale anche se si volesse inserire il valore di una variabile, sia di testo che numerica all'interno di una Formula in VBA?
    tipo
    Worksheets("Sheet1").Range("B1").FormulaR1C1 = "=SQRT(R1C1+valore di una eventuale variabile numerica)"


    Grazie sia per la competenza che per la velocità della tua risposta
    Purtroppo considerato il mio livello in materia non potrò mai sdebitarmi, tuttavia se passassi da Milano Marittima per un week-end un caffè è assicurato

  4. #4
    Senior Member L'avatar di LS66
    Data Registrazione
    23-01-2007
    Messaggi
    438
    La variabile Valori non è necessaria; la uso per poter verificare l'espressione che verrà attribuita successivamente.
    Comunque dovresti poterla togliere tranqullamente correggendo solo l'espressione relativa a Stringa.

    Per il secondo quesito ti allego una piccola prova. La routine seguente
    Sub prova()
    pippo = 4
    Worksheets("Foglio1").Range("B1").FormulaR1C1 = "=SQRT(R1C1+" + CStr(pippo) + ")"
    End Sub

    scrive nella cella B1 la formula:
    =RADQ($A$1+4)

    In sostanza il valore della variabile pippo viene prelevato e convertito in formato testo dalla CStr per poter poi essere scritto correttamente nella formula.

    Ti ringrazio per i complimenti, ma soprattutto per il caffè; proprio buono, caldo, comodo ed in compagnia!

    Ciao

  5. #5
    New Member
    Data Registrazione
    08-02-2010
    Messaggi
    8
    Sempre molto chiaro.

    se invece la variabile pippo avesse già riportato un valore di testo avrei dovuto lasciarla "al naturale" cioè senza farla precedere da CStr e senza metterla tra parentesi tonde?

    in definitiva nelle formule le variabili vanno sempre convertite in testo? oppure no?

    Grazie.
    PS:
    considerato l'apprezzamento per il caffè ti aspetto allora anche per un grappino
    Ciao

  6. #6
    Senior Member L'avatar di LS66
    Data Registrazione
    23-01-2007
    Messaggi
    438
    Ti confesso che non ho molto chiaro il criterio da utilizzare per scrivere una formula nella cella attraverso il programma VBA; vado un po' a tentativi, e
    solitamente registro una macro per poi modificarla in base a quanto mi serve.

    A rigore quanto hai riassunto è corretto, ma se provi con la funzione concatena (e in generale le funzioni che vogliono le srtringhe)ed indichi una cella ed una variabile ritorna sempre (a me) errore.

    Io cerco di scrivere direttamente il risultato nella cella, oppure la formula senza variabili ma facendo riferimento ad altre celle, nelle quali copio il valore delle variabili.

    Quindi tieni a portata di mano il forum, non si sa mai!

    Quanto al grappino..... driiin! Lo senti? è il campanello!

    Ciao.

  7. #7
    New Member
    Data Registrazione
    08-02-2010
    Messaggi
    8
    Ciao LS

    grazie ai tuoi consigli lo sviluppo del codice è proceduto speditamente fino a quando ho dovuto inserire, sempre all'interno di una serie, riferimenti a celle singole e non ad intervalli;
    ora per quanto riguarda la serie 1 ho inserito questa parte del codice
    Valori_totali_anno_in_corso = "=PRESENZE!R32c9:R32c9,PRESENZE!R64c9:R64c9,PRESEN ZE!R95c9:R95c9,PRESENZE!R127c9:R127c9,PRESENZE!R15 9c9:R159c9,PRESENZE!R189c9:R189c9,PRESENZE!R190c9: R190c9"
    ActiveChart.SeriesCollection(1).Values = Valori_totali_anno_in_corso


    e tutto è andato ok,
    mentre per la serie 2 ho inserito questo codice

    Valori_totali_anno_precedente = "=" & stringa & "PRESENZE!R32c9:R32c9," & stringa & "PRESENZE!R64c9:R64c9," & stringa & "PRESENZE!R95c9:R95c9," & stringa & "PRESENZE!R127c9:R127c9," & stringa & "PRESENZE!R159c9:R159c9," & stringa & "PRESENZE!R189c9:R189c9," & stringa & "PRESENZE!R190c9:R190c9"
    ActiveChart.SeriesCollection(2).Values = Valori_totali_anno_precedente


    ma mi riporta sempre errore

    la parte relativa alla seconda serie non è altro che quella da te suggerita nella prima risposta (e che funziona alla grande) e nella quale è stato cambiato solo il riferimento anzichè ad un intervallo di celle ad una cella singola (riferimento che però parrebbe corretto in quanto funziona per la serie 1 così come vedi nel codice in rosso)
    Ho provato anche a comporre la formula direttamente dentro al grafico e poi l'ho inserita come testo attribuendola a Valori_totali_anno_precedente ma non funziona
    Non riesco a capire sembrerebbe che si comporti in maniere diversa ma non trovo da dove può venire il problema

    PS:
    credo che ormai caffè e grappino non siano sufficenti. Fammi sapere quando ti sposi che ti mando un regalo (anche se quel 66 dopo LS mi dice che forse è ormai troppo tardi...)
    Bye

  8. #8
    Senior Member L'avatar di LS66
    Data Registrazione
    23-01-2007
    Messaggi
    438
    Purtroppo sono di fretta e devo essere breve; prova a fare riferimento alla singola cella con una sola coordinata, come nella correzione che ti allego.
    A me funziona.



    Valori_totali_anno_in_corso = "=PRESENZE!R32c9,PRESENZE!R64c9,PRESENZE!R95c9,PRE SENZE!R127c9,PRESENZE!R159c9,PRESENZE!R189c9,PRESE NZE!R190c9"
    ActiveChart.SeriesCollection(1).Values = Valori_totali_anno_in_corso


    Valori_totali_anno_precedente = "=" & STRINGA & "PRESENZE!R32c9," & STRINGA & "PRESENZE!R64c9," & STRINGA & "PRESENZE!R95c9," & STRINGA & "PRESENZE!R127c9," & STRINGA & "PRESENZE!R159c9," & STRINGA & "PRESENZE!R189c9," & STRINGA & "PRESENZE!R190c9"
    ActiveChart.SeriesCollection(2).Values = Valori_totali_anno_precedente


    Ciao.

    P.S. Sul 66 hai proprio ragione, ma grazie del pensiero.

  9. #9
    New Member
    Data Registrazione
    08-02-2010
    Messaggi
    8
    Ciao LS

    VBA mi fa andare fuori di testa, p.es. il riferimento

    Valori_totali_anno_precedente = "=" & stringa & "PRESENZE!R32c9," & stringa & "PRESENZE!R64c9," & stringa & "PRESENZE!R95c9," & stringa & "PRESENZE!R127c9," & stringa & "PRESENZE!R159c9," & stringa & "PRESENZE!R189c9," & stringa & "PRESENZE!R190c9"

    funziona perfettamente ma se cambio la colonna da c9 a c10
    mi riporta errore "Impossibile impostare la proprietà Values per la classe Series"

    anzi ti dirò di più da C1 a C9 compresi nessun problema da C10 in poi errore. Possibile che riconosca solo 9 colonne ? Oppure che non si possano impostare colonne a 2 cifre?
    mah

  10. #10
    Senior Member L'avatar di LS66
    Data Registrazione
    23-01-2007
    Messaggi
    438
    Credo che il problema sia la lunghezza della stringa; se passi dal riferimento di colonna a due cifre ottieni che valori_totali_anno_precedente diventa lunga 256 caratteri, che mi suona come troppo lunga (penso che il limite sia 255).
    Prova a diminuire la lunghezza dei nomi dei fogli.

  11. #11
    New Member
    Data Registrazione
    08-02-2010
    Messaggi
    8
    GRAZIE LS
    Scusa se non l'ho fatto prima ma in questi giorni ero fuori ufficio.

    per completare il lavoro ho rimasto solo uno scoglio.
    In un foglio (non più nei grafici) ho una colonna "C" dove ho inserito date crescenti a partire dal 1/4 fino al 30/09 (non sò se per la tua risposta possa essere importante ma alla fine di ogni mese vi è una riga relativa ai subtotali di ciascuna mensilità). La colonna precedente "B" deve riportare il giorno della settimana relativo alla data attigua posta in C. Allo scopo ho creato una parte di codice che inserisce nella colonna C a secondo dell'anno preso a riferimento (2008-2009 ecc.) la data esatta e ho copiato il valore di ogni cella di C in B, ho poi formattato con il formato ddd che visualizza il giorno della settimana e fin qui all'apparenza è tutto corretto.
    Naturalmente pur essendo visualizzao il giorno della settimana il vero valore della cella è quello del gg/mm/aa relativo.
    Dovendo poi da questa pagina ricavare dei grafici mi occorre il valore del giorno della settimana in formato testo e non data. E' possibile secondo te trasformare il valore p.es. 01/04/10 visualizzato gio (minuscolo) in un valore stringa GIO (maiuscolo)?

    ciao

    PS. considerato che caffè, grappino, regalo di matrimonio non siano ormai più sufficenti mi stò atrezzando per donarti gli organi.!

  12. #12
    Senior Member L'avatar di LS66
    Data Registrazione
    23-01-2007
    Messaggi
    438
    Non sono sicuro d'aver capito correttamente quanto richiedi; mi attengo all'ultimo quesito.

    Se in una cella hai una data gg/mm/aa formattata ggg e vuoi convertirla in formato testo io ricorrereri ad una semplice formula in una cella attigua.

    Per esempio, se la data è nella cella J11 e nella cella I11 scrivi:

    =SE(GIORNO.SETTIMANA(J11)=1;"DOM";SE(GIORNO.SETTIM ANA(J11)=2;"LUN";SE(GIORNO.SETTIMANA(J11)=3;"MAR"; SE(GIORNO.SETTIMANA(J11)=4;"MER";SE(GIORNO.SETTIMA NA(J11)=5;"GIO";SE(GIORNO.SETTIMANA(J11)=6;"VEN";S E(GIORNO.SETTIMANA(J11)=7;"SAB")))))))

    in questa cella trovi il giorno scritto come desideri (volendo anche per esteso) ed in formato testo.
    Eventualmente GIORNO.SETTIMANA(J11) puoi scriverlo in una ulteriore colonna che puoi anche nascondere.

    Può essere una soluzione?

    Ciao.

  13. #13
    New Member
    Data Registrazione
    16-11-2009
    Messaggi
    20
    so che probabilmente non è qua il luogo giusto però ho un grande problema
    qualcuno mi puo dare una mano?
    il problema è il seguente
    vorrei assegnare a ogni giorno della settimana un valore in maniera che si aggiorni in automatico se cambia il mese o l'anno
    per es dal lunedi al giovedi deve uscire scritto 8(e non 1,2,3,4come ora)il venerdi =7 il sabato e domenica =0
    in maniera che se cambio il mese o l'anno si aggiornino in auutomatico

  14. #14
    Software Zone Fanatic L'avatar di MANDRAKE
    Data Registrazione
    28-12-2002
    Messaggi
    3.100
    se ho capito bene basta cambiare la formula di ls66 in questo modo

    =SE(GIORNO.SETTIMANA(C6)=1;"0";SE(GIORNO.SETTIMANA (C6)=2;"8";SE(GIORNO.SETTIMANA(C6)=3;"8";SE(GIORNO .SETTIMANA(C6)=4;"8";SE(GIORNO.SETTIMANA(C6)=5;"8" ;SE(GIORNO.SETTIMANA(C6)=6;"7";SE(GIORNO.SETTIMANA (C6)=7;"0")))))))

    ciao

  15. #15
    New Member
    Data Registrazione
    16-11-2009
    Messaggi
    20
    OK LA FORMULA L'HO LEGGERMENTE MODIFICATA COSI
    =SE(GIORNO.SETTIMANA(C4)=1;"0";SE(GIORNO.SETTIMANA (C4)=2;"8";SE(GIORNO.SETTIMANA(C4)=3;"8";SE(GIORNO .SETTIMANA(C4)=4;"8";SE(GIORNO.SETTIMANA(C4)=5;"8" ;SE(GIORNO.SETTIMANA(C4)=6;"7";SE(GIORNO.SETTIMANA (C4)=7;"0")))))))
    PERò ADESSO NON RIESCO A SOMMARE I RISULTATI
    CON LA FORMULA SOMMA DA SEMPRE 0 COME RISULTATO
    HO PROVATO ANCHE A CAMBIARE FORMATO ALLE CELLE MA è SEMPRE UGUALE

Segnalibri

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •