QueryTables.Add voegt kolommen toe

Status
Niet open voor verdere reacties.

Joete

Gebruiker
Lid geworden
19 sep 2008
Berichten
87
Heb het tijden werkend gehad, kwam later een bug tegen, e.e.a. aangepast en nu werkt het niet meer...

Het probleem:
Uit Revit (bouwkundig teken/modelleer programma) halen wij data d.m.v. Python-codes. Deze data wordt opgeslagen in CSV-bestanden. Vervolgens opent diezelfde Python-code een Excelbestand waarin een macro automatisch gestart wordt die de CSV-bestanden over verschillende werkbladen verwerkt.
De CSV-bestanden inlezen en de data overnemen doe ik met deze code (deze staat in een grotere With):
Code:
With .QueryTables.Add("TEXT;" & csvPath & CSV(S) & ".csv", .Range("$A$5"))
    .SaveData = False
    .AdjustColumnWidth = False
    .TextFilePlatform = 850
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileSemicolonDelimiter = True
    .BackgroundQuery = True
    '.RefreshStyle = xlInsertEntireRows
    .Refresh BackgroundQuery:=True
End With
Hierin geef ik aan dat de data vanaf cel A5 ingevoerd moet worden. Dit gebeurd ook, echter voegt Excel kolommen in, dus de oorspronkelijke cel A5 is nu bijvoorbeeld cel G5 geworden. Vanaf cel A5 heb ik standaard in mijn bestand een tabel met filters e.d. zitten, dus de data moet echt in de juiste kolommen/rijen komen te staan, anders werkt het allemaal niet.

Wat is er veranderd t.o.v. de werkende versie:
In de werkende versie had ik standaard een tabel met 5000 regels zitten. Bij een Revit-model wat we in wilden lezen kwamen we hogere aantallen tegen. Dit moest opgelost en dat heb ik gedaan door de tabel standaard uit 1 regel te laten bestaan en het aantal regels in de CSV te tellen en de tabel hierop aan te passen. Dit doe ik als volgt:
Code:
' regels in CSV tellen
Dim fso As Object
Dim ts As Object
Dim CountLines As Long
CountLines = 0
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile(csvPath & CSV(S) & ".csv")
Do Until ts.AtEndOfStream
    CountLines = CountLines + 1
    ts.ReadLine
Loop
ts.Close
Set ts = Nothing
Set fso = Nothing
' regels in sheet toevoegen, alleen bij meer dan 1 record
If CountLines > 1 Then
    .Rows("5:" & 5 + CountLines - 2).EntireRow.Insert Shift:=xlDown
End If

Omdat de celverwijzing A5 niet werkte, heb ik ook geprobeerd om de naam van de tabel op te zoeken en die als Range in te vullen:
Code:
' tabelnaam opzoeken
Dim obj As ListObject
Dim Tabel As String
For Each obj In Sheets(Sh(S)).ListObjects
    Tabel = obj.Name
    Exit For
Next
De verwijzing (range) is correct, echter werkt deze manier van verwijzen ook niet. Wel wordt gevuld vanaf cel A5, maar ook hier schuiven de kolommen gewoon weer op.

Wat ik allemaal al heb geprobeerd:
  • .Range met tabelnaam i.p.v. celverwijzing, werking hetzelfde
  • .Range met cell(5,1), werking hetzelfde
  • .Range met cell(5,2-1), werking hetzelfde
  • .Range met cell(5,2).offset(0,-1), werking hetzelfde
  • .Range($B$5), dit werkt wel, alleen wordt de data nu natuurlijk in de verkeerde kolommen geïmporteerd, kan dus ook niet
  • .RefreshStyle = xlOverwriteCells, dit geeft een foutmelding waardoor het script stopt

Weet iemand hoe ik dit goed werkend kan krijgen?
 
Het is toch helemaal niet nodig steeds weer opnieuw querytables aan te maken ?

Maak één keer een bestand met alle querytables, dan hoeft dat bestand alleen maar geopend te worden en aktualiseert het automatisch alle gekopopelde gegevens.
 
•.RefreshStyle = xlOverwriteCells, dit geeft een foutmelding waardoor het script stopt

Dit komt omdat je de query-resultaten niet kunt overlappen op een Listobject, converteer jouw tabel maar eens naar een gewone range en draai jouw macro met .RefreshStyle = xlOverwriteCells, dan zal je geen foutmelding krijgen

Maar: neem snb's suggestie ter harte
 
Bedankt voor de reacties. Nog een paar vraagjes:

Maak één keer een bestand met alle querytables, dan hoeft dat bestand alleen maar geopend te worden en aktualiseert het automatisch alle gekopopelde gegevens.
OK, klinkt logisch, maar hoe moet ik dit zien en maken? Kan dit met een bestand wat steeds nieuwe CSV-bestanden in moet lezen? Werkt dit als het bestand steeds op een andere locatie opgeslagen wordt?
Misschien Google ik verkeerd, maar ik kan bizar weinig (NL-talig) info vinden over de querytables...

Dit komt omdat je de query-resultaten niet kunt overlappen op een Listobject, converteer jouw tabel maar eens naar een gewone range en draai jouw macro met .RefreshStyle = xlOverwriteCells, dan zal je geen foutmelding krijgen

Maar: neem snb's suggestie ter harte
Ik was er inderdaad al achter dat een listobject anders werkt dan een querytable. Als ik mijn listobject converteer naar een gewone range (unlist?) en de macro aanpas, kan ik dan nog wel (in andere macro's) de juiste range terugvinden? Nu zoek ik steeds op listobject, maar dat gaat dan natuurlijk niet meer werken...
 
Je kunt uiteraard de sheetnamen met cel-adressen gebruiken
Of gedefineerde naam-bereiken gebruiken

Hoe weet jouw code nu dat die csv bestanden op andere locaties staan?
 
Ik ben mijn code al aan het ombouwen, nog niet helemaal werkend, maar het vullen gaat nu, zonder listobject, wel (bijna) goed.

De CSV-bestanden staan wel altijd op een vaste locatie ten opzichte van het Excelbestand. Dus ik pak mijn pad en vul dat aan met een submap. Maar ik kan me voorstellen dat wanneer de query vast in het bestand gezet wordt, deze ergens een vast pad gaan krijgen? Ik ben daarin helaas te onbekend in de querytables...
 
ipv .add: pas de connectie aan

Code:
With .QueryTables(1)
    .Connection = "TEXT;" & csvPath & CSV(S) & ".csv"
    .SaveData = False
    .AdjustColumnWidth = False
    .TextFilePlatform = 850
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileSemicolonDelimiter = True
    .BackgroundQuery = True
    .RefreshStyle = xlOverwriteCells
    .Refresh BackgroundQuery:=True
End With
 
In de bijlage:

een zip bestand
Pak het zipbestand uit, zodat alle vier bestanden in dezelfde directory komen.

- een Excelbestand met een Querytable gekoppeld aan het bestand voorbeeld.csv
- een csv-bestand voorbeeld.csv
- een csv-bestand voorbeeld_001.csv
- een csv-bestand voorbeeld_002.csv

Open het Excelbtand
Klik op de knop 'nieuw' en zie het effekt.

In plaats van CSV-bestanden kun je op dezelfde manier Excel-bestanden koppelen.
 

Bijlagen

  • __Querytable_csv.zip
    16,5 KB · Weergaven: 33
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan