[Excel/VBA] Exporteren naar CSV, onafhankelijk van locale

Pagina: 1
Acties:
  • 3.467 views sinds 30-01-2008
  • Reageer

  • Reinier
  • Registratie: Februari 2000
  • Nu online
Ik heb een aantal Excelbestanden die via ons intranet (deels via Citrix, deels via gewone pc's) beschikbaar zijn voor een stuk of 50 gebruikers. Deze bestanden bevatten een hele hoop macro's. Een van de functies is het exporteren van wat data (een selectie op een van de werkbladen) naar CSV. Deze exportfiles worden vervolgens batchgewijs ingelezen in SQL (via een DTS-package).

Het opslaan als CSV-bestand gaat gewoon zo:
Visual Basic:
1
2
Sheets("WISSEL").Select
ActiveWorkbook.SaveAs Filename:=  CSVnaam, FileFormat:= xlCSVMSDOS

En daar loop ik tegen een probleem aan. De DTS-package verwacht de puntkomma als scheidingsteken, maar bij het exporteren wordt de landinstelling (locale) van de gebruiker aangehouden. In sommige gevallen levert dat een komma als scheidingsteken op en m'n package struikelt daar nogal over ;(

Mijn vraag is of iemand weet hoe je kan opslaan als CSV waarbij de landeninstelling genegeerd wordt, of expliciet op Nederlands/Europees (of whatever, zolang het maar een puntkomma gebruikt) ingesteld wordt. Misschien via FileFormat?

Google levert weinig nuttigs op en ook op GoT vind ik geen antwoord. Er zijn wel wat topics zoals dit, maar ik kan daar niet zoveel mee. En er is wel een workaround: regel voor regel door de huidige selection lopen en achtereenvolgens elke waarde plus een puntkomma naar het textbestand schrijven, maar dat levert een enorme perfomanceverslechtering op (vanwege het loopen). Deze workaround staat hier.

Wie helpt mij _o_

  • onkl
  • Registratie: Oktober 2002
  • Laatst online: 03:40
Misschien een API call om de locale tijdelijk goed te zetten? Ehh, kon dat? In VBA? Ik dacht dat er wel functionele truc was.
Oh ja, hier
Ik weet alleen niet of dit werkt binnen een Citrix omgeving.

  • Boss
  • Registratie: September 1999
  • Laatst online: 09:26

Boss

+1 Overgewaardeerd

Misschien kan je hier wat mee:
Visual Basic:
1
2
3
Application.DecimalSeparator = "."
Application.ThousandsSeparator = ","
Application.UseSystemSeparators = False

en dan met de parameters die voor jou van toepassing zijn!

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


Acties:
  • 0 Henk 'm!

  • alexbl69
  • Registratie: Maart 2001
  • Laatst online: 08:27
Even een kickje voor dit (nog steeds bestaande) probleem.

Als ik vanuit Excel een bestand opsla als .CSV, wordt als scheidingsteken de punt-komma ';' en als decimaal scheidingsteken de komma ',' gebruikt. Precies zoals ik het wil.

Doe ik dit echter vanuit VBA, dan worden de punt-komma's gewijzigd in komma's, en de decimale komma's worden punten (123.12 ipv 123,12).

De door mij gebruikte code is:
code:
1
ActiveWorkbook.SaveAs filename:="test.csv", FileFormat:=xlCSV, CreateBackup:="false"


Nu is het grappige dat er wel een oplossing in de help staat. Namelijk de optionele parameter 'Local'. Bij het opslaan door VBA worden standaard de landinstellingen van VBA gebruikt (Engels-Amerikaans). Door de toevoeging van 'Local:=True' zou de instelling van Windows moeten worden gepakt (Nederlands, dus correct). Maar het treurige is dat toevoeging van deze parameter een foutmelding geeft. (Fout 1004 - Methode SaveAs van object _Workbook is mislukt).

Het ligt mijns inziens niet aan de syntax, want als ik 'Local:=False' gebruik lukt het opslaan wel, maar dan wel met de verkeerde instellingen.

Heeft iemand deze noot al eens eerder gekraakt?

If buying doesn’t mean ownership Then pirating isn’t stealing / iRacing Profiel


Acties:
  • 0 Henk 'm!

  • alexbl69
  • Registratie: Maart 2001
  • Laatst online: 08:27
Grappig, op mijn XP computer (werk) werkte 'Local:=true' niet, op m'n Vista PC thuis dus wel!

If buying doesn’t mean ownership Then pirating isn’t stealing / iRacing Profiel


Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Nu online
Mijn oorspronkelijke probleem is al lang en breed opgelost door in plaats van het werkblad op te slaan als CSV-file dit stukje VBA te gebruiken:

VBScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Public Sub ExportToTextFile(FName As String, _
    Sep As String, SelectionOnly As Boolean)

Dim WholeLine As String
Dim FNum As Integer
Dim RowNdx As Long
Dim ColNdx As Integer
Dim StartRow As Long
Dim EndRow As Long
Dim StartCol As Integer
Dim EndCol As Integer
Dim CellValue As String


Application.ScreenUpdating = False
On Error GoTo EndMacro:
FNum = FreeFile

If SelectionOnly = True Then
    With Selection
        StartRow = .Cells(1).Row
        StartCol = .Cells(1).Column
        EndRow = .Cells(.Cells.Count).Row
        EndCol = .Cells(.Cells.Count).Column
    End With
Else
    With ActiveSheet.UsedRange
        StartRow = .Cells(1).Row
        StartCol = .Cells(1).Column
        EndRow = .Cells(.Cells.Count).Row
        EndCol = .Cells(.Cells.Count).Column
    End With
End If

Open FName For Output Access Write As #FNum

For RowNdx = StartRow To EndRow
    WholeLine = ""
    For ColNdx = StartCol To EndCol
        If Cells(RowNdx, ColNdx).Value = "" Then
            CellValue = ""
        Else
            CellValue = Cells(RowNdx, ColNdx).Value
            If IsNumeric(CellValue) Then
                CellValue = Replace(CellValue, ",", ".")
            End If
        End If
        WholeLine = WholeLine & CellValue & Sep
    Next ColNdx
    WholeLine = Left(WholeLine, Len(WholeLine) - Len(Sep))
    Print #FNum, WholeLine
Next RowNdx

EndMacro:
On Error GoTo 0
Close #FNum

End Sub


Werkt prima :P

Acties:
  • 0 Henk 'm!

  • alexbl69
  • Registratie: Maart 2001
  • Laatst online: 08:27
Great! Dit is nog veel beter!

If buying doesn’t mean ownership Then pirating isn’t stealing / iRacing Profiel


Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Nu online
Het komt trouwens hier vandaan :)
Pagina: 1