Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1620to1624
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 Schreibe das wenn das erfüllt ist

VBA Schreibe das wenn das erfüllt ist
04.05.2018 00:40:57
Marc
Hi ich bin es nochmal und habe so ein ähnliches Problem bzw Frage wie gerade ebend. Mein Excel Blatt rechnet so viel wenn ich die unten aufgeführte Formel in zu viele Zeilen kopiere. Die Formel vergleicht die Werte aus der Spalte B mit den festen Werten von I20 bis L21 und trägt dann je nach Ergebnis Flug oder Fahrt in die Zelle rechts daneben ein also z.B. C20.
Formel:
=WENN(ODER(B20=$I$20;B20=$J$20;B20=$K$20;B20=$L$20);"Flug";WENN(ODER(B20=$I$21;B20=$J$21;B20=$K$21; B20=$L$21);"Fahrt";"")) 
Jetzt wollte ich das per Makro lösen, aber irgendwie habe ich da noch einen Denkfehler drin. Kann mir da bitte jemand weiter helfen?
Private Sub Test()
Dim s As Integer
Dim z As Integer
With Sheets("Blatt1")
For z = 20 To .Cells(.Rows.Count, 2).End(xlUp).Row
For s = 9 To 12
If .Cells(z, s).Value  "" Then
If .Cells(z, 2).Value = .Cells(20, s)
.Cells(z, 2).Value = "Flug"
Else
If .Cells(z, 2).Value = .Cells(21, s)
.Cells(z, 2).Value = "Fahrt"
End If
End If
Next s
End If
End With
End Sub

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Schreibe das wenn das erfüllt ist
04.05.2018 06:30:18
Rainer
Hallo Marc,
wieviele Zellen willst du den prüfen?
Ich würde die VERGLEICH Funktion in Kombination mit ISTFEHLER benutzen.
=WENN(ISTFEHLER(VERGLEICH(B20;$I$20:$K$20;0));"";"Flug")&WENN(ISTFEHLER(VERGLEICH(B20;$I$21:$K$21;0)) ;"";"Fahrt")
Wenn du es als Makro machen willst, dann mache eine eigene Funktion in ein Modul:
Function Marc_Test(ByRef myRange As Range)
myValue = myRange.Cells(1, 1).Value
On Error Resume Next
Flug = WorksheetFunction.Match(myValue, Range("$I$20:$K$20"), 0)
Fahrt = WorksheetFunction.Match(myValue, Range("$I$21:$K$21"), 0)
If Flug > 0 Then
Marc_Test = "Flug"
Else
If Fahrt > 0 Then
Marc_Test = "Fahrt"
Else: Marc_Test = "nichts"
End If
End If
End Function
und schreibe in deine Zelle: =Marc_test(B20)
Gruß,
Rainer
Anzeige
AW: VBA Schreibe das wenn das erfüllt ist
04.05.2018 19:55:03
MArc
Hi Rainer war meine VBA Lösung so falsch? Ich dachte das mir nur ein Zeichen fehlt. Dein Code sieht ganz anders aus. Muss ich Marc_test in jede Zelle schreiben? Ich wollte es eigentlich so lösen das ich auf einen button klicke und der dann die Inhalte überprüft und je nach Ergebnis Flug oder Fahrt einträgt. Geht des nicht? Ich dachte das mein Code so in diese Richtung geht ^^
AW: VBA Schreibe das wenn das erfüllt ist
05.05.2018 09:03:28
Rainer
Hallo Marc,
ja, mein Code ist ein anderer Weg.
"Marc_Test" kannst du einsetzen wie jede andere Excel-formel (z.B. SUMME()). Als musst du sie in jede Zelle zum prüfen eintragen.
Deine Lösung enthält mehrere Syntaxfehler.
So sollte es gehen:
Sub Test()
Dim s As Integer
Dim z As Integer
With Sheets(1)
For z = 20 To .Cells(.Rows.Count, 2).End(xlUp).Row
For s = 9 To 12
If .Cells(z, s).Value  "" Then
If .Cells(z, 2).Value = .Cells(20, s) Then .Cells(z, 2).Value = "Flug"
If .Cells(z, 2).Value = .Cells(21, s) Then .Cells(z, 2).Value = "Fahrt"
End If
Next s
Next z
End With
End Sub
Ich habe mich damit erst nicht beschäftigt, weil es ohne Beispielmappe notwendig ist, irgendetwas nachzubauen. Das mache ich nicht so gerne.
Außerdem vermeide ich für meine Projekte wenn möglich verschachtelte For-Next Schleifen, weil solche Konstrukte schnell für lange Rechenzeiten sorgen.
Gruß,
Rainer
Anzeige
AW: VBA Schreibe das wenn das erfüllt ist
05.05.2018 09:44:00
MArc
Hm ja das stimmt ich hätte eine Mappe mit schicken sollen, sorry.
Ich wusste gar nicht das For Next Schleifen für lange Rechenzeiten sorgen. Wie kann man denn for next schleifen vermeiden bzw. so was schneller machen? Ich dachte es wäre genau anders rum wenn ich in jede Zeile "Marc_Test" eintrage dass das den Rechner langsamer macht und eine große Rechenleistung erfordert. Aus dem Grund wollte ich auch keine Formel in die Zeile kopieren weil Excel erfahrungsgemäß langsamer wird
Langsame For Next Schleife
06.05.2018 11:19:11
Rainer
Hallo Marc,
For Next Schleifen sind nicht per se "langsam". Ich bin da auch nicht der Informatik-Guru.
Aber es kommt schnell vor, dass man die Schleifen sehr komplex macht mit vielen Zeilen und Spalten. Dann hat man tausende und abertausende Iterationsstufen, das macht es langsam.
Deine Schleife ist da kein gutes Beispiel, weil nur zwei Codezeilen stattfinden. Das geht schnell. Aber stelle die vor es ist auch da etwas mehr zu bearbeiten, dann ist man schnell bei vielen tausenden Operationen, welche Excel durchführt und das kann dauern.
Was mich da immer am meisten stört ist, dass Excel dann u.U. "keine Rückmeldung" anzeigt und es einfach so aussieht, als wäre es abgestürzt.
Gruß,
Rainer
Anzeige
AW: VBA Schreibe das wenn das erfüllt ist
05.05.2018 13:33:41
Marc
Hallo Rainer ich bin es nochmal. Ich habe beide Codes getestet. Der erste funktioniert, aber der zweite funktioniert nur für Zeile 20 und 21. Wieso ist das so?
BeispielDatei
https://www.herber.de/bbs/user/121455.xlsm
AW: VBA Schreibe das wenn das erfüllt ist
06.05.2018 07:59:42
Hajo_Zi
es wird was in Zeile 20 und 21 eingetragen. Spalte C vor Ausführung löschen.

Beiträge von Werner, Luc, robert, J.O.Maximo und folgende lese ich nicht.
AW: VBA Schreibe das wenn das erfüllt ist
06.05.2018 08:17:14
hary
Moin
Das kommt daher das du die Schleife erst bei Zeile 20 startest.
 For z = 20 To .Cells(.Rows.Count, 2).End(xlUp).Row

ersetz die 20 durch 1
gruss hary
Anzeige
AW:und zusaetzlich...
06.05.2018 08:22:37
hary
Moin Nochemal
...musst du
If .Cells(z, s).Value  ""

aendern in
If .Cells(z, 2).Value  ""

gruss hary
AW: VBA Schreibe das wenn das erfüllt ist
06.05.2018 11:09:40
Rainer
Hallo Marc,
da kommen wir zur nächsten Lektion: Kommentiere deinen Code, das hilft beim Verständnis.
So z.B.
Sub Test()
Dim s As Integer     'Vergleichsspalten
Dim z As Integer     'Vergleichszeilen
Dim Suchspalte As Integer    'Suchbereich
Dim Suchzeile As Integer     'Suchbereich
With Sheets(1)       'Das erste Blatt, evtl. Namen einfügen
Suchspalte = 2       ' Evtl. Spaltennummer anpassen
z = 20               'Die erste Zeile des Vergleichsbereich
For Suchzeile = 1 To .Cells(.Rows.Count, Suchspalte).End(xlUp).Row
For s = 9 To 12   'Vergleichsspalten
If .Cells(Suchzeile, Suchspalte).Value  "" Then
If .Cells(Suchzeile, Suchspalte).Value = .Cells(z, s) Then .Cells( _
Suchzeile, Suchspalte + 1).Value = "Flug"
If .Cells(Suchzeile, Suchspalte).Value = .Cells(z + 1, s) Then .Cells( _
Suchzeile, Suchspalte + 1).Value = "Fahrt"
End If
Next s
Next Suchzeile
End With
End Sub
Da hat es jetzt getrennte Variablen für den Suchbereich und den Vergleichsbereich. Durch die Kommentare findet man sich besser zurecht und kann es im Handumdrehen anpassen.
Melde dich wenn du weitere fragen hast.
Rainer
Anzeige
Danke Rainer =)
06.05.2018 18:35:54
Marc
Danke Rainer. Ich weiß etwas an meiner disziplin arbeiten und wirklich alles oder zumindestens etwas kommentieren dann würde ich mich auch leichter tun wenn ich mir das ganze mal nach wochen wieder anschaue^^.
Ich habe noch so viele offene Fragen aber die würden hier nicht herpassen da müsste ich ein neues thema aufmachen. Aber danke für dein Angebot =)
AW: VBA Schreibe das wenn das erfüllt ist
05.05.2018 09:34:31
hary
Moin
Probier es mal so. Ich nehme an das der Unterschied Flug/Fahrt in den Zeilennummern liegt.
Bei Zeile 20 im Bereich I20:L21, Flug ist und bei Zeile 21 halt Fahrt.
Sub Eintragen()
Dim zelle As Range
Dim letzte As Long, i As Long
With Sheets("Blatt1")
letzte = .Cells(Rows.Count, 2).End(xlUp).Row
For i = 20 To letzte
Set zelle = .Range("I20:L21").Find(What:=.Cells(i, 2), LookIn:=xlValues, lookat:=xlWhole)
If Not zelle Is Nothing Then
Select Case zelle.Row '-- Auswahl nach Trefferzeile
Case 20 '--bei Treffer in Zeile 20 im Bereich I20:L21
.Cells(i, 3) = "Flug"
Case 21 '--bei Treffer in Zeile 21 im Bereich I20:L21
.Cells(i, 3) = "Fahrt"
End Select
End If
Next
End Sub

Ohne die Mappe zu sehen ist es ein Raetselraten.
gruss hary
Anzeige
AW: Korrektur es fehlt end with
05.05.2018 09:38:07
hary
Moin
Es fehlte im anderen Code end with.
Sub Eintragen()
Dim zelle As Range
Dim letzte As Long, i As Long
With Sheets("Blatt1")
letzte = .Cells(Rows.Count, 2).End(xlUp).Row
For i = 20 To letzte
Set zelle = .Range("I20:L21").Find(What:=.Cells(i, 2), LookIn:=xlValues, lookat:=xlWhole)
If Not zelle Is Nothing Then
Select Case zelle.Row '-- je nachdem welche Trefferzeile
Case 20 '--bei Treffer in Zeile 20 im Bereich I20:L21
.Cells(i, 3) = "Flug"
Case 21 '--bei Treffer in Zeile 21 im Bereich I20:L21
.Cells(i, 3) = "Fahrt"
End Select
End If
Next
End With
End Sub

gruss hary
Anzeige
Danke =)
05.05.2018 13:28:28
Marc
Vielen Dank der Code läuft und läuft =)

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige