Supportnet / Forum / Tabellenkalkulation
Makro läuft nicht über Befehlsschaltfläche
Frage
Ich habe mir ein kleines Makro geschrieben, um eine .xls in eine .csv umzuwandeln. Wenn ich das Makro über den Befehl Extras-Makros-Ausführen laufen lasse funktioniert es einwandfrei.
Über eine benutzerdefinierte Befehlsschaltfläche, dem das Makro zugewiesen ist klappt es nicht. Es wird zwar ohne Fehlermeldung ausgeführt, aber die CSV-Datei wird nicht richtig erstellt, d.h. die Daten werden nicht zeilenweise durch ; getrennt, sondern wie in einer xls spaltenweise.
Wer kann mir weiterhelfen ?
Ich arbeite mit Excel 2000.
Der Programmcode lautet:
Sub InCSV_konvertieren()
'
' InCSV_konvertieren Makro
' Makro am 29.11.2003 von KM1 aufgezeichnet
'
'
ActiveWorkbook.Save
Range("A1").Select
Kill "C:\Auto2\import\impcarca\impcarst.csv"
ActiveWorkbook.SaveAs Filename:="C:\Auto2\Import\Impcarca\impcarst.csv", _
FileFormat:=xlCSV, CreateBackup:=False
ActiveWorkbook.Save
Application.DisplayAlerts = False
ActiveWorkbook.Close
End Sub
Antwort 1 von _gau_
Hier eine Beispiellösung (Textdatei selbst "zusammenstricken")
Wie kann man Excel dazu zwingen, das Semikolon als Trennzeichen zu ...
[gau]
Wie kann man Excel dazu zwingen, das Semikolon als Trennzeichen zu ...
[gau]
Antwort 2 von _gau_
Mir ist aufgefallen, daß bei obigem Makro jede Zeile durch ein Semikolon abgeschlossen wird. Etwas unschön. Deshalb etwas angepaßt:
[gau]
Sub SaveCSV()
Dim Bereich As Object, Zeile As Object, Zelle As Object
Dim strTemp As String
Const Dateiname As String = "C:\Auto2\Import\Impcarca\impcarst.csv"
'Hier kann man ein beliebiges Trennzeichen eintragen
Const Trennzeichen As String = ";"
If Dir(Dateiname) <> "" Then Kill Dateiname
Set Bereich = ActiveSheet.UsedRange
Open Dateiname For Output As #1
For Each Zeile In Bereich.Rows
For Each Zelle In Zeile.Cells
If InStr(1, Zelle.Text, ";") > 0 Then
'Zellen, die ein Semikolon beinhalten in Anführungsstriche setzen
strTemp = strTemp & """" & CStr(Zelle.Text) & """" & Trennzeichen
Else
strTemp = strTemp & CStr(Zelle.Text) & Trennzeichen
End If
Next
'Zeile ohne das letzte Semikolon speichern
Print #1, Mid(strTemp, 1, Len(strTemp) - 1)
strTemp = ""
Next
Close #1
Set Bereich = Nothing
End Sub[gau]
Antwort 3 von nighty
hi alle
bei dem code einer schaltflaeche ist es besser nur den makroaufruf einzuschreiben.
Application.Run "Makro1"
gruss nighty
bei dem code einer schaltflaeche ist es besser nur den makroaufruf einzuschreiben.
Application.Run "Makro1"
gruss nighty
Antwort 4 von _gau_
Hmm...
> "Über eine benutzerdefinierte Befehlsschaltfläche, dem das Makro zugewiesen ist"
Es steht also nicht im Code irgendeiner Schaltfläche.
Er nehme an, es ist ein benutzdefiniertes Symbol in einer der Symbolleisten. Diesem Symbol wird das Makro über seinen Namen zugewiesen.
[gau]
> "Über eine benutzerdefinierte Befehlsschaltfläche, dem das Makro zugewiesen ist"
Es steht also nicht im Code irgendeiner Schaltfläche.
Er nehme an, es ist ein benutzdefiniertes Symbol in einer der Symbolleisten. Diesem Symbol wird das Makro über seinen Namen zugewiesen.
[gau]
Antwort 5 von Klaus1966
Hallo Gau,
Danke. Einfach nur perfekt.
Eine kleine Sache noch:
Ich möchte noch, dass am Ende des Makros die Arbeitsmappe und Excel geschlossen wird und eine Access Datenbank im Pfad C:\auto2\import\impcarca\impcarst.mdb geöffnet wird.
Wie kann man das sauber machen ?
Danke. Einfach nur perfekt.
Eine kleine Sache noch:
Ich möchte noch, dass am Ende des Makros die Arbeitsmappe und Excel geschlossen wird und eine Access Datenbank im Pfad C:\auto2\import\impcarca\impcarst.mdb geöffnet wird.
Wie kann man das sauber machen ?
Antwort 6 von _gau_
Zum Schluß ungefähr sowas dranhängen:
(die Deklaration der Variablen/Konstanten "ID" und "Prog" schreibt man natürlich normalerweise mit ganz an den Anfang)
[gau]
Dim ID As Double
Const Prog As String = "C:\Programme\Microsoft Office\Office\Msaccess.exe C:\auto2\import\impcarca\impcarst.mdb"
ID = Shell(Prog, vbMaximizedFocus)
Application.Quit
(die Deklaration der Variablen/Konstanten "ID" und "Prog" schreibt man natürlich normalerweise mit ganz an den Anfang)
[gau]
Antwort 7 von _gau_
Nachtrag:
Sollten Leerzeichen im Pfad zur Datenbank sein, dann müßte es so aussehen
Verwirrend viel Anführungszeichen, oder? ;-)
[gau]
Sollten Leerzeichen im Pfad zur Datenbank sein, dann müßte es so aussehen
Const Prog As String = "C:\Programme\Microsoft Office\Office\Msaccess.exe ""C:\Eigene Dateien\Datbank\Quiz2000.mdb"""Verwirrend viel Anführungszeichen, oder? ;-)
[gau]
Antwort 8 von coros
Moin an alle,
auch wenn das Problem mit dem Erstellen einer CSV-Datei abgeschlossen ist, hier eine kurze Erklärung, woran das liegt und wie man das beseitigt. Das Problem liegt in Excel und zwar seit der Version 8.0 (Excel 97). In dem Makro ist zwar bei der Erstellung das Semikolon als Trennzeichen angegeben, leider wird beim Ausführen des Makros auf den US-Standard umgeschaltet. Das bedeutet, als Trennzeichen zwischen den Daten wird nur ein Koma akzeptiert und die Daten werden nicht Spaltengetrennt sondern in einer Spalte angezeigt. Abhilfe kann man durch einen Eintrag in der Registry unter
Schlüssel: HKCU\Software\Microsoft\Office\9.0\Excel\Options
Name: VBAAlwaysLoadUS
Typ: DWORD
schaffen. Man setzt den Wert in dem DWORD auf 0. Danach sollte als Trennzeichen, sowohl beim Abspeichern als auch beim Öffnen ein Semikolon akzeptiert werden und die Daten werden wieder in einzellnen Spalten ausgegeben.
Da ich dieses Problem vor gut einen Jahr ebenfalls hatte, habe ich intensiefst im Netz gesucht und bin dort auch fündig geworden, da ein Makro, welches das Trennzeichen tauscht usw. für mein bestehendes Makro nicht in Frage kam.
MfG,
coros
Jeder macht was er will, keiner macht was er soll, aber alle machen mit.
auch wenn das Problem mit dem Erstellen einer CSV-Datei abgeschlossen ist, hier eine kurze Erklärung, woran das liegt und wie man das beseitigt. Das Problem liegt in Excel und zwar seit der Version 8.0 (Excel 97). In dem Makro ist zwar bei der Erstellung das Semikolon als Trennzeichen angegeben, leider wird beim Ausführen des Makros auf den US-Standard umgeschaltet. Das bedeutet, als Trennzeichen zwischen den Daten wird nur ein Koma akzeptiert und die Daten werden nicht Spaltengetrennt sondern in einer Spalte angezeigt. Abhilfe kann man durch einen Eintrag in der Registry unter
Schlüssel: HKCU\Software\Microsoft\Office\9.0\Excel\Options
Name: VBAAlwaysLoadUS
Typ: DWORD
schaffen. Man setzt den Wert in dem DWORD auf 0. Danach sollte als Trennzeichen, sowohl beim Abspeichern als auch beim Öffnen ein Semikolon akzeptiert werden und die Daten werden wieder in einzellnen Spalten ausgegeben.
Da ich dieses Problem vor gut einen Jahr ebenfalls hatte, habe ich intensiefst im Netz gesucht und bin dort auch fündig geworden, da ein Makro, welches das Trennzeichen tauscht usw. für mein bestehendes Makro nicht in Frage kam.
MfG,
coros
Jeder macht was er will, keiner macht was er soll, aber alle machen mit.
Antwort 9 von _gau_
Das mit dem Reg-Eintrag "VBAAlwaysLoadUS" hatte ich auch schon probiert. Leider zeigte er bei meinem Excel2000 (unter NT4 und Win2000) keinerlei Wirkung beim Speichern über VBA.
Wäre ansonsten natürlich viel bequemer gewesen :-(
[gau]
Wäre ansonsten natürlich viel bequemer gewesen :-(
[gau]
Antwort 10 von _gau_
Jetzt hab ich auch wiedergefunden, wo ich das schonmal gelesen hatte:
http://support.microsoft.com/default.aspx?scid=kb;de;509480
Aber wie gesagt, bei mich hats nicht gehelft.
[gau]
http://support.microsoft.com/default.aspx?scid=kb;de;509480
Aber wie gesagt, bei mich hats nicht gehelft.
[gau]
Antwort 11 von Klaus1966
Vielen Dank noch mal an alle, besonders an gau.
Aufgabe perfekt gelöst !
Bin erst seit ein paar Tagen dabei und muss sagen, dass einem hier richtig kompetent geholfen wird.
Bis zum nächsten Problem
Klaus
Aufgabe perfekt gelöst !
Bin erst seit ein paar Tagen dabei und muss sagen, dass einem hier richtig kompetent geholfen wird.
Bis zum nächsten Problem
Klaus

