Excel - Formel nur unter Bedingung in Zelle

Guten Tag,

ich habe eine Excel Formel in Spalte E:

=WENN(A1="";"";$B$1&A1&$C$1&1&$D$1)

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

Hoffe ihr könnt mir helfen!

Gruß enny

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)

Besser verstehe ich Deinen Code nicht

Gruß
Vincenz

Hallo enny,

ich bin mir nicht sicher ob ich dein Problem verstanden habe aber den Wert ein Zelle übergibst du mit:
strSave = Zelle.value

Gruß
Gerhard

Danke schonmal für die Antwort.
Die Idee klingt gut, allerdings weiß ich nicht genau wo in meinen Code ich das nun einbauen soll. :smiley:

Hallo Enny,

das sollte funktionieren…

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

Gruß
Marco

Sorry, enny86 - ich bin ganz sicher kein Experte - hoffe aber, dass ir jemand anderes weiterhelfen kann.
Gruß Michael_l

Vielen Dank hat super geklappt! =)

OK, ich versuchs nochmal

Option Explicit

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. :smiley:

Hallo Enny,
du kannst mit dem Recorder die Eingabe einer Formel aufzeichnen.
Deine Formel aus Spalte E sieht dann z.B. so aus.

ActiveCell.FormulaR1C1 = „=IF(RC[-4]=“""","""",R1C2&RC[-4]&R1C3&1&R1C4)"

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

Hoffe das es so funktioniert.

LG
Binh

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

LG MwieMichel

Hallo enny,

so ganz habe ich Dein Problem mit den Leerzeilen nicht verstanden, ich versuche mal etwas zu klären:

  1. Zu Beginn der Prozedur ist strSave leer, da es nicht zugewiesen wurde, bevor das erste Mal Print #1 aufgerufen wurde.
  2. 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.
  3. 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
  4. 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).

Ich hoffe, dies hilft…?!

Hallo,
tut mir leid, ich kann nicht helfen
Gruß
Brandis

Hi Enny,

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)

Wert = target.Value
Spalte = ActiveCell.column
Zeile = ActiveCell.Row

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.

Gruß,
Ptonka

P.S. Feedback wäre schön