diese ruft mir meine verknüpften Felder auf, wenn das Feld in Spalte A in der selben Zeile belegt ist. Klappt auch alles wunderbar, allerdings wird Spalte E in ein Textdokument Exportiert und dabei werden alle Felder die in Spalte E sind mit einer Leerzeile belegt, weil ich alle Felder in Spalte E mit der oben genannten Formel belegt habe. Kann ich irgendwie per VBA Code oder anders die Spalte E nur mit der Formel belegen lassen, wenn etwas in Spalte A steht? Oder das Ergebnis der Formel irgendwie in das Feld übergeben, wenn etwas in Spalte A steht? Oder hat jemand eine bessere Lösung?
Mein Code zum Exportieren:
Option Explicit
Sub XLStoTXT()
Dim Zelle As Range, strSave As String, lngRow As Long, Bereich As Range
Set Bereich = Intersect(ActiveSheet.UsedRange, ActiveSheet.Range(„E:E“))
Const DateiName = „D:\Ddatei.txt“
Open DateiName For Output As #1
lngRow = 1
For Each Zelle In Bereich
If Zelle.Row lngRow Then
Print #1, Left(strSave, Len(strSave) - 1)
strSave = „“
lngRow = Zelle.Row
End If
strSave = strSave & Zelle & Chr(9)
Next
Print #1, Left(strSave, Len(strSave) - 1)
Close 1
End Sub
Hallo enny,
warum baust Du den String für den Export nicht in Abhängigkeit vom Inhalt in Zelle A zusammen?
Etwa so
Set Bereich = Intersect(ActiveSheet.UsedRange, ActiveSheet.Range(„A:A“))
set ws=activesheet
'Datei zum Ausgeben öffnen
For each Zelle in Bereich
if not isempty(zelle) then
strsave=ws.cells(1,2) & zelle.value & ws.cells(1,3) & „1“ & ws.cells(1,4) & chr(9)
end if
Next Zelle
print #1, left(strsave,len(strsave)-1)
Sub XLStoTXT()
Dim Zelle As Range, strSave As String, lngRow As Long, Bereich As Range
Set Bereich = Intersect(ActiveSheet.UsedRange, ActiveSheet.Range(„E:E“))
Const DateiName = „D:\Datei.txt“
Open DateiName For Output As #1
lngRow = 1
For Each Zelle In Bereich
If Zelle.Row lngRow Then
If Left(strSave, Len(strSave) - 1) „“ Then
Print #1, Left(strSave, Len(strSave) - 1)
strSave = „“
lngRow = Zelle.Row
Else
strSave = „“
lngRow = Zelle.Row - 1
End If
End If
strSave = strSave & Zelle & Chr(9)
Next
Print #1, Left(strSave, Len(strSave) - 1)
Close 1
End Sub
Sub XLStoTXT()
Dim Zelle As Range, strSave As String, lngRow As Long, Bereich As Range
dim ws As Worksheet
Set Bereich = Intersect(ActiveSheet.UsedRange, ActiveSheet.Range(„A:A“))
Const DateiName = „D:\Ddatei.txt“
Open DateiName For Output As #1
For Each Zelle In Bereich
if not isempty(zelle) then
strsave=ws.cells(1,2) & zelle.value & ws.cells(1,3) & „1“ & ws.cells(1,4) & chr(9)
Print #1, strsave
end if
Next
Close 1
End Sub
Damit hast Du wahrscheinlich am Ende der Datei noch eine Leerzeile bzw. eine Zeile, in der nur ein CR steht.
Gruß
Vincenz
Danke schonmal für die Antwort.
Die Idee klingt gut, allerdings weiß ich nicht genau wo in
meinen Code ich das nun einbauen soll.
wichtig dabei ist, dass du beim Aufzeichnen in der Spalte bist, in welche später auch die Formel per VBA reinkopiert wird, weil sonst das große Rechnen und Abzählen losgeht.
Wenn du das hast kannst du mit einer Schleife die Tabelle durchgehen und wenn A nicht leer ist in E die Formel reinschreiben.
Sub test()
Dim z%
With ActiveSheet
For z = 1 To 100
If .Cells(z, 1) „“ Then
.Cells(z, 5).FormulaR1C1 = „=IF(RC[-4]=“""","""",R1C2&RC[-4]&R1C3&1&R1C4)"
End If
Next
End With
End Sub
Hallo enny86!
Deine Formel in Spalte E setzt sich aus Inhalten verschiedener Zellen zusammen, wenn Spalte A belegt.
=WENN(A1="";"";$B$1&A1&$C$1&1&$D$1)
Ich habe Deinen Code 1:1 kopiert. Zwar musste ich mit der Textdatei in ein anderes Verzeichnis umziehen, weil ich direkt unter C:\ nicht schreiben soll, aber der Code hat einwandfrei funktioniert.
Welche Excel-Version benutzt Du? Unter welchem Betriebssystem?
Mit dem For Each hab ich so meine Probleme. Hätte hier eine Alternative. Kannst Du das mal versuchen?
Mit Print habe ich noch wenig Erfahrung. Ist die Leerzeile gewünscht, wenn A leer?
Option Explicit
Sub ExcelToEditor()
’ Variablendeklaration
Dim Zeile As Long, ZEnde As Long
Dim TextE As String
’ Maximale Zeilenanzahl nach Spalte A definieren
ZEnde = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
’ Vergebe Dateiname
Const DateiName = „C:\Users\user\Documents\Ddatei.txt“
’ Öffne Datei
Open DateiName For Output As #1
’ Schleife
For Zeile = 1 To ZEnde
TextE = Cells(Zeile, 5).Value
If TextE = „“ Then
TextE = Chr(9)
Print #1, Left(TextE, Len(TextE) - 1)
Else:
Print #1, Left(TextE, Len(TextE) - 1)
End If
Next
Close 1
End Sub
so ganz habe ich Dein Problem mit den Leerzeilen nicht verstanden, ich versuche mal etwas zu klären:
Zu Beginn der Prozedur ist strSave leer, da es nicht zugewiesen wurde, bevor das erste Mal Print #1 aufgerufen wurde.
Du hängst nach jeder Zuweisung strSave = strSave & Zelle ein Chr(9) ran, warum? Chr(9) ist ein Tabulatorsprung, am Ende einer geschriebenen Zelle meines erachtens sinnlos.
ich würde die Zuweisung zu strSave = strSave & Zelle & chr(9) an den Anfang der For-Each Schleife stellen, dann brauchst Du nicht nach dem Next noch einmal die Printanweisung ausführen
Versuche statt der Zuweisung strSave = strSave & Zelle die Zuweisung strSave = strSave & Zelle.Value, dann ist klar, dass kein Objektverweis gemeint ist, sondern der Zellinhalt (hier: Wert).
das könntest Du mit einem onChange erreichen.
Schreibe folgendes Script im VisualBasic-Editor
nicht in ein Modul sondern unter dem Tabellennamen
(Blattnamen) in dem die Formel laufen soll - also
z.B. Tabelle1
Hier das Script:
Private Sub Worksheet_Change(ByVal target As Range)
Select Case Spalte
Case Is 1
Exit Sub
Case Is = 1
If Wert = „“ Then Exit Sub
Cells(Zeile - 1, 5).Value = Cells(Zeile - 1, 1) & Cells(Zeile - 1, 2) & Cells(Zeile - 1, 3) & „1“ & Cells(Zeile - 1, 4)
End Select
End Sub
Hinweis: Die Formel wird nur ausgeführt, wenn die Eingabe in Spalte A mit ENTER bestätigt wird. Es funktioniert leider nicht, wenn die Zelle mit TAB oder
per Maus verlassen wird.