Excel VBA - data wegschrijven in 1 sheet ipv losse sheets

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Apolopo
  • Registratie: Januari 2018
  • Laatst online: 10-10 14:28
Ik gebruik een van internet geplukte Excel template om aandelenkoeren van Yahoo Finance te downloaden om vervolgens te gebruiken in een zelfgemaakte trading tool. De template is te vinden op http://investexcel.net/mu...ote-downloader-for-excel/.

De template download koersen van een vooraf opgegeven lijst tickers en schrijft de data van elke ticker in een aparte tab/sheet. Vervolgens schrijft een macro in de template de data van elke sheet/ticker naar een apart CSV bestand. Hierbij crasht de macro vaak bij grotere aantallen tickers (+5) met een 'subscript out of range' melding.

Het oplossen van deze crashes zou uiteraard fijn zijn, maar voor mijn workflow zou nog veel handiger zijn als de template de data van de tickers onder elkaar in 1 sheet zou zetten, met in de 1e kolom de tickername.

Ik heb volgens mij de module gevonden in het VBA script die de ticker data in aparte Excel sheets wegschrijft:

'Parse returned string into an array
'***************************************************
nColumns = 6 'number of columns minus 1 (date, open, high, low, close, adj close, volume)
csv_rows() = Split(resultFromYahoo, Chr(10))
ReDim resultArray(0 To UBound(csv_rows), 0 To nColumns) As Variant

For iRows = LBound(csv_rows) To UBound(csv_rows)
CSV_Fields = Split(csv_rows(iRows), ",")
If UBound(CSV_Fields) > nColumns Then
nColumns = UBound(CSV_Fields)
ReDim Preserve resultArray(0 To UBound(csv_rows), 0 To nColumns) As Variant
End If

For iCols = LBound(CSV_Fields) To UBound(CSV_Fields)
If IsNumeric(CSV_Fields(iCols)) Then
resultArray(iRows, iCols) = Val(CSV_Fields(iCols))
ElseIf IsDate(CSV_Fields(iCols)) Then
resultArray(iRows, iCols) = CDate(CSV_Fields(iCols))
Else
resultArray(iRows, iCols) = CStr(CSV_Fields(iCols))
End If
Next
Next

'Write results into worksheet for ticker
Sheets(stockTicker).Range("A2").Resize(UBound(resultArray, 1) + 1, UBound(resultArray, 2) + 1).Value = resultArray
'***********


Ik ben mij wel aan het inlezen in VBA, maar kom er nog niet uit hoe ik deze macro kan aanpassen zodat de tickerdata onder elkaar in 1 sheet kan worden weggeschreven, met in een extra kolom de tickername.

Mocht iemand mij op weg kunnen helpen zou dat super zijn.

Alle reacties


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 08:03

Reptile209

- gers -

code:
1
Sheets(stockTicker).Range("A2").Resize(UBound(resultArray, 1) + 1, UBound(resultArray, 2) + 1).Value = resultArray

In deze regel wordt de data weggeschreven naar de sheet met de naam stockTicker. Daar moet je dus mee gaan stoeien: gebruik een andere sheetnaam, en zorg dat de tickerdata onder elkaar komt, en niet allemaal in cell A2.

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • Apolopo
  • Registratie: Januari 2018
  • Laatst online: 10-10 14:28
ja dat dacht ik ook al, maar ik ben nog een beginner in VBA en weet niet hoe ik een extra kolom met de tickernaam kan aanmaken en de data onder elkaar kan laten wegschrijven. Mocht iemand mij daarbij kunnen helpen zou dat super zijn.

Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 08:03

Reptile209

- gers -

Geeft niet, we hebben het allemaal moeten leren :). Ga eens experimenteren met de losse stappen die je wil hebben. Bijvoorbeeld (uit het blote bolletje; zorg dat er een blad met de naam Sheet1 bestaat):
code:
1
2
3
For n=3 to 13
  Sheets("Sheet1").Range("A"&n).Value = "Dit is cell A"&n
Next n

Dat zou bijvoorbeeld "Dit is cell A4" in A4 moeten zetten. Waarom werkt dat? Waarom staat er niks in A2? Wat doet die &?

Zo ga je stapje voor stapje wat elementen opzoeken en uittesten die je nodig hebt. En als er een paar werken, combineer je die tot een werkend geheel. Leer debuggen, o.a. met F8 in de VBA editor om regel voor regel door je code te stappen en te zien wat er gebeurt. Zoek het Watch-window op om je variabelen makkelijk te volgen. En Google tot je een ons weegt :)

Zo scherp als een voetbal!