Aufgezeichnetes Makro, welches Zellen in eine csv exportiert, verbessern

FNBalu

Newbie
Registriert
Feb. 2020
Beiträge
5
Hallo zusammen,

ich sage es gleich vorweg, ich habe nicht viel Ahnung von Makro Programmierung, deshalb habe ich mal eines aufgezeichnet.
Hintergrund: Es existiert eine Excel datei mit einem Auswertprogramm. Darin gibt es den Butto Platzierungen, welches schon ein Makro startet. In diesem wird die Platzierung neu errechnet und dargestellt. Es wird auf der Seite dann auch das aktuelle Datum und die Uhrzeit dargestellt.

Nun soll es ab diesem Jahr eine Internetseite geben und ich würde das gerne automatisch dort importieren lassen.
Das funktioniert auch soweit, jedoch muss Excel mir die Datei idealerweise als csv ausgeben, da ich das Datum als "Montag, 24. Februar 2020" anzeigen lasse. Excel zerballert mir das sonst.

Schwierigkeit, es ist aktuell noch Excel 2003 auf dem Rechner und das wird auch erst nach dem Event wenn getauscht. Das Makro habe ich mit Excel 2016 aufgezeichnet.

Hier erstmal das Makro.

Code:
Sub AAVersuch()
'
' AAVersuch Makro
'

'
    Workbooks.OpenText Filename:="W:\export.csv", Origin:=65001, StartRow:=1 _
        , DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
        , Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
        TrailingMinusNumbers:=True
    Windows("Auswert2.0.xls").Activate
    Range("F3:G3").Select
    Selection.Copy
    Windows("export.csv").Activate
    Selection.PasteSpecial Paste:=xlPasteFormulasAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
    Range("A1").Select
    Application.CutCopyMode = False
    Selection.NumberFormat = "[$-x-sysdate]dddd, mmmm dd, yyyy"
    Range("A2").Select
    Windows("Auswert2.0.xls").Activate
    Range("B6:J311").Select
    Selection.Copy
    Windows("export.csv").Activate
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    ActiveWorkbook.Save
    ActiveWindow.Close
    ActiveWindow.SmallScroll Down:=-381
    Range("A1").Select
End Sub


Was passiert:
  • Es wird auf Laufwerk W die export.csv geöffnet und so eingestellt, dass Umlaute mit gespeichert werden
  • Es werden in der Quelldatei F3 + G3 markiert (Datum und Uhrzeit) und kopiert
  • In der Zieldatei In A1 eingefügt.
  • A1 wird das Uhrzeitformat geändert
  • In der Quelldatei wird B6 bis J311 markiert und kopiert
  • In der Quelldatei ab A2 eingefügt.
  • Danach gespeichert und beendet

Das ist an das bestehende Makro hinten angehängt


Das Ganze funktioniert so, jedoch gefällt es nicht.
  • W liegt im Internet und wurde als Netzlaufwerk hinzugefügt. Es soll, falls das Ziel nicht verfügbar ist, aus welchen Gründen auch immer, keine Fehlermeldung kommen.
  • Momentan wird auch schön die Datei geöffnet, alles erledigt usw. Geht das auch im Hintergrund?

Wie gesagt der Rechner kann nur Excel 2003 aktuell


Da ich etwas unbedarft bin, würde ich mich freuen wenn Ihr da Ideen für mich hättet.
 
Mahlzeit,

Danke schon mal für Deine Hilfe.

Ich habe mit Deinen Tipps mal etwas gegoogelt.
Application.ScreenUpdating = False am Anfang und True am Ende hält das Fenster ruhig und es aktualisiert nicht so viel. Das passt.

MsgBox erstellt Meldungen. Das soll es ja nicht,. also ist das falsch oder verstehe ich da was nicht?

If Dir klingt interessant.
In meinem Fall checken ob w:\export.csv vorhanden ist, dann Sub weiter machen, Else End Sub?
Das würde ja A checken ob die Internetverbindung geht, dann ob die Datei grundsätzlich vorhanden ist und sonst den Part abrechnen ohne Fehlermeldung oder sonstiges.


Was mich nur wundert ist, dass der speicherndialog noch geöffnet wird trotz Application.ScreenUpdating = False
 
Mit Speicherdialog meinst du denke ich mal die Meldung, ob gespeichert werden soll?
Dann sollte das helfen:
Code:
ThisWorkbook.Close SaveChanges:=False
Oder "true" und die Zeile davor entfernen ...

Mit Excel so etwas im Hintergrund zu machen ist mir nicht bekannt.
Da es sich aber um eine CSV-Datei handelt (xls(x) unterstuetzen auch einige), kannst natuerlich das ganze auch mit so ziemlich jeder anderen Skript-Sprache machen.

Vielleicht auch per Batch- oder Powershell-Skript ...
 
Ich habe mal deinen VBA Code angepasst:

Code:
Public Sub AAVersuch()

'Definierungen der Strings
'//Keine Strings vorhanden

'Deaktiviere Fehler Meldungen
Application.DisplayAlerts = False

'Deaktiviere Displayaktualisierung
Application.ScreenUpdating = False

'Check ob Ziel/Quellverzeichnis vorhanden

If Dir("W:\", vbDirectory) <> "" Then GoTo Start Else GoTo Error

'Ordner vorhanden also los mit dem Makro
Start:

    Workbooks.OpenText Filename:="W:\export.csv", Origin:=65001, StartRow:=1 _
        , DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
        , Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
        TrailingMinusNumbers:=True
    Windows("Auswert2.0.xls").Activate
    Range("F3:G3").Select
    Selection.Copy
    Windows("export.csv").Activate
    Selection.PasteSpecial Paste:=xlPasteFormulasAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
    Range("A1").Select
    Application.CutCopyMode = False
    Selection.NumberFormat = "[$-x-sysdate]dddd, mmmm dd, yyyy"
    Range("A2").Select
    Windows("Auswert2.0.xls").Activate
    Range("B6:J311").Select
    Selection.Copy
    Windows("export.csv").Activate
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    ActiveWorkbook.Save
    ActiveWindow.Close
    ActiveWindow.SmallScroll Down:=-381
    Range("A1").Select
 
'Fehlermeldung (Ordner nicht gefunden)
Error:
MsgBox ("Der Ordner W: wurde nicht gefunden!")
End

'Der Part ist eigentlich überflüssig da kein weiterer Code kommt
'Aktiviere Fehler Meldungen
Application.DisplayAlerts = True

'Aktiviere Displayaktualisierung
Application.ScreenUpdating = True

End Sub

Das sollte so passen, wobei dein Makro sauberer geschrieben werden könnte. ;-)
Hier wird nur geprüft auf das Laufwerk vorhanden ist.
 
Zuletzt bearbeitet:
Kann das if dir auch direkt auf die csv zeigen?
Das würde ja Pfad und Dateiexistenz abfragen.

Msgbox brauche ich nicht. Es soll KEINE Fehlermeldung angezeigt werden, das würde den Bediener verwirren.

Else:
End sub

Das müsste doch auch gehen, oder?
Schaue nach ob Datei existiert, wenn ja, kopieren, sonst beenden.

Mit speichern meine ich, dass noch kurz das Fenster aufgeht, dass die csv gespeichert wird. Das könnte auch noch weg.

Leider weiß ich nicht, wie der Code schlanker gemacht werden kann.
Erstmal war Funktion im Vordergrund, jetzt Optimierung der Funktion.
 
Die Fehlermeldung kommt nur, (in diesem Fall), wenn das Laufwerk "W" nicht erreichbar ist.

Mit If Dir die Existenz einer Datei abzufragen ist nicht möglich (meines Wissens nach) dafuer braucht es eine Funktion.

Und wenn nichts "importiert" oder "exportiert" wurde sollte doch der User darueber bescheid wissen.

Sowas wie:
"Vorgang wurde erfolgreich abgeschlossen." und "Vorgang konnte aufgrund der noch nicht bereit gestellen Datei abgeschlossen werden, bitte versuchen Sie es später erneut."
 
Moin.

Nein, darüber soll explizit keine Meldung erstellt werden.
Die Auswertung erfolgt lokal.
Das ist wichtig, das muss klappen ohne Fehler.

Internet ist Luxus und wenn ich da nicht händisch bei muss am Abend und das mittendrin funktioniert ist das Sahnehäubchen.


Die Auswertung b.z.w. Listenführung machen welche, die gerade mal excel öffnen können.
Wenn die dann auf Platzierung drücken und die Tabelle neu sortiert wird, soll nebenbei alles abgeschickt werden.


Interessant ist auch die Frage, ob das so in Excel 2003 läuft.
Die Umstellung auf 2016 erfolgt wenn zu späterer Zeit, da ist immer die Gefahr, dass etwas nicht läuft, was wir uns nicht erlauben wollen
 
Ich habe das heute mal eingebaut.
Es funktioniert sogar, wenn man den String abändert

If Dir("W:\export.csv") <> "" Then GoTo Start Else GoTo Error

Ist die Datei an ihrem Ort, gehts weiter, ist die Datei nicht da, wirds beendet ohne Fehler.


Wie kann man den Code jetzt noch optimieren?
Muss da smit dem Fenster aktivieren???
 
Zurück
Oben