Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
800to804
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
800to804
800to804
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Bei Finden Fehler abfangen

Bei Finden Fehler abfangen
16.09.2006 23:56:34
Harald
Hallo Mitanwender
Programm Code Zeile:
ZeL = Range(Cells(3, SpL - 1), Cells(ZeS - 1, SpL - 1)).Find(What:=B, After:=Cells(3, SpL - 1), LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, SearchFormat:=False).Row
Ist der zu suchende Begiff von der Variablen - B - vorhanden, so wird in der Variablen - Zel - die Zeilen-Nummer zurückgegeben.
Soweit ist es in Ordnung
Aber ist der Suchbegiff nicht vorhanden, so kommt die Fehlermeldung:
Objektvariable oder With-Blockvariable nicht festgelegt.
Ich möchte das bei nicht vorhandenem Suchbegriff 0 oder -1 übergeben wird,
in die Variable - Zel -
oder
wenigstens kein Abbruch erfolgt.
Guß an alle Harald

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bei Finden Fehler abfangen
17.09.2006 00:14:28
Stefan
Hallo Harald,
Das kannst Du mit einem
If ZeL is Nothing then...
abfangen. Ausserdem solltest Du denke ich ein "Set" vor "ZeL=..." setzen... ohne dass funkionierts bei mir ueberhaupt nicht, aber vielleicht hast Du's ja schon vorher initialisiert.
Schoene Gruesse
Stefan
AW: Bei Finden Fehler abfangen
17.09.2006 00:33:17
Harald
Hallo
Beides geht nicht
Bei Set kommt Objekt Variable nicht angegeben
Bei IF ... Then kommt
Tüpen unverträglich.
Zel ist eine Double-Variable
B= String-Variable
Guß Harald
AW: Bei Finden Fehler abfangen
17.09.2006 00:39:03
Josef
Hallo Harald!
Stell doch einfach zuerst fest, ob der Suchbegriff gefunden wird,
und übergib dann die Zeile.
Dim rng As Range

Set rng = Range(Cells(3, SpL - 1), Cells(ZeS - 1, SpL - 1)).Find( _
  What:=B, _
  After:=Cells(3, SpL - 1), _
  LookIn:=xlFormulas, _
  LookAt:=xlWhole, _
  MatchCase:=True)

If Not rng Is Nothing Then
  Zel = rng.Row
Else
  Zel = -1
End If

Gruß Sepp

Anzeige
AW: Bei Finden Fehler abfangen
17.09.2006 00:42:32
Stefan
Da liegt der Hund begraben...
Die Find Funktion gibt Dir ein Range-Objekt zurueck. Wenn das gefuellt wird, ist der Standard-Rueckgabewert der Value des Range-Objektes, deshalb kriegst Du keinen Fehler wenn der Wert gefunden wird. Schau Dir den folgenden Code mal an und pass Ihn auf Deine belange an:

Sub test()
Dim i As Range
Dim ZeL As Double
Set i = ThisWorkbook.ActiveSheet.Range("A5").Find(2)
If i Is Nothing Then ZeL = 0 Else ZeL = i.Value
End Sub

Lass mich bitte wissen ob's funktioniert.
Schoene Gruesse
Stefan
AW: Bei Finden Fehler abfangen
17.09.2006 01:03:00
Harald
Hallo
Es funktioniert beides.
Aber es ist zu langsam. weil es 2 Schritte sind.
Zuerst das Rangeobjekt dann das umwandeln in die Zeilennummer.
Mit der Find funktion habe ich gleich die Zeilennummer.
mit on error kann ich den fehler abfangen. das ist immer noch schneller.
Aber nicht das eigentliche Ziel.
ZeL = Range(Cells(3, SpL - 1), Cells(ZeS - 1, SpL - 1)).Find(What:=B, After:=Cells(3, SpL - 1), LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, SearchFormat:=False).Row
With-Blockvariable die vermist wird zum begrenzen der Suche.
wie kann man diese angeben.
Also ich denke: wenn das ende erreicht beispielsweise zeile 56874. dann 0 zurückgeben.
Anzeige
AW: Bei Finden Fehler abfangen
17.09.2006 01:16:12
Matthias
Hallo Harald,
zu langsam?
Mit der Find funktion habe ich gleich die Zeilennummer.
mit on error kann ich den fehler abfangen. das ist immer noch schneller.

Schneller? Hast du das getestet? Dein Code beinhaltet letztlich aus 2 Schritte, nur dass sie in einer Codezeile stehen: Erst die Zelle mit .Find ermitteln, dann die Zeile der Zelle ermitteln.
Gruß Matthias
AW: Bei 10000 suchungen ca . 12,34 Sek.
17.09.2006 01:26:19
Harald
Hallo
im moment sind es ca 460.000 suchungen die ausgeführt werden sollen.
pro tag ca 3.650 mehr. da ist die Zeit ein entscheidender faktor.
Gruß Harald
AW: Bei 10000 suchungen ca . 12,34 Sek.
17.09.2006 02:12:39
Matthias
Hallo Harald,
also das mit den 12,34 Sek. hat mich dann doch interessiert, trotz der späten Stunde:
ich habe in einem ansonsten leeren Tabellenblatt die Spalte A mit den Werten "as" geschrieben. Je nach Test kam dann das Wort "Hi"

  1. in Zelle A65536,
  2. in Zelle A2,
  3. in keine Zelle (negatives Suchergebnis).

Meine Versuchsmakros:

Sub test1()
Dim i As Long, t As Single
Dim z As Long
Dim tmp As Long
On Error Resume Next
t = Timer
For i = 1 To 1000 'oder 100000, siehe unten
z = Range("A:A").Find(What:="Hi", LookIn:=xlFormulas, LookAt:=xlWhole).Row
If Err.Number = 0 Then
tmp = tmp + 1
Else
Err.Clear
tmp = tmp - 1
End If
Next i
t = Timer - t
Debug.Print "Test1: " & Round(t, 2) & "Sek."
End Sub
Sub test2()
Dim i As Long, t As Single
Dim z As Range
Dim tmp As Long
t = Timer
For i = 1 To 1000 'oder 100000, siehe unten
Set z = Range("A:A").Find(What:="Hi", LookIn:=xlFormulas, LookAt:=xlWhole)
If Not z Is Nothing Then
tmp = tmp + 1
Else
tmp = tmp - 1
End If
Next i
t = Timer - t
Debug.Print "Test2: " & Round(t, 2) & "Sek."
End Sub

Und hier die Ergebnisse meiner Testläufe:

  1. "Hi" in A65536, i bis 1000
    ---------------
    Test1: 23,75Sek.
    Test1: 22,53Sek.
    Test1: 22,52Sek.
    Test2: 22,48Sek.
    Test2: 22,52Sek.
    Test2: 22,53Sek.
  2. "Hi" in A2, i bis 100000:
    -----------
    Test1: 6,44Sek.
    Test1: 6,42Sek.
    Test1: 6,44Sek.
    Test2: 6,11Sek.
    Test2: 6,12Sek.
    Test2: 6,11Sek.
  3. "Hi" nicht in Spalte A, i bis 1000:
    -----------
    Test1: 22,44Sek.
    Test1: 22,44Sek.
    Test1: 22,41Sek.
    Test2: 22,44Sek.
    Test2: 22,38Sek.
    Test2: 22,39Sek.

Die Abfrage auf "Zelle Is Nothing" ist also sogar einen Hauch schneller als die einzeilige Codezeile mit Fehlerabfangen.
Gruß Matthias
Anzeige
AW: Genjal Einfach super
17.09.2006 02:36:28
Harald
Hallo
Diese Antwort hat mich auf die richtige Idee gebracht.
Die Range suche ist schneller das if war das hinternis in der zeit
Set Rng = Range(Cells(3, SpL - 1), Cells(ZeS - 1, SpL - 1)).Find(What:=B, After:=Cells (3, SpL - 1), LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, SearchFormat:=False)
If Not Rng Is Nothing Then
C = Cells(Rng.Row, SpL)
If InStr(C, " ") größerals 0 Then Wh = -1 ' Das Wort wurde getrennt, nochmal Zeile testen
Else
C = ""
End If
Diese Lösung ist das schnellste, bei 10.000 gute 23 Prozent als meine Version.
Herzlichen Dank dafür.
Ps. und das auch ohne Abbruchs-Fehler.
Anzeige
AW: Zusatz zur Suche
17.09.2006 01:19:35
Harald
Hallo
Der Suchbegriff ist nur 1 mal oder nicht vorhanden.
ich brauche also die Zeilen-Nummer wenn er vorhanden ist.
leider habe ich in der hilfe noch kein hinweis zur
With-Blockvariablen gefunden. Diese angabe verhindert vieleicht den fehler,
wen das gesuchte Wort nicht vorhanden ist.
Wenn ich nur wüste was das sein soll.
Gruß Harald
AW: Zusatz zur Suche
17.09.2006 01:36:21
Stefan
Hallo Harald,
Die With-Blockvariable wird Dir nicht weiterhelfen.
Wenn Du z.B. unterschiedliche Eigenschaften eines Objektes immer wieder ansprichst, kann Dir die With-Blockvariable arbeit ersparen. Anstatt z.B. zu schreiben
Activesheet.Range("A1").Value=3
Activesheet.Range("B1").Value=5
kannst Du schreiben
With Activesheet
.Range("A1").Value=3
.Range("B1").Value=5
End With
In diesem Fall ist das natuerlich laenger als der urspruengliche Code, aber wenn Du Activesheet oft aufrufen musst, macht das weniger Arbeit. Ich glaub nicht das Dich das in Deinem Vorhaben weiterbringen wird.
Da Excel nicht weisst ob Du eigentlich solch eine With-Blockvariable ansprechen wolltest, bekommst Du diese Fehlermeldung. Dein Code versucht in einer Double Variable einen nicht vorhandenen Wert zu speichern. Mit Range geht das, mit Double nicht.
Schoene Gruesse
Stefan
Anzeige
AW: Zusatz zur Suche
17.09.2006 01:45:42
Harald
Hallo
ja das sehe ich in der Zwischenzeit genau so.
ich überlege gerade ob es mit einer if abfrage gehen könnte.
binn gerade am probieren.
Gruß Harald

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige