Condividi:        

Importare CSV in sequenza -crea grafico-richiudi e ripeti

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

Importare CSV in sequenza -crea grafico-richiudi e ripeti

Postdi Gianca532011 » 30/05/22 16:24

Ciao, come da titolo devo importare in sequenza una serie di file CSv precedentemente scaricati via Selenium

Successivamente, premendo il pulsante "Grafico dati storici Automatico" , vorrei ottenere in sequenza il carico degli stessi csv, sempre con riferimento ai ticker presenti da A6 in poi di fo Isin, con una successione continua e con questa logica di lavoro:
- apri csv n.1 ,
- applica la macro di creazione del grafico,
- attendi qualche secondo,
- cancella dati e cancella grafico,
- riprendi dal secondo CSV e cosi via .

Dov'è il problema ? la sequenza di carico dei file CSV e relativi grafici in sequenza non è corretta = non funziona a dovere e il grafico non si completa con la elaborazione delle medie.
Da notare che la macro che mette in grafico i dati funziona correttamente per un singolo Ticker, va in tilt quando tento di applicare la sequenza .
Scopo di tutto ciò e avere una rappresentazione grafica - medie comprese - dei dati storici presenti nei CSV, in sequenza .
Sotto la macro incriminata e la cartella con i file di riferimento .
https://ufile.io/in7ewtuz

Codice: Seleziona tutto
Option Explicit

Sub ImportCSVFile() ' automatico
    Dim Ws1 As Worksheet, Ws2 As Worksheet, Ws3 As Worksheet
    Dim Ticker As String
    Dim fileName As String
    Dim uR As Integer
    Dim lR As Long
    Dim i As Integer
    Dim Dest As Range
    Dim Rng As Integer
    Dim cartella As String
    Dim wbOpen As Workbook
    Dim NomeFoglio, uRow As Long
   
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
   
    Set Ws1 = Sheets("DatiY")
    Set Ws2 = Sheets("Storico_CSV")
    Set Ws3 = Sheets("Isin")
   
    Const strPath As String = "C:\Test\"
    ' questo è il ciclo che scansiona gli isin prenti in A6 e segg. di fo Isin
   
    'With Ws3
       
        uR = Ws3.Cells(Rows.Count, "A").End(xlUp).Row
       
        For i = 6 To uR
               Ws2.Unprotect
        Ws3.Unprotect
               Ws2.Range("K1:R1000").ClearContents
               cancella_grafico_E_dati
           
            Ticker = Ws3.Range("A" & i)
            If Ticker = "" Then Exit Sub
            fileName = Dir(strPath & Ticker & ".csv")             ' percorso completo
            Set wbOpen = Workbooks.Open(strPath & fileName)
            uRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
            ActiveSheet.Range("A1:G" & uRow).Copy
            NomeFoglio = ActiveSheet.Name

            Windows("1_ETF multi isin_Ya dDiretto (6)_Auto_test.xlsm").Activate    ' cambiare
            Ws1.Range("$a$1").PasteSpecial
            Ws1.Range("$I$1") = NomeFoglio
           
            Ws1.Columns("B:g").NumberFormat = "0.000"
            Ws1.Columns("A:G").AutoFit
'-----------------------------------------------------------------------------------
'copia1
          Dim uR2 As Long
     Ws2.Unprotect
   
    With Ws2
        .Range("K:Q").ClearContents
    End With
   
    uR2 = Ws1.Range("A" & Rows.Count).End(xlUp).Row
    Ws1.Range("A1:G" & uR2).Copy
    Ws2.Range("K1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
   
            Ws1.Range("i1").Copy Destination:=Ws2.Range("A1")
    Ws2.Range("A1").Value = Ws1.Range("I1").Value
     
    Call RowKiller
    Call AnalyzeData
     
  '---------------------------------------------------------------------------------------------------
       Application.Wait (Now + TimeValue("00:00:05"))
               
           
            Add_Chart
            Application.Wait (Now + TimeValue("00:00:10"))
                 
           
       
        wbOpen.Close
            fileName = Dir
   i = i + 1
        Next i
       
   ' End With
   
    'MsgBox ("Finito")
    Ws2.Protect
    Set Ws1 = Nothing
    Set Ws2 = Nothing
   
End Sub


Private Sub RowKiller()
     
    Dim Col As String, n As Long, i As Long
   
    Dim Y As New DataObject  ' macro copia data solo testo , no formula
    Sheets("Storico_CSV").Unprotect
    Sheets("Storico_CSV").Activate
     
    Range("$j$3").Clear
    Y.SetText [V2].Value             ' dato di origine
    Y.PutInClipboard
    Sheets("Storico_CSV").Range("J$3").Select
    Y.GetFromClipboard
    ActiveCell = Y.GetText
   
    Col = "L"
    n = Cells(Rows.Count, Col).End(xlUp).Row
    For i = n To 1 Step -1
        If Cells(i, Col).Value = "null" Then
            Cells(i, Col).EntireRow.Delete
        End If
    Next i
    Sheets("Storico_CSV").Protect
End Sub

Private Sub AnalyzeData()
    Dim i As Integer
    Dim LastRow As Integer
    Dim avReturn As Double
    Dim stDev As Double
    Dim vrnc As Double
   
    Sheets("Storico_CSV").Unprotect
    On Error Resume Next
   
    LastRow = Sheets("Storico_CSV").UsedRange.Row - 1 + Sheets("Storico_CSV").Range("U2")
    LastRow = Sheets("Storico_CSV").Cells(Rows.Count, 11).End(xlUp).Row
    Sheets("Storico_CSV").Range("S1") = "Daily Returns"   'ex J1
    Sheets("Storico_CSV").Range("U1") = "# Data"  'ex L1

    Sheets("Storico_CSV").Range("U2") = LastRow   'ex L2
    For i = 3 To LastRow
       
        Sheets("Storico_CSV").Range("S" & i) = (Sheets("Storico_CSV").Range("O" & i - 1) - Sheets("Storico_CSV").Range("O" & i)) / Sheets("Storico_CSV").Range("O" & i - 1)
    Next i

    avReturn = Application.WorksheetFunction.Average(Sheets("Storico_CSV").Range("S2:S" & LastRow))
    stDev = Application.WorksheetFunction.StDev_P(Sheets("Storico_CSV").Range("S2:S" & LastRow))
    vrnc = Application.WorksheetFunction.Var_P(Sheets("Storico_CSV").Range("S2:S" & LastRow))

    Sheets("Storico_CSV").Range("H2") = avReturn
    Sheets("Storico_CSV").Range("H3") = stDev
    Sheets("Storico_CSV").Range("H4") = vrnc
    Resume
   
    Sheets("Storico_CSV").Protect
End Sub

Private Sub Add_Chart()
    Dim cht As Object
    Dim LastRow As Long
    Dim Rng1 As Range
    Dim shDest As Worksheet    'foglio in cui creare il grafico
    Set shDest = Worksheets("Storico_CSV")
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    shDest.Unprotect
    shDest.Activate
   
    With ActiveSheet
        LastRow = .Range("K" & .Rows.Count).End(xlUp).Row
        Set Rng1 = .Range("L2:L" & LastRow & ", K2:K" & LastRow)
    End With

    shDest.Range("B3") = Application.WorksheetFunction.CountA(Sheets("Storico_CSV").Range("K:K"))

    Set cht = ActiveSheet.ChartObjects.Add(Left:=Range("A7").Left + 7, Width:=800, Top:=Range("A7").Top, Height:=400)
 
    With cht
        .Chart.SetSourceData Source:=Rng1
        .Chart.ChartType = xlLine
        .Chart.FullSeriesCollection(1).Select
        With Selection.Format.Fill
            .Visible = msoTrue
            .ForeColor.RGB = RGB(0, 112, 192)
            .Transparency = 0
            .Solid
        End With
        With Selection.Format.Line
            .Visible = msoTrue
            .ForeColor.RGB = RGB(0, 112, 192)
            .Transparency = 0
        End With
        ActiveChart.PlotArea.Select
    End With

    With cht
        .Chart.FullSeriesCollection(1).Trendlines.Add
        .Chart.FullSeriesCollection(1).Trendlines(1).Select
        With Selection
            .Type = xlMovingAvg
            .Period = 200
        End With
        With Selection.Format.Line
            .Visible = msoTrue
            .ForeColor.RGB = RGB(112, 48, 160)
            .Transparency = 0
        End With
        With Selection.Format.Line
            .Visible = msoTrue
            .Weight = 1.75
        End With
        Selection.Format.Line.Style = msoLineSingle
        Application.CommandBars("Format Object").Visible = False
    End With
    With cht
        .Chart.FullSeriesCollection(1).Trendlines.Add
        .Chart.FullSeriesCollection(1).Trendlines(2).Select
        With Selection
            .Type = xlMovingAvg
            .Period = 50
        End With
        With Selection.Format.Line
            .Visible = msoTrue
            .ForeColor.RGB = RGB(255, 0, 0)
            .Transparency = 0
        End With
        With Selection.Format.Line
            .Visible = msoTrue
            .Weight = 1.75
        End With
        Selection.Format.Line.Style = msoLineSingle
     
    End With
    With cht
        .Chart.Legend.Select
        Selection.Position = xlLeft
        .Chart.Legend.IncludeInLayout = False
        .Chart.Legend.Select
        Selection.Position = xlTop
        .Chart.Legend.IncludeInLayout = True
    End With
    With cht
        .Chart.Axes(xlValue).Select
        Selection.TickLabels.NumberFormat = "0.00"
       
    End With
    With cht
        .Chart.HasTitle = True
        .Chart.ChartTitle.Text = Range("B1")
        Sheets("Storico_CSV").Protect
    End With
   
    Application.EnableEvents = True
     
    Application.ScreenUpdating = True
End Sub

Sub cancella_grafico_E_dati()
    Dim myChart As ChartObject
    Dim currSheet As Worksheet
    Dim tmpName As String
    Set currSheet = Sheets("Storico_CSV")
    currSheet.Unprotect
    If ActiveSheet.ChartObjects.Count > 0 Then
 
        For Each myChart In currSheet.ChartObjects
            tmpName = myChart.Name
            myChart.Delete
        Next
    End If
    Dim Ws1 As Worksheet
    Set Ws1 = Sheets("DatiY")
    Ws1.Range("A:G").Clear

End Sub

Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 348
Iscritto il: 27/05/11 10:18

Sponsor
 

Re: Importare CSV in sequenza -crea grafico-richiudi e ripet

Postdi Anthony47 » 30/05/22 19:14

Il tuo codice e’ alquanto articolato, non sono certo di aver replicato correttamente il tuo processo.

Comunque, senza entrare nei dettagli e nella logica della macro (avrei qualcosa da dire) io vedo
-in ImportCSVFile e’ insufficiente la pulizia dell’area utilizzata (Ws2.Range("K1:R1000").ClearContents) ho esteso quel 1000 a 10mila
-non capisco quel i = i + 1 subito prima di Next i; l’ho tolto altrimenti saltavi una riga sull’elenco di foglio Isin
-in cancella_grafico_E_dati, dopo che hai impostato Set currSheet = Sheets("Storico_CSV") in realta’ usi ActiveSheet.ChartObjects.Count; ho modificato in If currSheet.ChartObjects.Count > 0 Then
-in ImportCSVFile non ho capito a che serve quel Application.Wait (Now + TimeValue("00:00:05")); secondo me si puo’ eliminare
-In ImportCSVFile e’ vero che aggiorni il grafico (anzi prima lo elimini e poi lo ricrei) ma non chiedi mai l’aggiornamento dello schermo, pertanto il grafico creato non viene visualizzato.
-ho quindi insertito DoEvents: DoEvents tra Add_Chart e la successiva Application.Wait di 10 sec

Con queste modifiche io vedo le cose "girare", forse correttamente

Prova anche tu...
Avatar utente
Anthony47
Moderatore
 
Post: 19440
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare CSV in sequenza -crea grafico-richiudi e ripet

Postdi Gianca532011 » 30/05/22 21:23

Innanzitutto grazie.
Effettivamente gira meglio e riesco a vedere i grafici completi di medie mobili. Unica cosa che ancora non fila è il refresh a video dei dati CSV, ovvero mi apre una pagina per ogni ticker e poi procede con l'importazione sul foglio Storico_CSV.
Per non farle vedere che cosa consigli ?
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 348
Iscritto il: 27/05/11 10:18

Re: Importare CSV in sequenza -crea grafico-richiudi e ripet

Postdi Anthony47 » 31/05/22 15:43

Volendo "fluidificare" ho rivisto la tua Sub ImportCSVFile, in modo che non "Apra" i file csv ma li "Importi" nel foglio DatiY (a spanne direi che sarebbe possibili importarli direttamente su Storico_CSV, ma ci sono cose che non ho capito nella tua impostazione per cui tengo DatiY col suo contenuto).
Il nuovo codice della Sub ImportCSVFile:
Codice: Seleziona tutto
Sub ImportCSVFileAA() ' automatico
    Dim Ws1 As Worksheet, Ws2 As Worksheet, Ws3 As Worksheet
    Dim Ticker As String
    Dim uR As Integer
    Dim I As Integer
   
    Set Ws1 = Sheets("DatiY")
    Set Ws2 = Sheets("Storico_CSV")
    Set Ws3 = Sheets("Isin")
'
'    Const strPath As String = "C:\Test\"
    ' questo è il ciclo che scansiona gli isin prenti in A6 e segg. di fo Isin
        uR = Ws3.Cells(Rows.Count, "A").End(xlUp).Row
        For I = 6 To uR
            Ws2.Unprotect                               'Storico_CSV
            Ws3.Unprotect                               'ISIN
            Ws2.Range("K1:R10000").ClearContents
            cancella_grafico_E_dati
            Ticker = Ws3.Range("A" & I)
            If Ticker = "" Then GoTo mEx
            Call ImportToDatiY(Ticker)
'copia1
            Dim uR2 As Long
            Ws2.Unprotect                           'Storico_CSV
            Ws2.Range("K:Q").ClearContents
            uR2 = Ws1.Range("A" & Rows.Count).End(xlUp).Row
            Ws1.Range("A1:G" & uR2).Copy Ws2.Range("K1")            'da DatiY a Storico_CSV
            Ws2.Range("A1").Value = Ws1.Range("i1")  '
           
            Call RowKiller
            Call AnalyzeData
  '---------------------------------------------------------------------------------------------------
            Application.Wait (Now + TimeValue("00:00:01"))
            Add_Chart
            DoEvents: DoEvents
            Application.Wait (Now + TimeValue("00:00:10"))
        Next I
mEx:
    'MsgBox ("Finito")
    Ws2.Protect
    Set Ws1 = Nothing
    Set Ws2 = Nothing
End Sub

Va messo sul modulo StoricoYaAuto (perche' usa le tue Sub RowKiller (che non ho capito perche' e' così complicata), Sub AnalyzeData e Sub Add_Chart che tu hai dichiarato Private e io non ho toccato.
Richiede pero' l'aggiunta di questa sub, che si occupa di Importare il file:
Codice: Seleziona tutto
Sub ImportToDatiY(csvFile As String)
Dim dSh As Worksheet, bPath As String
'
Set dSh = ThisWorkbook.Sheets("DatiY")
bPath = "C:\Test\"
Application.DisplayAlerts = False
On Error Resume Next
    dSh.Range("A:P").Clear
    dSh.QueryTables(1).Delete
On Error GoTo 0
Application.DisplayAlerts = True
'
dSh.Range("I1").Value = csvFile
    Application.CutCopyMode = False
    With dSh.QueryTables.Add(Connection:="TEXT;" & bPath & csvFile & ".csv", _
        Destination:=dSh.Range("$A$1"))
''        .CommandType = 0
        .Name = "myQT"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlOverwriteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(5, 1, 1, 1, 1, 1, 1)
        .TextFileDecimalSeparator = "."
        .TextFileThousandsSeparator = " "
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End Sub

Prova...
Avatar utente
Anthony47
Moderatore
 
Post: 19440
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare CSV in sequenza -crea grafico-richiudi e ripet

Postdi Gianca532011 » 01/06/22 14:24

Perfetto, come sempre.
Anthony, nel caso ti venisse il pallino di investire in ETF :oops: metto il file tua versione, ricordati di comperare quando il prezzo supera da sotto quindi con moto ascendente la media a 50 gg , oppure altri acquistano quando la media a 50 incrorcia da sotto la media 200 . Tutto al contrario per la vendita .

https://ufile.io/y9kbs5c8

Ps. per eventuali interessati ricordare che lo scarico dei CSV avviene tramite Selenium nella cartella C:\Test
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 348
Iscritto il: 27/05/11 10:18


Torna a Applicazioni Office Windows


Topic correlati a "Importare CSV in sequenza -crea grafico-richiudi e ripeti":


Chi c’è in linea

Visitano il forum: Nessuno e 38 ospiti