Condividi:        

VBA EXCEL 2003: problema creazione grafico

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

VBA EXCEL 2003: problema creazione grafico

Postdi valetremo » 30/06/14 17:26

Ciao a tutti ho questa necessità.

Ho un TOT di file .csv con dei dati ordinati sempre allo stesso modo e che occupano sempre lo stesso numero di celle.
I file .csv possono essere di due tipi i quali sono discriminabili dal contenuto della cella D1.

Quello che devo fare io è snellire il processo di creazione del grafico relativo ad ogni file .csv

per fare ciò, ho registrato una macro con le operazioni che devo effettuare prima della creazione del grafico, la creazione del grafico e l'editing del grafico

Da notare che il file csv contiene un unico foglio di lavoro che ha il nome del file stesso.

Ho creato una macro all'interno di personal per renderla utilizzabile sempre in excel e non nei singoli fogli di lavoro

Tutto questo lo faccio senza cliccare su SAVE altrimenti mi restituirebbe un ovvio errore in quanto il foglio non è più un csv.

Non conosco VBA mi arrangio con le risorse che trovo online :)

Mi da errore di runtime 9: indice non incluso nell'intervallo in questa riga

Codice: Seleziona tutto

 ActiveChart.SetSourceData Source:=Sheets("shtName").Range("A2:B8"), _
        PlotBy:=xlColumns



inoltre il grafico non viene creato sul foglio di lavoro attivo, ma viene creato un nuovo foglio di lavoro-grafico :evil:

al momento sto testando solo su un file csv nella prima condizione dell'IF.

Questa la mia macro:

Codice: Seleziona tutto

Sub grafici()

' visto che il nome del mio foglio è sempre diverso creo una variabile che memorizzi il nome del foglio di lavoro

Dim shtName As String

shtName = ActiveSheet.Name



    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)), TrailingMinusNumbers:= _
        True
    Columns("A:A").EntireColumn.AutoFit
    Range("A2").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("A3").Select
    ActiveCell.FormulaR1C1 = "2"
    Range("A4").Select
    ActiveCell.FormulaR1C1 = "3"
    Range("A5").Select
    ActiveCell.FormulaR1C1 = "4"
    Range("A6").Select
    ActiveCell.FormulaR1C1 = "5"
    Range("A7").Select
    ActiveCell.FormulaR1C1 = "6"
    Range("A8").Select
    ActiveCell.FormulaR1C1 = "7"
    Range("A9").Select
    Windows("altro-foglio.xls").Activate
    Selection.Copy
    Windows(1).ActivatePrevious
    Range("A2:A8").Select
    Selection.PasteSpecial paste:=xlPasteAll, Operation:=xlDivide, SkipBlanks _
        :=False, Transpose:=False
   

' qui verifico il contenuto della cella D1   
       
        If Range("D1") = "(Pa)" Then
       
       
    Range("D2").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "100"
    Range("D2").Select
    Selection.Copy
    Range("B2:B8").Select
    Selection.PasteSpecial paste:=xlPasteAll, Operation:=xlDivide, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False

' qui inizia la creazione del grafico

    Charts.Add
    ActiveChart.ChartType = xlXYScatter
    ActiveChart.SetSourceData Source:=Sheets("shtName").Range("A2:B8"), _
        PlotBy:=xlColumns
    ActiveChart.Location Where:=xlLocationAsObject, Name:="shtName"
   
    With ActiveChart
        .HasTitle = False
        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Titolo x"
        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Titolo y"
    End With
    With ActiveChart.Axes(xlCategory)
        .HasMajorGridlines = False
        .HasMinorGridlines = False
    End With
    With ActiveChart.Axes(xlValue)
        .HasMajorGridlines = False
        .HasMinorGridlines = False
    End With
    ActiveChart.HasLegend = False
    ActiveChart.PlotArea.Select
    With Selection.Border
        .ColorIndex = 16
        .Weight = xlThin
        .LineStyle = xlContinuous
    End With
    Selection.Interior.ColorIndex = xlNone
    ActiveChart.SeriesCollection(1).Select
    With Selection.Border
        .Weight = xlHairline
        .LineStyle = xlNone
    End With
    With Selection
        .MarkerBackgroundColorIndex = xlAutomatic
        .MarkerForegroundColorIndex = xlAutomatic
        .MarkerStyle = xlCircle
        .Smooth = False
        .MarkerSize = 8
        .Shadow = False
    End With
   
    Else
   
   [uguale alla parte prima salvo la parte in cui divido per 100]
   
    End If
   
   
End Sub





Cosa da l'errore?


Grazie
valetremo
Utente Junior
 
Post: 20
Iscritto il: 30/06/14 17:11

Sponsor
 

Re: VBA EXCEL 2003: problema creazione grafico

Postdi valetremo » 30/06/14 17:47

(ho finito i 15 minuti per l'editing)

NB: il grafico creato poi lo seleziono e con la stampante virtuale ne creo un pdf

opzionalmente si può salvare nella stessa cartella e con lo stesso nome il file csv in formato xls (magari gestito da macro sarebbe il top)
valetremo
Utente Junior
 
Post: 20
Iscritto il: 30/06/14 17:11

Re: VBA EXCEL 2003: problema creazione grafico

Postdi Anthony47 » 01/07/14 03:12

Ciao valetremo, benvenuto nel forum.
Per l' errore "indice non incluso nell'intervallo", visto che shtName e' una variabile e non una stringa devi usare
Codice: Seleziona tutto
ActiveChart.SetSourceData Source:=Sheets(shtName).Range("A2:B8"), _
        PlotBy:=xlColumns


Il grafico viene creato su un foglio "Grafico" perche' questo significa l' istruzione "Charts.Add".

Registra una macro mentre inserisci un grafico nel foglio corrente e avrai il codice base da usare.

Ciao, fai sapere se risolvi o spiega dove arrivi e dove invece ti sei arenato...
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: VBA EXCEL 2003: problema creazione grafico

Postdi valetremo » 01/07/14 08:45

Anthony47 ha scritto:Ciao valetremo, benvenuto nel forum.
Per l' errore "indice non incluso nell'intervallo", visto che shtName e' una variabile e non una stringa devi usare
Codice: Seleziona tutto
ActiveChart.SetSourceData Source:=Sheets(shtName).Range("A2:B8"), _
        PlotBy:=xlColumns


Il grafico viene creato su un foglio "Grafico" perche' questo significa l' istruzione "Charts.Add".

Registra una macro mentre inserisci un grafico nel foglio corrente e avrai il codice base da usare.

Ciao, fai sapere se risolvi o spiega dove arrivi e dove invece ti sei arenato...



Ciao!

Era proprio quello l'errore sia su questa riga che sulla seguente:

Codice: Seleziona tutto
ActiveChart.SetSourceData Source:=Sheets(shtName).Range("A2:B8"), _
            PlotBy:=xlColumns
        ActiveChart.Location Where:=xlLocationAsObject, Name:=shtName


Errore da novellino direi XD

La funzione charts.add andava bene perchè avevo registrato una macro facendogli creare il grafico nello stesso foglio e avevo verificato sul web che fosse giusto dopo where l'object.

questo problema è risolto. Grazie mille!

Il grafico poi va rifinito ma qui diventa più complicato. Provo a postarvi cosa dovrebbe succedere ma questo al limite lo posso fare a mano :)

Il foglio di lavoro ha un nome di questo tipo:

xx00-testo

Il titolo del grafico dovrebbe essere:

XX00

quindi togliere la parte "-testo" e mettere in maiuscolo XX

Codice: Seleziona tutto

With ActiveChart
            .HasTitle = True
            .ChartTitle.Characters.Text = shtName



come istruirlo affinché metta in maiuscolo e tolga la seconda parte del nome foglio?


Qui il difficile:

il grafico poi lo dovrei rifinire con la scala ma non so se sia possibile: devo dargli una scala che abbia un range minimo di 10 valori (esempio compresa tra 10 e 20), con valori multipli di 5 agli estremi (ok 15-25, 10-20, NO 23-33). In alcuni casi può essere che il range sia più alto di 10 (dipende dai valori), quindi ad esempio 10-30 o 15-30. Ovviamente il range è strettamente dipendente dai valori inseriti nel grafico. Ma questo posso farlo a mano.

Alla fine dovrei salvare il file csv come . xls (con lo stesso nome) su cui poi posso rilavorare senza rilanciare la macro perchè mi trovo il file formattato come voglio e il grafico già inserito e stampare il grafico come pdf.

Registrando la macro ottengo questo codice:

Codice: Seleziona tutto

ChDir "E:\cartella\CSV"
    ActiveWorkbook.SaveAs Filename:= _
        "E:\cartella\CSV\xx00-testo.xls" _
        , FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
        ReadOnlyRecommended:=False, CreateBackup:=False
    ActiveSheet.ChartObjects("Grafico 3").Activate
    ActiveChart.ChartArea.Select
    Application.ActivePrinter = "CutePDF Writer su CPW2:"
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:= _
        "CutePDF Writer su CPW2:", Collate:=True



dovrebbe salvare il file in formato xls nella stessa cartella del csv

il nome del grafico non sarà mai grafico3 ma penso grafico1 (ora il contatore è sballato perchè ho fatto delle prove) gli andrebbe detto "prendi l'unico grafico che trovi sulla pagina" :lol:

cutepdf dovrebbe salvare nella cartella chiamata PDF qui:

"E:\cartella\PDF"

Se è fattibile vi ringrazio per l'aiuto altrimenti mi arrangio come detto "a mano" :)
già così risparmio un po' di tempo!

Grazie
valetremo
Utente Junior
 
Post: 20
Iscritto il: 30/06/14 17:11

Re: VBA EXCEL 2003: problema creazione grafico

Postdi valetremo » 01/07/14 10:17

Allora,

Ho risolto da sola il problema del titolo del grafico in questo modo maccheronico:

Codice: Seleziona tutto

Range("H1") = shtName
   
    Range("H1").Select
   
    For Each cell In Selection
    If Not cell.HasFormula Then
    cell.Value = UCase(cell.Value)
    End If
    Next cell


......



If Range("D1") = "(Pa)" Then

    Range("H1").Select

Cells.Replace what:="-TESTO1", replacement:="", lookat:=xlPart _
, searchorder:=xlByRows, MatchCase:=False, searchformat:=False, _
ReplaceFormat:=False
   
    Else
   
   
    Cells.Replace what:="-TESTO2", replacement:="", lookat:=xlPart _
, searchorder:=xlByRows, MatchCase:=False, searchformat:=False, _
ReplaceFormat:=False

End If




Funziona quindi per me è ok :)

Le altre parti sto provando a sistemarle ma senza successo finora
valetremo
Utente Junior
 
Post: 20
Iscritto il: 30/06/14 17:11

Re: VBA EXCEL 2003: problema creazione grafico

Postdi Anthony47 » 01/07/14 13:01

Il fatto e' che io non ho capito su quali cose chiedi aiuto e su quali invece sei autonoma...

Per il titolo del grafico, basterebbe sostituire .ChartTitle.Characters.Text = shtName con
Codice: Seleziona tutto
If InStr(1, shtName, "-", 1) > 0 Then
   .ChartTitle.Characters.Text = UCase(Left(shtName, InStr(1, shtName, "-", 1) - 1))
Else
   .ChartTitle.Characters.Text = shtName
End If


Altri spunti casuali:
Per selezionare l' unico grafico del foglio, invece del nome usa l' Indice:
Codice: Seleziona tutto
ActiveSheet.ChartObjects(1).Activate

(se invece la parte "-testo" fosse fissa, cioe' sempre una stessa stringa, sarebbe anche piu' semplice).

Per impostare la scala dei valori dell' asse verticale del grafico selezionato, le istruzioni saranno del tipo
Codice: Seleziona tutto
    ActiveChart.Axes(xlValue).MinimumScale = 10

    ActiveChart.Axes(xlValue).MaximumScale = 50

    ActiveChart.Axes(xlValue).MajorUnit = 20

    ActiveChart.Axes(xlValue).MajorUnit = 10

    ActiveChart.Axes(xlValue).MinorUnit = 5


Per l' asse orizzontale, invece di Axes(xlValue) userai Axes(xlCategory)

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: VBA EXCEL 2003: problema creazione grafico

Postdi valetremo » 01/07/14 13:47

Anthony47 ha scritto:Il fatto e' che io non ho capito su quali cose chiedi aiuto e su quali invece sei autonoma...



Non conosco VBA. Parto sempre dal registrare la macro poi vedo su internet se trovo uno spunto sul come poter fare per modificare..
Ho delle nozioni terra terra di programmazione ma molto base e molto semplici.



Per il titolo del grafico, basterebbe sostituire .ChartTitle.Characters.Text = shtName con
Codice: Seleziona tutto
If InStr(1, shtName, "-", 1) > 0 Then
   .ChartTitle.Characters.Text = UCase(Left(shtName, InStr(1, shtName, "-", 1) - 1))
Else
   .ChartTitle.Characters.Text = shtName
End If





Sembra molto interessante, potresti spiegarmelo? Se non porta via troppo tempo ovviamente



Altri spunti casuali:
Per selezionare l' unico grafico del foglio, invece del nome usa l' Indice:
Codice: Seleziona tutto
ActiveSheet.ChartObjects(1).Activate

(se invece la parte "-testo" fosse fissa, cioe' sempre una stessa stringa, sarebbe anche piu' semplice).




Per impostare la scala dei valori dell' asse verticale del grafico selezionato, le istruzioni saranno del tipo
Codice: Seleziona tutto
    ActiveChart.Axes(xlValue).MinimumScale = 10

    ActiveChart.Axes(xlValue).MaximumScale = 50

    ActiveChart.Axes(xlValue).MajorUnit = 20

    ActiveChart.Axes(xlValue).MajorUnit = 10

    ActiveChart.Axes(xlValue).MinorUnit = 5


Per l' asse orizzontale, invece di Axes(xlValue) userai Axes(xlCategory)

Ciao


si questo ok, ma il mio range di valori non è fisso, quindi la macro dovrebbe leggere i valori sull'asse Y e impostare la scala in base ai valori che trova.. per questo dicevo che questa parte è un po' incasinata.

Cmq già ottenere il grafico con solo la scala da variare è un ottimo risultato per me, ho quasi finito :)

Grazie ancora
valetremo
Utente Junior
 
Post: 20
Iscritto il: 30/06/14 17:11

Re: VBA EXCEL 2003: problema creazione grafico

Postdi Anthony47 » 02/07/14 01:37

Per la spiegazione della macro:
-se il nome file contiene "-" verra' usata solo la parte a sx del "-"; altrimenti si usa il nome file.
Per i dettagli devi vedere nell' help on line del vba la descrizione delle istruzioni InStr, UCase, Left:
-mentre visualizzi il codice, metti il cursore "dentro" la parola che vuoi investigare (1 solo click), premi F1.

Quanto ai valori da assegnare alla scala degli assi, molto dipende dalla logica che vuoi realizzare...
Comunque, partendo dal presupposto che sai quale e' l' intervallo celle che corrisponde ai dati che poi riporti sul grafico (altrimenti non potresti creare il grafico), puoi ad esempio calcolare i valori minimi e massimi con istruzioni del tipo
Codice: Seleziona tutto
yMax = Application.WorksheetFunction.Max(IntervalloDiCelleAsseVericale)

yMin = Application.WorksheetFunction.Min(IntervalloDiCelleAsseVericale)


Per approfondimenti, leggere sull' help on line alla voce WorksheetFunction.

Spero sia di qualche utilita'...
Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: VBA EXCEL 2003: problema creazione grafico

Postdi valetremo » 02/07/14 08:36

Anthony47 ha scritto:Per la spiegazione della macro:
-se il nome file contiene "-" verra' usata solo la parte a sx del "-"; altrimenti si usa il nome file.
Per i dettagli devi vedere nell' help on line del vba la descrizione delle istruzioni InStr, UCase, Left:
-mentre visualizzi il codice, metti il cursore "dentro" la parola che vuoi investigare (1 solo click), premi F1.

Quanto ai valori da assegnare alla scala degli assi, molto dipende dalla logica che vuoi realizzare...
Comunque, partendo dal presupposto che sai quale e' l' intervallo celle che corrisponde ai dati che poi riporti sul grafico (altrimenti non potresti creare il grafico), puoi ad esempio calcolare i valori minimi e massimi con istruzioni del tipo
Codice: Seleziona tutto
yMax = Application.WorksheetFunction.Max(IntervalloDiCelleAsseVericale)

yMin = Application.WorksheetFunction.Min(IntervalloDiCelleAsseVericale)


Per approfondimenti, leggere sull' help on line alla voce WorksheetFunction.

Spero sia di qualche utilita'...
Ciao



Grazie mille per la disponibilità e l'aiuto :)

A Presto!
valetremo
Utente Junior
 
Post: 20
Iscritto il: 30/06/14 17:11


Torna a Applicazioni Office Windows


Topic correlati a "VBA EXCEL 2003: problema creazione grafico":


Chi c’è in linea

Visitano il forum: Ricky0185 e 42 ospiti