Questione di Grafici



  • Questione di Grafici
    di Mauro (utente non iscritto) data: 11/10/2012 21:29:05

    Nuovo progetto :

    ho 9 colonne in un report xls denominato Foglio1 (Alimentari, Abbigliamento etc) che mi indicano le voci di spesa che intendo monitorare.

    Questo report mi indica i totali per ogni riga ( ne prendo 35 come esempio giorno dell'anno ) . Una volta creato il report voglio sviluppare il grafico. Il problema è che non mi da nessun messaggio d'errore ma non mi apre il grafico.... sembra banale la cosa ma vorrei capire dove sbaglio.

    Aiutoooooooooooooo !!!!!!
     
    Private Sub cmdGeneraGrafico_Click()
    Dim strColonnaB As String
    Dim strColonnaC As String
    Dim strColonnaD As String
    Dim strColonnaE As String
    Dim strColonnaF As String
    Dim strColonnaG As String
    Dim strColonnaH As String
    Dim strColonnaI As String
    Dim strColonnaJ As String
    Dim strFoglio As String
    Dim i As Integer
    Dim intNumeroRighe As Integer
    Dim strAutoH As Integer
    Dim strIntervallo As Integer
    strFoglio = ActiveSheet.Name
    For i = 2 To 35
        If Range("A" & i) = "" Then intNumeroRighe = i - 2
        Exit For
        End
     Next
     If ChkAlimentari.Value = True Then strColonnaB = "B1 : B" & intNumeroRighe & ","
     End
     If ChkAbbigliamento.Value = True Then strColonnaC = "C1 : C" & intNumeroRighe & ","
     End
     If ChkSvago.Value = True Then strColonnaD = "D1 : D" & intNumeroRighe & ","
     End
     If ChkLibri.Value = True Then strColonnaE = "E1 : E" & intNumeroRighe & ","
     End
     If ChkViaggi.Value = True Then strColonnaF = "F1 : F" & intNumeroRighe & ","
     End
     If ChkCasa.Value = True Then strColonnaG = "G1 : G" & intNumeroRighe & ","
     End
     If ChkAuto.Value = True Then strAutoH = "H1 : H" & intNumeroRighe & ","
     End
     If ChkVarie.Value = True Then strColonnaI = "I1 : I" & intNumeroRighe & ","
     End
     If ChkTotali.Value = True Then strColonnaJ = "J1 : J" & intNumeroRighe & ","
     End
     
     strIntervallo = "A1:A" & intNumeroRighe & "," & strColonnaB & strColonnaC & strColonnaD & _
     strColonnaE & strColonnaF & strColonnaG & strColonnaH & strColonnaI & strColonnaJ
     strIntervallo = Left(strIntervallo, Len(strIntervallo) - 1)
     Range(strIntervallo).Select
     Charts.Add
     ActiveChart.ChartType = xlColumnClustered
     ActiveChart.Location Where:=xlLocationAsObject, Name:=strFoglio
     With ActiveChart
     .HasTitle = True
     .ChartTitle.Characters.Text = "Spese" & strFoglio
     .Axes(xlCategory, xlPrimary).HasTitle = False
     .Axes(xlValue, xlPrimary).HasTitle = False
     End With
     ActiveChart.Axes(xlCategory).Select
     Selection.TickLabels.AutoScaleFont = True
     
     With Selection.TickLabels.Font
     .Name = "Arial"
     .FontStyle = "Normale"
     .Size = 8
     .Strikethrough = False
     .Superscript = False
     .Subscript = False
     .OutlineFont = False
     .Shadow = False
     .Underline = xlUnderlineStyleNone
     .ColorIndex = xlAutomatic
     .Background = xlAutomatic
     End With
     End Sub



  • di Vecchio Frac data: 11/10/2012 22:35:08

    Rileggi bene con attenzione il codice...
    A un certo punto tu intimi un "End" che in modo perentorio fa fermare l'esecuzione di tutto il codice...
    Excel termina la macro e se ne esce tranquillamente lasciandoti con un palmo di naso ^_^

    --> If ChkAlimentari.Value = True Then strColonnaB = "B1 : B" & intNumeroRighe & ","
    --> End

    E' tutta quella sfilza di "End" che *non* va bene. Toglili tutti.
    Pure l'End dopo l'Exit For non ci va. Solo che lì non fa danni, perchè l'Exit For non fa arrivare neppure l'esecuzione al punto di End, uscendo prima; ergo: qui nessun problema (ma toglilo ugualmente).
    Se intendevi terminare il blocco If, la corretta istruzione è End If, non soltanto End; ma in questo tuo caso l'End If non serve perchè scrivi l'If tutto su una riga (se proprio vuoi allungare il codice fai un ritorno a capo dopo ogni Then).

    Comunque qui ci sarebbe bisogno di una bella pulitina... il codice è piuttosto alambiccato (e non è un'ofefsa ^_^)





  • Questione di Grafici
    di Mauro (utente non iscritto) data: 11/10/2012 22:50:46

    Grazie Vecchio Frac sei grande.... ok ho tolto tutti gli End ma adesso ho un altro problema errore run time 13 evidenziando questa parte di codice :

    strIntervallo = "A1:A" & intNumeroRighe & "," & _
    strColonnaB & strColonnaC & strColonnaD & _
    strColonnaE & strColonnaF & _
    strColonnaG & strColonnaH & _
    strColonnaI & strColonnaJ


    ti allego la sintessa fin'ora eseguita
     
    Private Sub cmdGeneraGrafico_Click()
    Dim strColonnaB As String
    Dim strColonnaC As String
    Dim strColonnaD As String
    Dim strColonnaE As String
    Dim strColonnaF As String
    Dim strColonnaG As String
    Dim strColonnaH As String
    Dim strColonnaI As String
    Dim strColonnaJ As String
    Dim strFoglio As String
    Dim i As Integer
    Dim intNumeroRighe As Integer
    Dim strAutoH As Integer
    Dim strIntervallo As Integer
    strFoglio = ActiveSheet.Name
    For i = 2 To 35
        If Range("A" & i) = "" Then intNumeroRighe = i - 2
        Exit For
        
     Next
     If ChkAlimentari.Value = True Then strColonnaB = "B1 : B" & intNumeroRighe & ","
     
     If ChkAbbigliamento.Value = True Then strColonnaC = "C1 : C" & intNumeroRighe & ","
     
     If ChkSvago.Value = True Then strColonnaD = "D1 : D" & intNumeroRighe & ","
     
     If ChkLibri.Value = True Then strColonnaE = "E1 : E" & intNumeroRighe & ","
     
     If ChkViaggi.Value = True Then strColonnaF = "F1 : F" & intNumeroRighe & ","
     
     If ChkCasa.Value = True Then strColonnaG = "G1 : G" & intNumeroRighe & ","
     
     If ChkAuto.Value = True Then strAutoH = "H1 : H" & intNumeroRighe & ","
     
     If ChkVarie.Value = True Then strColonnaI = "I1 : I" & intNumeroRighe & ","
     
     If ChkTotali.Value = True Then strColonnaJ = "J1 : J" & intNumeroRighe & ","
     
     
     strIntervallo = "A1:A" & intNumeroRighe & "," & _
        strColonnaB & strColonnaC & strColonnaD & _
        strColonnaE & strColonnaF & _
        strColonnaG & strColonnaH & _
        strColonnaI & strColonnaJ
     strIntervallo = Left(strIntervallo, Len(strIntervallo) - 1)
     Range(strIntervallo).Select
     Charts.Add
     ActiveChart.ChartType = xlColumnClustered
     ActiveChart.Location Where:=xlLocationAsObject, Name:=strFoglio
     With ActiveChart
     .HasTitle = True
     .ChartTitle.Characters.Text = "Spese" & strFoglio
     .Axes(xlCategory, xlPrimary).HasTitle = False
     .Axes(xlValue, xlPrimary).HasTitle = False
     End With
     ActiveChart.Axes(xlCategory).Select
     Selection.TickLabels.AutoScaleFont = True
     
     With Selection.TickLabels.Font
     .Name = "Arial"
     .FontStyle = "Normale"
     .Size = 8
     .Strikethrough = False
     .Superscript = False
     .Subscript = False
     .OutlineFont = False
     .Shadow = False
     .Underline = xlUnderlineStyleNone
     .ColorIndex = xlAutomatic
     .Background = xlAutomatic
     End With
     End Sub



  • di Vecchio Frac data: 12/10/2012 08:32:05

    Probabilmente intNumeroRighe viene settato a zero o a numero negativo, e quindi rompe il range che non può avere un riferimento di riga 0 o negativo.
    Dobbiamo rivedere un pochino la struttura del codice, magari insieme.
    Errata corrige, con scuse da parte mia: dopo l'Exit For iniziale rimetti End If (qui sì ci vuole perchè il blocco If altrimenti non viene chiuso correttamente).





  • di Vecchio Frac data: 12/10/2012 16:09:56

    Leggendo il codice sono quasi sicuro adesso di confermarti che il problema nel riferimento a intNumeroRighe.
    Cambia il pezzo di codice incriminato come segue, anche se penso che dovremo rivedere tutta la struttura della macro.
    Fai sapere :)

     
    For i = 2 To 35
        If Range("A" & i) = "" Then 
            intNumeroRighe = i - 2
            Exit For
        End If
    Next
    intNumeroRighe = intNumeroRighe + 1





  • Questione di Grafici
    di Mauro (utente non iscritto) data: 12/10/2012 20:45:37

    Grazie Vecchio Frac, ma niente da fare neanche questa volta.

    Ti posso inviare il file se vuoi provare sto utilizzando Windows 7.

    Mauro




  • di Vecchio Frac data: 12/10/2012 21:34:23

    Certo, zippalo e allegalo qui (Nuova risposta --> Allega un file).
    Domani ci darò un'occhiata volentieri.




  • Questione di Grafici
    di Mauro (utente non iscritto) data: 12/10/2012 21:59:26

    Ok



  • di HarryBosch data: 13/10/2012 04:22:13

    Ok, finché voi dormite io mi intrometto nel thread :)

    Intanto un bravo a Mauro che usa l'Option Explicit!
    E anche per il codice, che tutto sommato qualcosa avrebbe prodotto; si arenava per un semplicissimo motivo:
    - avevi assegnato alla variabile "strIntervallo" as integer, ma non è di certo un numero! Andava usato as String
    - sistemato questo, il codice ti genera il grafico, e pure corretto: ma oltre alle righe dei dati, considera anche molte righe vuote e quindi decisamente inutili; questo perchè all'inizio imposti un ciclo che arriva a 35, di cui non ho ben capito l'utilizzo. Per trovare il totale delle righe scritte ci sono vie molto più semplici.
    - inoltre è opportuno chiudere la form al termine del lavoro, con un semplice Me.Hide

    Ti riallego invece il file dove ho inserito una variante fino alla determinazione delle colonne da selezionare; prova a vedere se riesci a carpirne il meccanismo (ps: allo scopo, ho modificato leggermente il nome delle checkbox... sarà l'ora che mi fa venire queste idee).

    La parte finale del codice, relativa alla visualizzazione del grafico, l'ho lasciata al tuo divertimento.
    Ho anche fatto in modo che all'apertura della Form tutte le check siano vuote.



  • di Vecchio Frac data: 13/10/2012 09:02:59

    Vanni il Nottambulo colpisce ancora ^_^
    Ottimo ma con una precisazione:
    cit. " con un semplice Me.Hide "
    --> io preferirei Unload Me, perchè così annienti l'oggetto Userform e liberi la memoria, a meno che in una successiva elaborazione del foglio (un altro pulsante sul foglio per esempio) non intendi resuscitare con gli stessi dati l'userform, nel qual caso lo riprendi con Userform1.Show,




  • Questione di Grafici
    di Mauro (utente non iscritto) data: 13/10/2012 09:09:13

    Grazie ad entrambi ragazzi ora gira tutto perfettamente.



  • di Vecchio Frac data: 13/10/2012 09:16:28

    cit. " avevi assegnato alla variabile "strIntervallo" as integer, ma non è di certo un numero! Andava usato as String "
    --> LOL, era così evidente che non l'ho neppure notato :) gli errori più subdoli sono anche quelli che non si vedono!





  • di HarryBosch data: 13/10/2012 12:00:54

    Per questo "amo" i Forum!
    Per quanto tempo sarei andato avanti senza sapere l'esatta differenza tre Me.Hide e Unload Me?

    E anch'io non mi ero accorto subito di quella variabile! L'ho notata solo quando ho cominciato a far "pulizia" delle Dim che non utilizzavo...


  • Questione di Grafici
    di Mauro (utente non iscritto) data: 13/10/2012 15:06:00

    Non parlate troppo difficile se no non vi capisco ....



  • di Vecchio Frac data: 13/10/2012 16:01:11

    @Mauro
    Allora fermiamoci un attimo.
    Cos'è che non è chiaro?

    Vanni dice: cit. " avevi assegnato alla variabile "strIntervallo" as integer, ma non è di certo un numero! Andava usato as String "
    ---> Ogni variabile è un contenitore di un determinato tipo. Ci sono tipi predefiniti: tipi oggetto, tipi numero, tipi stringa e tipi indefiniti. I tipi numero a loro volta possono essere interi corti o lunghi, interi estesi, con virgola in precisione singola e doppia, decimali, valuta, data e ora. I tipi stringa invece sono quelli alfanumerici e contengono testo (e anche numeri trattati come testo), solitamente si indicano tra virgolette doppie. 15 è un numero, 15.5 è un numero con virgola, mentre "15" è un stringa di testo (VBA poi ammette le conversioni implicite, spesso pericolose, ma questo è un altro discorso).
    Si dichiarano le variabili all'inizio del programma assegnando loro un nome e un tipo:
    Dim i as Integer, testo as string, doppio as Double.
    Per regola non si devono mescolare operatori di tipo diverso nelle espressioni:
    per riprendere l'esempio appena fatto, un'istruzione come
    testo = "ciao"
    i = testo + 4
    non va bene (VBA la farà funzionare lo stesso se testo vale ad esempio "5", e questo è uno dei problemi più grossi per un linguaggio di questo genere).

    Tornando al tuo codice, strIntervallo era stata dichiarata come Integer nella Dim ma poi le era stato assegnato un valore di tipo Stringa qui:
    strIntervallo = "A1:A" & .....

    Option Explicit aiuta a sollevare errori di questo genere, ma non succede sempre :)

    Sull'Unload, questa è una semplice istruzione che scarica dalla memoria il form, mentre Hide lo chiude semplicemente ma lo mantiene vivo in memoria, occupandone spazio. Chiaramente uscendo da Excel lo spazio allocato viene tutto liberato :)




  • Questione di Grafici
    di Mauro (utente non iscritto) data: 13/10/2012 16:41:46

    Vecchio Frac volevo dire che il vostro grado di preparazione supera di molto il mio che sono appena agli inizi non tanto nella dichiarazione della variabile che in effetti lo sottovalutata, ma in tutte le altre componenti con le varie sfaccettature




  • di Vecchio Frac data: 13/10/2012 20:03:22

    (parlo per me) il grado di preparazione raggiunto è frutto esclusivamente di esperienza, prove, tentativi, errori e ricopiatura di codice altrui. Con l'avvento di Internet e Google la mia capacità di acquisire informazioni e conoscenze si è ampliata tantissimo, ma ahimè l'elasticità mentale per comprendere le nuove tecnologie (in primis i nuovi Office) invece è molto diminuita :)
    In breve: Word, Excel, Outlook etc. 2007-2010 non mi piacciono :P