PDA

Visualizza versione completa : Importare file CSV


Gianca53
31-10-2017, 14.10.23
Ciao, sono nuovo di questo forum e spero di trovare risposte che non ho trovato altrove.
Il mio problema è di riuscire a scaricare dati da un sito WEB, adottando, se possibile una procedura VBA che mi permetta di avere una tabella CSV che poi provvederò ad elaborare importando alcuni dati in excel.

Ho trovato questa macro :
Sub transfercsv()
Dim tk As String, r As Integer
Dim SH1 As Worksheet
'Dim WSW As Worksheet

Set SH1 = ThisWorkbook.Sheets("CSV")
Range("A2") = tk

'FinalRow = SH1.Cells(Rows.Count, 1).End(xlUp).Row

'For r = 2 To FinalRow

SH1.Range("A10:A300").EntireRow.Clear
'http://financials.morningstar.com/ajax/ReportProcess4CSV.html?t=KO&reportType=bs&period=12&dataType=A&order=asc&columnYear=5&number=3"

sCSVLink = "http://financials.morningstar.com/ajax/ReportProcess4CSV.html?t=tk&reportType=bs&period=12&dataType=A&order=asc&columnYear=5&number=3"
'
sfile = "options_code_list.csv"
ssheet = "CSV"

Set wnd = ActiveWindow
Application.ScreenUpdating = False
Sheets(ssheet).Cells.ClearContents
Workbooks.Open Filename:=sCSVLink
Windows(sfile).Activate
ActiveSheet.Cells.Copy
wnd.Activate
Sheets("CSV Transfer").Paste
Application.DisplayAlerts = False
Windows(sfile).Close False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
'Next
End Sub



che, se al posto di tk(ticker), inserisco nella URL di ricerca l'acronimo di un titolo usa , per. es CSCO, funziona bene, ma dato che vorrei associare la ricerca e lo scarico al contenuto della cella "a2" , con tk mi restituisce un foglio CSV bianco. Come a dire che non trova il mio titolo . Ci sto girando attorno da tre giorni senza venirne a capo :wall:

Se preferite posso allegare il file excel con la macro già inserita.

ZeroKelvin
01-11-2017, 17.35.18
Ciao.
Senza entrare nel merito del resto del codice, credo proprio che l'errore stia in

Range("A2") = tkche assegna alla cella A2 il valore di tk(che è ancora vuoto); in base a quello che scrivi dovrebbe essere

tk = Range("A2")

Gianca53
01-11-2017, 21.25.05
Grazie della risposta, ma ho provato e non funziona, ovvero funziona a metà, vale a dire che mi identifica il tk ( abbreviazione di "ticker") come acronimo di un titolo USA realmente esistente. Ho provato a cambiarlo ma mi carica una pagina bianca .
Allego il file .

Gianca53
03-11-2017, 09.06.58
salvo qualcuno abbia trovato la soluzione , altrimenti lasciate perdere , ho risolto diversamente. Grazie comunque.

RunDLL
03-11-2017, 16.30.05
Potresti dire anche come, già che ci sei.

ZeroKelvin
03-11-2017, 17.55.43
C'è anche un altro errore in:
sCSVLink = "http://financials.morningstar.com/ajax/ReportProcess4CSV.html?t=tk&reportType=bs&period=1 2&dataType=A&order=asc&columnYear=5&number=3"hai inserito tk all'interno della stringa fra doppi apici.
In questo modo tk non viene trattata come una variabile ma come semplice testo.
Doveva essere
sCSVLink = "http://financials.morningstar.com/ajax/ReportProcess4CSV.html?t=" & tk & "&reportType=bs&period=1 2&dataType=A&order=asc&columnYear=5&number=3"

Gianca53
03-11-2017, 21.59.44
Ho fatto in modo da "aggirare l'ostacolo" ovvero in riferimento a una ipotetica cella "D3" ho inserito questa if , e il bello è che funziona pure .

=SE($D$3="";"Enter ticker first";COLLEG.IPERTESTUALE("http://financials.morningstar.com/ajax/ReportProcess4CSV.html?&t="&D3&"&region=phl&culture=en-US&cur=&reportType=bs&period=12&dataType=A&order=asc&columnYear=5&curYearPart=1st5year&rounding=1&view=raw&r=408484&denominatorView=raw&number=1";"Export CSV"))

come pure funziona la macro che avevo inserito nel file sopra rivista e corretta come da segnalazione di ZeroKelvin che ovviamente ringrazio.

Alexsandra
03-11-2017, 22.36.08
Non capisco perchè csv, quando puoi avere i dati in un file excel con qualche riga di codice.

Sub transfercsv()
Dim tk, sCSVLink As String
tk = Range("A2")

ActiveSheet.Range("A10:A300").EntireRow.Clear
sCSVLink = "http://financials.morningstar.com/ajax/ReportProcess4CSV.html?t=tk&reportType=bs&period=12&dataType=A&order=asc&columnYear=5&number=3"

Workbooks.Open Filename:=sCSVLink

End Sub

Gianca53
05-11-2017, 08.20.40
Grazie Alexandra, ho risolto cosi :
Private Sub Trasfercsv_Click()
Dim tk, sCSVLink As String
tk = Range("A2")

ActiveSheet.Range("G1:M300").Clear
sCSVLink = "http://financials.morningstar.com/ajax/ReportProcess4CSV.html?t=" & tk & "&reportType=bs&period=12&dataType=A&order=asc&columnYear=5&number=3"

Workbooks.Open Filename:=sCSVLink
Macro1

End Sub

e in un modulo ho inserito :
Sub Macro1()
'

Application.WindowState = xlNormal
Windows("ReportProcess4CSV.html").Activate
Range("A1:F50").Select
Selection.Copy
Windows("Trasfert2_Alexa.xlsm").Activate
Range("G1").Select
ActiveSheet.Paste
Windows("ReportProcess4CSV.html").Activate
Application.CutCopyMode = False
Selection.ClearContents
Windows("ReportProcess4CSV.html").Activate
'ActiveWorkbook.Close
Application.DisplayAlerts = False
ActiveWindow.Close False


Range("C1").Select

End Sub


in questo modo ottengo la copia direttamente sul foglio. Quest'ultima macro, ottenuta con il "pilota automatico", è poco elegante rileggendola ho visto che è un po' ridondante per un eccesso di activate e select, però sembra funzionare .

Alexsandra
05-11-2017, 18.38.54
Prova così

Sub Trasfercsv()
Dim tk, sCSVLink As String
tk = Range("A2")

ActiveSheet.Range("G1:M300").Clear
sCSVLink = "http://financials.morningstar.com/ajax/ReportProcess4CSV.html?t=" & tk & "&reportType=bs&period=12&dataType=A&order=asc&col umnYear=5&number=3"

Workbooks.Open Filename:=sCSVLink

Workbooks("ReportProcess4CSV.html").Sheets("ReportProcess4CSV").Range("A1:F50").Copy _
Destination:=Workbooks("Cartel1.xlsm").Sheets("Foglio1").Range("G1")

ActiveWorkbook.Close
End Sub

oppure in questo modo

Sub Trasfercsv()
Dim tk, sCSVLink As String
tk = Range("A2")

ActiveSheet.Range("G1:M300").Clear
sCSVLink = "http://financials.morningstar.com/ajax/ReportProcess4CSV.html?t=" & tk & "&reportType=bs&period=12&dataType=A&order=asc&col umnYear=5&number=3"

Workbooks.Open Filename:=sCSVLink
Call prova
ActiveWorkbook.Close
End Sub

Sub prova()
Set wk1 = Workbooks("ReportProcess4CSV.html")
Set wk2 = Workbooks("Cartel1.xlsm")
Set sh1 = wk1.Worksheets("ReportProcess4CSV")
Set sh2 = wk2.Worksheets("Foglio1")

With sh1
.Range("A1:F50").Copy Destination:=sh2.Range("G1")
End With

Set sh2 = Nothing
Set sh1 = Nothing
Set wk1 = Nothing
Set wk2 = Nothing
End Sub

devi cambiare il riferimento al file, io per provare ho messo Cartel1, tu devi mettere il tuo.(Trasfert2_Alexa.xlsm)
La 1° soluzione la trovo più lineare (e meno codice da scrivere) la 2° è più veloce e professionale.

Gianca53
05-11-2017, 20.43.32
Grazie Alexandra, entrambe impeccabili, ora mi aiuti a costruire una macro per ... decidere quale delle due utilizzare ???? :inn:

Ancora grazie .

Alexsandra
06-11-2017, 20.27.55
io userei la 1°, semplice, spartana ma efficace.