Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1860to1864
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Export - Feintuning

VBA Export - Feintuning
20.12.2021 15:37:45
Mat
Hallo liebes Forum,
viele Hilfe, Tipps und Tricks habe ich schon mit copy / paste hier in diesem Forum gefunden. Vielen Dank dafür. Aber jetzt komme ich nicht mehr weiter.
der csv Export ist ja schon massenhaft diskutiert worden sodass ich mir folgendes (Teil-) Script zusammenbauen konnte:

For Each LfdRow In SrcRg.Rows
If Not LfdRow.EntireRow.Hidden Then
'Nur eingeblendete Zeilen werden ausgegeben - Zeilenanfang:
ZeileStr = ""
For Each LfdZelle In LfdRow.Cells
With LfdZelle
If Not .EntireColumn.Hidden Then
'Nur eingeblendete Spalten werden ausgegeben - Feldausgabe (Format hängt von Spalte ab):
Select Case .Column
Case 5:       FeldStr = Replace(.Value, ";", ",")
Case 6, 7:    FeldStr = LCase(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(.Value, " ", ""), "ü", "ue"), "ä", "ae"), "ö", "oe"), "ß", "ss"), "\\", "-"), "/", "-"), "é", "e"), "è", "e"))
Case Else:    FeldStr = CStr(.Value)
End Select
'Feld wird, eingeschlossen in "...", an Zeile angefügt, gefolgt vom Feldtrennzeichen
ZeileStr = ZeileStr & Chr(34) & FeldStr & Chr(34) & FeldSep
End If
End With
Next LfdZelle
'Am Zeilenende vorhandene Feldtrennzeichen werden aus der Zeile entfernt
While Right(ZeileStr, 1) = FeldSep
ZeileStr = Left(ZeileStr, Len(ZeileStr) - 1)
Wend
'Die Zeile samt Zeilenendezeiche (und anschließendem CRLF) wird in die Datei ausgegeben.
Print #DtN, ZeileStr & ZeileEnd
End If
Next LfdRow
Das funktioniert auch soweit ganz gut - aber ich würde gerne folgende "Optimierungen" durchführen:
- es sollen nicht alle Spalten exportiert werden
- der exportierte Wert soll aus vorhandenen Daten erst ermittelt werden
Beispiel:
Spalte A = username
Spalte B ("errechnet") = username@"meine domain.tld" oder "wenn Spalte A = xy dann z"
Kann mir jemand dafür die richtige Richtung weisen?
Zudem habe ich noch das Problem, dass ich im Beispiel oben eigentlich Spalte 6 und 7 auch in lower cases ausgeben möchte - aber die Spaltenüberschrift muss upper cases weiterhin enthalten...
Vielen Dank für eure Hilfe....
Mat

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Export - Feintuning
20.12.2021 16:15:51
ralf_b
was hindert dich daran in den Case-Bereichen mehrzeilig zu arbeiten und so eine if .row = 1 then Ucase(irgendwas ) Abfrage einzubauen.
AW: VBA Export - Feintuning
20.12.2021 16:35:33
Mat
:-) das ging schnell...
was mich hindert sind meine VBA skills - lesen und verstehen ganz ok, schreiben = 0
sorry, kannst Du mir ein Beispiel schreiben, dann bekomme ich ggf. den Transfer hin?
AW: VBA Export - Feintuning
20.12.2021 17:41:30
Yal
Moin Mat,
mit folgendem Code behandle ich nur das Thema "erste Zeile soll nicht LCase sein".
Für den anderen Punkt solltest Du mehr Information liefern.

Sub InCSV_exportieren()
Dim Z As Range
Dim R As Range
Const cTrenn = ";"
Const dhk = """"
For Each R In SrcRg.Rows
If Not R.EntireRow.Hidden Then
'Nur eingeblendete Zeilen werden ausgegeben - Zeilenanfang:
ZeileStr = ""
For Each Z In R.Cells
If Not Z.EntireColumn.Hidden Then
'Nur eingeblendete Spalten werden ausgegeben - Feldausgabe (Format hängt von Spalte ab):
Select Case Z.Column
Case 5:    FeldStr = Replace(Z.Value, ";", ",")
Case 6, 7: FeldStr = Replace_DE(Z.Value, (R.Row  SrcRg.Row))
Case Else: FeldStr = CStr(Z.Value)
End Select
'Feld wird, eingeschlossen in "...", an Zeile angefügt, gefolgt vom Feldtrennzeichen
ZeileStr = ZeileStr & dhk & FeldStr & dhk & cTrenn
End If
Next Z
'Am Zeilenende vorhandene Feldtrennzeichen werden aus der Zeile entfernt
Do While Right(ZeileStr, 1) = cTrenn
ZeileStr = Left(ZeileStr, Len(ZeileStr) - 1)
Loop
'Die Zeile samt Zeilenendezeiche (und anschließendem CRLF) wird in die Datei ausgegeben.
Print #DtN, ZeileStr & ZeileEnd
End If
Next R
End Sub
Private Function Replace_DE(Eingang As String, Optional MacheLCase = True) As String
Dim Erg As String
Erg = Replace(Eingang, " ", "")  'als erste, weil es die Anzahl an Zeichen reduziert
If MacheLCase Then
Erg = LCase(Erg)
Else
Erg = Replace(Erg, "Ü", "Ue")
Erg = Replace(Erg, "Ä", "Ae")
Erg = Replace(Erg, "Ö", "Oe")
Erg = Replace(Erg, "É", "E")
Erg = Replace(Erg, "È", "E")
End If
Erg = Replace(Erg, "\\", "-")
Erg = Replace(Erg, "/", "-")
Erg = Replace(Erg, "é", "e")
Erg = Replace(Erg, "è", "e")
Erg = Replace(Erg, "ü", "ue")
Erg = Replace(Erg, "ä", "ae")
Erg = Replace(Erg, "ö", "oe")
Erg = Replace(Erg, "ß", "ss")
Replace_DE = Erg
End Function
Wenn Du das komplizierte "Replace" auslagerst, hast Du eine bessere Übersicht und auch mehr Flexibilität.
Lauf-Variablen (für die For-Schleife) sind üblicherweise (muss aber nicht sein) einstellig. Dann ist der "With" überflüssig.
Die Variablenamen "FeldSep" und "FeldStr" sind für den Auge viel zu nah zueinander. Bedenke eventuell "Trenn" oder "cTrenn", weil Konstante, für den Trennzeichen zu verwenden. Es wird dann weniger anstrengend zu lesen.
Sonst ist dein Code ziemlich sauber.
VG
Yal
Anzeige
AW: VBA Export - Feintuning
21.12.2021 13:57:42
Mat
Hallo Yal,
perfekt - ich verstehe zwar nicht, wo hier für LCase die erste Zeile ausgelassen wird - aber es funktioniert. Und danke auch für den Tipp, es besser zu strukturieren.
Sorry für den Anfänger-Fehler: nur eine Frage pro Post :-(
Aber wo ich schon mal alles gemischt habe:
zweites Problem: Spalte 6 soll nicht exportiert werden
? wenn ich mit Exit For arbeite, bricht der ganze Export ab - also: wie kann ich nur Spalte 6 auslassen?
Drittes Problem: ich möchte gerne eine Spalte hinzufügen:
? Inhalt = verketten Zelle Spalte 6 & "orgendein text"
AW: VBA Export - Feintuning
21.12.2021 14:31:55
Yal
Hallo Mat,
LCase wird in der abgelagerten Function Replace_DE gemacht. Als zweite Parameter wird einen Boolsche "MacheLCase" angenommen, das ausgelassen werden darf und per Default True ist, aber in Case 6 wird als zweiten Parameter übergeben ob die aktuelle Zeile gleich (bzw ungleich) die erste Zeile ist. Bei erster Zeile ist es gleich also R.Row SrcRg.Row ist False. Kein LCase.
Deine Angabe sind widersprüchlich: Spalte 6 nicht exportieren, Spalte 6 einen Zusatz geben (und dann nicht exportieren? macht keinen Sinn)
Im Folgenden gibt es zwei Case 6: der erste setzt eine Variable Überspringe auf True, der zweite fügt einen Text an Spalte 6. Beide gleichzeitig wird nicht funktionieren. Da musst Du dich reinkniehen und im Klaren sein, was Du brauchst/willst und den Code dementsprechend zurecht biegen.

Sub InCSV_exportieren()
Dim Z As Range
Dim R As Range
Dim ÜberSpringe As Boolean
Const cTrenn = ";"
Const dhk = """"
For Each R In SrcRg.Rows
If Not R.EntireRow.Hidden Then
'Nur eingeblendete Zeilen werden ausgegeben - Zeilenanfang:
ZeileStr = ""
For Each Z In R.Cells
ÜberSpringe = False 'default immer resetten
If Not Z.EntireColumn.Hidden Then
'Nur eingeblendete Spalten werden ausgegeben - Feldausgabe (Format hängt von Spalte ab):
Select Case Z.Column
Case 5:    FeldStr = Replace(Z.Value, ";", ",")
Case 6:    ÜberSpringe = True
Case 6:    FeldStr = Z.Value & " irgendein Text"
Case 7:    FeldStr = Replace_DE(Z.Value, (R.Row  SrcRg.Row))
Case Else: FeldStr = CStr(Z.Value)
End Select
'Feld wird, eingeschlossen in "...", an Zeile angefügt, gefolgt vom Feldtrennzeichen
If Not ÜberSpringe Then ZeileStr = ZeileStr & dhk & FeldStr & dhk & cTrenn
End If
Next Z
'Am Zeilenende vorhandene Feldtrennzeichen werden aus der Zeile entfernt
Do While Right(ZeileStr, 1) = cTrenn
ZeileStr = Left(ZeileStr, Len(ZeileStr) - 1)
Loop
'Die Zeile samt Zeilenendezeiche (und anschließendem CRLF) wird in die Datei ausgegeben.
Print #DtN, ZeileStr & ZeileEnd
End If
Next R
End Sub
Private Function Replace_DE(Eingang As String, Optional MacheLCase = True) As String
Dim Erg As String
Erg = Replace(Eingang, " ", "")  'als erste, weil es die Anzahl an Zeichen reduziert
If MacheLCase Then
Erg = LCase(Erg)
Else
Erg = Replace(Erg, "Ü", "Ue")
Erg = Replace(Erg, "Ä", "Ae")
Erg = Replace(Erg, "Ö", "Oe")
Erg = Replace(Erg, "É", "E")
Erg = Replace(Erg, "È", "E")
End If
Erg = Replace(Erg, "\\", "-")
Erg = Replace(Erg, "/", "-")
Erg = Replace(Erg, "é", "e")
Erg = Replace(Erg, "è", "e")
Erg = Replace(Erg, "ü", "ue")
Erg = Replace(Erg, "ä", "ae")
Erg = Replace(Erg, "ö", "oe")
Erg = Replace(Erg, "ß", "ss")
Replace_DE = Erg
End Function
VG
Yal
Anzeige
AW: VBA Export - Feintuning
21.12.2021 16:01:10
Mat
Hi Yal,
sorry - Case 6 war ein blödes Beispiel... aber ich verstehe, wie ich es lösen kann.
Damit bekomme ich es hin.
Vielen Dank noch mal...!
Mat

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige