Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: if-Bedingung als Variable

if-Bedingung als Variable
13.03.2018 16:30:34
Burkhard
Hallo miteinander,
kann ich einer if-Abfrage eine (String-)Variable zur Auswertung unterschieben? Etwa so (symbolisch):
Dim sBed as String
sBed = "A1 = 250"
if sBed then
else
endif
Das ist nur ein Beispiel, natürlich setzt sich die Bedingung ein bisschen komplizierter zusammen; die Frage richtet sich auf die Zeile mit dem if. Dass es so NICHT geht, habe ich gemerkt; geht es irgendwie anders?
Grüße
Burkhard
Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: if-Bedingung als Variable
13.03.2018 16:52:29
Zwenn
Hallo Burkhard,
es handelt sich bei If ... Then um eine Entscheidungsstruktur, die den Ausdruck, den ich nur durch die drei Punkte allgemein abgebildet habe, entweder zu true oder false auswertet. Dieser Ausdruck wiederum kann alles enthalten, was ein Ausdruck unter VBA eben sein kann. In der Regel macht man einen Vergleich zwischen zwei Werten.
Schreibst Du statt der drei Punkte den Namen einer Variable vom Typ Boolean hin, brauchst du nicht zwingend einen Vergleich. Dann wird der Codeblock zwischen Then und End If ausgeführt, wenn die Variable den Wert true hat.
Viele Güße,
Zwenn
Anzeige
AW: if-Bedingung als Variable
13.03.2018 17:20:16
Burkhard
Hallo Zwenn,
ich habe aber keine boolsche Variable, sondern eine String-Variable. Die wird aus zwei Arrays (deren Größe ich an dieser Stelle nicht kenne) zusammengebaut und sieht konkret z.B. so aus (im Direktfenster):
?sBed
.Cells(4, 3) = "W*" AND .Cells(4, 2) = "Mayer"
Wenn ich nun "if sBed" codiere, bekomme ich einen Fehler "Typen unverträglich". Wundert mich auch nicht: sBed kann ja gar nicht true oder false werden - oder?
Grüße
Burkhard
Anzeige
AW: if-Bedingung als Variable
13.03.2018 18:56:57
Zwenn
Hallo Burkhard,
genau. Deine Variable allein enthält einfach keinen Wahrheitswert, deshalb der "Typen unverträglich" Fehler. Aber Tino hat Dir ja bereits die richtige Richtung für Dein vorhaben gewiesen. Ich kannte Evaluate bisher auch nicht, weil ich noch nie in der Situation war, einen Ausdruck auszuwerten, der nur als String vorliegt.
An Deinem Ausdruck fällt mir noch auf, dass er einen With-Block mit einer Sheet-Angabe voraussetzt, weil er mit einem Punkt beginnt.
Viele Grüße,
Zwenn
Anzeige
geht schon
13.03.2018 17:02:31
Tino
Hallo,
denke ist aber nicht im sinne des erfinders!
Sub Beispiel()
Dim sBed As String
sBed = "A1 = 250"
If Evaluate(sBed) Then
MsgBox True
Else
MsgBox False
End If
End Sub
Normal wird es so gemacht!
Sub Beispiel2()
Dim booBed As Boolean
'auf aktives Blatt bezogen wenn in Modul
booBed = Range("A1").Value = 250
'oder
booBed = Cells(1, 1).Value = 250 'oder
'oder auf Tabelle bezogen
booBed = Sheets("Tabelle1").Cells(1, 1).Value = 250
'oder
booBed = Tabelle1.Cells(1, 1).Value = 250
If booBed Then
MsgBox True
Else
MsgBox False
End If
End Sub
Gruß Tino
Anzeige
AW: geht schon
13.03.2018 17:28:18
Burkhard
Hallo Tino,
so etwas wie evaluate() brauche ich in genau dieser Situation, denn sBed wird aus zwei Arrays zusammengesetzt, deren Größe ich nicht kenne (und damit auch nicht, wieviele Bedingungen da noch kommen könnten). Im Direktfenster sieht das bei mir z.B. so aus:
?sBed
.Cells(4, 3) = "W*" AND .Cells(4, 2) = "Mayer"
Das Dumme ist nur: ich bekomme bei "if evaluate(sBed)" immer noch einen Type-Mismatch-Fehler!
Grüße
Burkhard
Anzeige
kannst Du ein Beispiel hochladen?
13.03.2018 17:32:34
Tino
Hallo,
kann es so nicht testen!
Gruß Tino
AW: kannst Du ein Beispiel hochladen?
14.03.2018 10:24:51
Burkhard
Hallo Tino,
in https://www.herber.de/bbs/user/120405.xlsm sind die wichtigsten Infos im Kommentar. Einige meiner Fehlversuche kannst du auch noch finden ...
Vielen Dank für deine Unterstützung!
Grüße
Burkhard
Anzeige
AW: kannst Du ein Beispiel hochladen?
14.03.2018 13:36:00
Tino
Hallo,
vielleicht geht es auch so.
Makro im Modul1 Start ausführen und im Direktfenster ausgeben!
Beachte die Hilfstabelle Tabelle0 die ich ausgeblendet habe!
https://www.herber.de/bbs/user/120413.xlsm
PS: vielleicht liege ich auch komplett daneben und verstehe dein Vorhaben nicht! Sorry!
Gruß Tino
Anzeige
AW: ist evaluate() ad acta?
14.03.2018 15:47:07
Burkhard
Hallo Tino,
erstmal vielen Dank, das ist ein interessanter Ansatz. Mit ein paar Schwachstellen, aber das liegt nicht an dir und ließe sich wohl beheben. Allerdings mag ich prinzipiell nicht so gerne zur Laufzeit eine Hilfstabelle anlegen (und danach wieder wegwerfen), und genau das müsste ich hier tun.
Die Idee mit dem evaluate() hast du wohl ad acta gelegt? Die wäre mir - wenn sie denn funktioniert - wesentlich sympathischer! Die Herausforderung besteht wohl darin, den Suchstring richtig zusammenzubasteln, denn im Direktfenster habe ich das (mit einem sehr vereinfachten Test-String) durchaus hinbekommen. Aber frag mich bitte nicht, wie der ausgesehen hat, das war heute Vormittag, also vor Programmierer-Äonen ...
Grüße
Burkhard
Anzeige
AW: ist evaluate() ad acta?
14.03.2018 16:37:32
Tino
Hallo,
Evaluate nur weil ich davon ausging das der der String nicht zusammengebastelt wird sonder bereits vorliegt.
Die Tabelle ist immer da nur nicht sichtbar!
Gruß Tino
AW: ist evaluate() ad acta?
14.03.2018 17:05:26
Burkhard
Hallo Tino,
da draußen gibt es viele Anwender, und keiner von ihnen hat diese Hilfstabelle (sichtbar oder nicht) - deswegen müsste die in der Tat prinzipiell erst erstellt werden.
Ob der Suchstring nun "zusammengebastelt" wird oder "schon vorliegt" - irgendwoher muss er ja kommen, und irgendwie muss er wohl auch bestimmte Voraussetzungen erfüllen. Die vba-Hilfe und div. Internet-Suchen haben mich da nicht wirklich weitergebracht.
Hast du eine Idee oder Tipps, wie dieser Suchstring korrekterweise aussehen müsste? Ich bin ja durchaus zum Rumprobieren bereit, aber da sollte dann schon irgendwie eine Zielrichtung klar sein. Im Moment bin ich in dieser Hinsicht ziemlich am Ende mit meinem Latein (bzw. vba).
Grüße
Burkhard
Anzeige
AW: ist evaluate() ad acta?
14.03.2018 17:14:49
Tino
Hallo,
der String muss in diesem Fall eine Formel sein.
Die Platzhalterzeichen machen es schwierig eine gescheite Formel zu erstellen.
Evtl. Geht es mit Zählenwenn, muss mal schauen.
Gruß Tino
versuch es mal so...
14.03.2018 17:54:45
Tino
Hallo,
verwende Zählenwenn wegen Platzhalterzeichen und
Min um zu prüfen ob alle Suchkriterien erfüllt sind!
For i = 0 To UBound(arSearchColumns)
sSearchString = sSearchString & sAndString & _
"CountIF(" & ColumnLetter(arSearchColumns(i)) & iRow & _
"," & Chr(34) & arValues(i) & Chr(34) & ")"
sAndString = ","
Next i
If Evaluate("MIN(" & sSearchString & ")>0") Then

Anzeige
Yabba Dabba Doo!
15.03.2018 09:50:45
Burkhard
Hallo Tino,
nie im Leben ...
... wäre ich auf diese Lösung gekommen! Aber es funktioniert! Vielen Dank!!!
Grüße
Burkhard
;
Anzeige
Anzeige

Infobox / Tutorial

if-Bedingung als Variable in Excel VBA


Schritt-für-Schritt-Anleitung

Um eine if-Bedingung in Excel VBA mit einer Variable zu verwenden, kannst du die Methode Evaluate nutzen. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Variable deklarieren: Erstelle eine String-Variable, die den Ausdruck enthält, den du auswerten möchtest.

    Dim sBed As String
    sBed = "A1 = 250"
  2. If-Bedingung einfügen: Nutze die Evaluate-Methode, um den String auszuwerten.

    If Evaluate(sBed) Then
       MsgBox "Bedingung erfüllt"
    Else
       MsgBox "Bedingung nicht erfüllt"
    End If
  3. Ausführen: Starte das Makro, um die if-Bedingung zu testen.


Häufige Fehler und Lösungen

  1. Typen unverträglich: Wenn du versuchst, eine String-Variable direkt in einer if-Bedingung zu verwenden, erhältst du möglicherweise einen Fehler "Typen unverträglich". Stelle sicher, dass du die Evaluate-Methode verwendest.

  2. Falsche Syntax: Achte darauf, dass der String korrekt formuliert ist. Beispiel:

    sBed = "Cells(4, 3) = 'W*' AND Cells(4, 2) = 'Mayer'"
  3. Hilfstabellen vermeiden: Wenn du Evaluate verwendest, um eine Bedingung zu überprüfen, stelle sicher, dass du keine Hilfstabellen benötigst, die nicht im Code definiert sind.


Alternative Methoden

Falls du keine if-Bedingung mit einer String-Variable nutzen möchtest, kannst du auch direkt mit Booleschen Variablen arbeiten:

Dim booBed As Boolean
booBed = Range("A1").Value = 250

If booBed Then
    MsgBox "Bedingung erfüllt"
Else
    MsgBox "Bedingung nicht erfüllt"
End If

Diese Methode ist oft einfacher und weniger fehleranfällig, insbesondere wenn du mit festen Werten arbeitest.


Praktische Beispiele

Hier sind einige Beispiele, wie du die if-Bedingung mit einer String-Variable in komplexeren Szenarien nutzen kannst:

  1. Beispiel mit mehreren Bedingungen:

    Dim sBed As String
    sBed = "CountIF(A1:A10, 'Bedingung') > 0"
    If Evaluate(sBed) Then
       MsgBox "Mindestens eine Bedingung erfüllt"
    End If
  2. Verwendung von Platzhaltern:

    Dim sSearchString As String
    sSearchString = "CountIF(A1:A10, '*Mayer*')"
    If Evaluate(sSearchString) > 0 Then
       MsgBox "Mindestens ein Treffer gefunden"
    End If

Tipps für Profis

  • Debugging: Nutze das Direktfenster in VBA, um die Ausdrücke vor der Ausführung zu testen. Du kannst den Inhalt deiner String-Variablen prüfen, indem du ?sBed eingibst.

  • Komplexe Bedingungen: Wenn du mehrere Bedingungen hast, denke daran, die Logik sorgfältig zu planen. Oft ist es hilfreich, die Bedingungen schrittweise zusammenzustellen.

  • Effizienz: Wenn du mit großen Datenmengen arbeitest, überlege, ob die Verwendung von Evaluate die beste Lösung ist. Manchmal sind direkte Vergleiche oder Schleifen effizienter.


FAQ: Häufige Fragen

1. Kann ich die if-Bedingung auch ohne Evaluate nutzen? Ja, wenn du eine Boolesche Variable verwendest, kannst du die if-Bedingung direkt nutzen, ohne Evaluate.

2. Was passiert, wenn der String nicht korrekt formatiert ist? Wenn der String nicht korrekt formatiert ist, erhältst du einen Laufzeitfehler. Achte darauf, die Syntax genau zu überprüfen.

3. Wie gehe ich mit Platzhaltern in Bedingungen um? Verwende die Funktion CountIF oder SumIF, um Platzhalter richtig zu handhaben.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige