Wie setze ich das richtig in VBA um?
Hallo,
ich habe folgenden Code in Excel VBA. Leider komme ich nicht weiter.
Ich suche einen Wert der Zelle E1 in Spalte A1.
Ist der Wert aus E1 vorhanden, soll ein Sub geöffnet werden.
Ist dieser Wert nicht vorhanden, soll eine MsgBox geöffnet werden und nach dem Schließen der Box die UserForm1.
Aktuell macht der Code folgendes: Egal ob der Wert vorhanden ist oder nicht, es wird die MsgBox geöffnet und der Code wird auch bei richtiger Zahl nicht ausgeführt.
Ich würde mich freuen, wenn mir einer helfen kann bei meiner Spielerei. Danke.
Sub suche()
Dim zelle As Range
For Each zelle In Sheets("Tabelle1").Range("A1:A1000").Cells
If zelle.Value = Sheets("Tabelle1").Range("E1") Then
'Sheets("Tabelle1").Activate
zelle.Activate
Call create
Exit For
Else
MsgBox "Nr. ist nicht vorhanden!", vbExclamation
UserForm1.Show
Exit Sub
End If
'Call create
Next
End Sub
2 Antworten
Die Loop dauert zu lange.
Dim Ergebnis as Variant
Ergebnis = Application.Match(zelle.value, Sheets("Tabelle1").Range("A1:A1000"),0)
if isError(Ergebnis) then
MsgBox "bla"
else
Call MySub
End if
Ah bin ich doof, ich habe es, musste natürlich noch Set zelle setzen.
Set zelle = Range("E1")
Jetzt hänge ich nur gerade fest, weil ich mit Werten aus der gefundenen Zelle arbeiten möchte und dazu würde ich die gefundene Zelle testweise aktivieren bzw. selektieren. Wir geht das denn nun?
In dem result steht die Zeilennummer, da du bei A1 begonnen hast.
ZellenInhalt = Range("A" & result).Value
Mega! Und danke für die Erklärung, denn wenn ich es verstehe ist es so einfach :-).
Ich habe nun diesen Code und er macht was er soll. Nur muss ich jetzt eine zweite Frage eröffnen, da ich noch ein ganz anderes Problem habe...
Sub suche()
Dim result As Variant
Dim zelle As Range
Set zelle = Range("E1")
result = Application.Match(zelle.Value, Sheets("Tabelle1").Range("A1:A1000"), 0)
Range("A" & result).Select
If IsError(result) Then
MsgBox "Nr. ist nicht vorhanden!", vbExclamation
UserForm1.Show
Else
MsgBox "Test"
'Call create
End If
End Sub
Es sollte so sein, sonst kann es zu einem Crash kommen.
.Select nur dort wo die Zeile auch gefunden wurde.
result = Application.Match(zelle.Value, Sheets("Tabelle1").Range("A1:A1000"), 0)
If IsError(result) Then
MsgBox "Nr. ist nicht vorhanden!", vbExclamation
UserForm1.Show
Else
Range("A" & result).Select
MsgBox "Test"
'Call create
End If
Wow... ich suche mir immer Schnipsel zusammen und bastel das so dass es passt. Mehr kann ich nicht. Ich probiere das mal aus. Danke.
Der läuft das Else jetzt für jede Zelle durch und das macht ja keinen Sinn.
Vorschlag (auf die Schnelle).
Ersetzte mal das
"Exit For"
durch:
Exit Sub
End If
Next
und das "Else" weg, sodass die Messagebox und die UserForm ganz außerhalt der Schleife stehen.
Durch das "Exit Sub" werden die ja übersprungen, falls das If erfüllt ist.
Ich hoffe ich mache jetzt keine Denkfehler.
Ist (noch) ungetestet.
Danke. Ich teste das mal. Ich habe einfach Schwierigkeiten zu verstehen wie diese Schleife läuft.
Setzt am Anfang einen Haltepunkt (F9) und gehe dann mit F8 Step by Step weiter.
Im Fenster "Überwachungsausdrücke" kannst Du Dir die aktuellen Werte der Variablen anzeigen lassen (Drag&Drop).
Ich bin zu blöd. Habe den Code angepasst, aber da fehlt was.
Es soll ja nach dem Wert in E1 geprüft werden (der Wert wird dort aus einer Textbox eingetragen und dient als Zwischenspeicher).
Wenn ich den Code nun nur so einfüge:
Erhalte ich die Fehlermeldung "Objektvariable oder die With-Blockvariable wurde nicht festgelegt". Markiert wird die Zeile mit dem Code