Wie setze ich das richtig in VBA um?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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

fx8350 
Fragesteller
 24.04.2022, 16:28

Wow... ich suche mir immer Schnipsel zusammen und bastel das so dass es passt. Mehr kann ich nicht. Ich probiere das mal aus. Danke.

0
fx8350 
Fragesteller
 25.04.2022, 10:01

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:

Sub suche()
    Dim result As Variant
    Dim zelle As Range

    result = Application.Match(zelle.Value, Sheets("Tabelle1").Range("A1:A1000"), 0)
    If IsError(result) Then
    MsgBox "Nr. ist nicht vorhanden!", vbExclamation
    UserForm1.Show
    Else
    Call create
    End If
End Sub


Erhalte ich die Fehlermeldung "Objektvariable oder die With-Blockvariable wurde nicht festgelegt". Markiert wird die Zeile mit dem Code

result = Application.Match(zelle.Value, Sheets("Tabelle1").Range("A1:A1000"), 0)
0
fx8350 
Fragesteller
 25.04.2022, 10:19
@fx8350

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?

0
IchMalWiederXY  25.04.2022, 13:51
@fx8350

In dem result steht die Zeilennummer, da du bei A1 begonnen hast.
ZellenInhalt = Range("A" & result).Value

1
fx8350 
Fragesteller
 25.04.2022, 14:12
@IchMalWiederXY

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
0
IchMalWiederXY  25.04.2022, 14:19
@fx8350

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

1

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.

Woher ich das weiß:Berufserfahrung – IT-Administrator (i.R.)
fx8350 
Fragesteller
 24.04.2022, 10:01

Danke. Ich teste das mal. Ich habe einfach Schwierigkeiten zu verstehen wie diese Schleife läuft.

0
Oubyi, UserMod Light  24.04.2022, 14:05
@fx8350

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).

1