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

Objektvariable nicht definiert

Forumthread: Objektvariable nicht definiert

Objektvariable nicht definiert
14.11.2024 01:47:15
Klaus B aus D
Hallo,

eine nachgebaute Youtube-Datei von Kai Weissmann "Tabelle durchsuchen und Wert ausgeben | Excel VBA" funktioniert mit diesem Code problemlos:
Option Explicit


Sub TabelleDurchsuchen()

' Variabe dimensionieren
Dim rng As Range

' Tabelle durchsuchen u. Zelle speichern
Set rng = Range("tblKunden[KundenID]").Find(What:=5, LookAt:=xlWhole) ' identisch m. Suchen u. Ersetzen-Fenster

' Wert ausgeben (Messagebox, Direktfenster, Zelle oder UserForm)
MsgBox rng.Value

End Sub


Verwende ich den Code (angepasst) in meiner Anwendung, dann erscheint die Meldung "Objektvariable oder ... nicht definiert".

Option Explicit


Sub TabelleDurchsuchen()

' Variable dimensionieren
Dim rng As Range

' Tabelle durchsuchen
Set rng = Range("tblWertungspunkte[Startnummer]").Find(what:=6, LookAt:=xlWhole) ' Find = Excel-Suchfunktion

' Wert ausgeben
MsgBox rng.Value

End Sub


Die Zeile "MsgBox rng.Value" wird markiert.
Wo könnte ich den Fehler finden?

Gruß Klaus


Anzeige

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Objektvariable nicht definiert
14.11.2024 04:02:27
Onur
Bedeutet wohl: "Nicht gefunden".
AW: Objektvariable nicht definiert
14.11.2024 04:49:11
Oberschlumpf
Hi,

ersetz mal den Code...
MsgBox rng.Value

...durch das hier...


If Not rng is Nothing Then
MsgBox rng.Value
End If

...hilfts?

Ciao
Thorsten
Anzeige
AW: Objektvariable nicht definiert
14.11.2024 12:40:45
Klaus B aus D
Hallo Thorsten,

danke für den Code. Eine Fehlermeldung erscheint jetzt zwar nicht mehr, aber eine Treffer-Nachricht erscheint genauso wenig.
Das dürfte wohl irgendwie an der Art der Suche (in der intelligenten Tabelle) liegen ...

Gruß Klaus
AW: Objektvariable nicht definiert
14.11.2024 07:45:54
Luschi
Hallo Klaus,

außerdem hat Herr Vba-Oberlehrer Weissmann folgenden sehr wichtigen Hinweis aus der Vba-Online-Hilfe nicht beachtet:
Die Einstellungen für LookIn, LookAt, SearchOrder und MatchByte werden gespeichert, sobald Sie diese Methode verwenden.
Falls Sie beim nächsten Aufruf dieser Methode keine Werte für die Argumente angeben, werden die gespeicherten Werte verwendet. Das Festlegen dieser Argumente ändert die Einstellungen im Dialogfeld Suchen, und durch Ändern der Einstellungen im Dialogfeld Suchen werden die gespeicherten Werte geändert, die verwendet werden, wenn Sie die Argumente auslassen. Um Probleme zu vermeiden, legen Sie diese Argumente jedes Mal explizit fest, wenn Sie diese Methode verwenden.
Zu jedem Range.Find gehört im nächsten Schritt sofort die Prüfubng, ob was gefunden wurde, so wie es Thorsten zeigte:
If Not rng is Nothing Then

Gruß von Luschi
aus klein-Paris
Anzeige
AW: Objektvariable nicht definiert
14.11.2024 16:00:24
Piet
Hallo Klaus

im Prinzip haben dir alle Kollegen die Lösung schon gegeben. Auch Thorsten mit seinem Code.
Den könnte man noch mit Else erweitern um eine zweite MsgBox "Eintrag nicht gefunden!"
Es gibt ja nur diese beiden Möglichkeiten. Es gibt einen Treffer, oder keinen!

Was bitte möchtest du sonst erreichen, wenn dir diese Lösung nicht gefällt??
Erkläre es uns bitte noch mal. Vielleicht verstehen wir dann ja was du genau suchst.

mfg Piet
Anzeige
AW: Objektvariable nicht definiert
14.11.2024 19:41:13
Klaus B aus D
Hallo,
danke zunächst an alle Unterstützer. Ich habe mal eine reduzierte Datei hochgeladen, damit man nicht in die Glaskugel schauen muss.
Die Tabelle besitzt Verknüpfungen zu einer Teilnehmer-Tabelle, um die TN zu übernehmen, die in der hochgeladenen Tabelle eine Punktewertung bekommen.

https://www.herber.de/bbs/user/173623.xlsm

Gruß Klaus
Anzeige
AW: Objektvariable nicht definiert
14.11.2024 20:18:13
Luschi
Hallo Klaus,

eigentlich hätte Dein Vba-Code nach meinem 1. Einwurf so aussehen sollen:
     Set rng = Range("tblWertungspunkte[Startnummer]").Find( _

What:=6, LookIn:=xlValues, Lookat:=xlWhole, _
SearchOrder:=xlByColumns, MatchCase:=False, _
MatchByte:=False, SearchFormat:=False)
If Not (rng Is Nothing) Then
MsgBox rng.Value
Else
MsgBox "Sorry, ...leider nix gefunden"
End If

Gruß von Luschi
aus klein-Paris
Anzeige
AW: Objektvariable nicht definiert
15.11.2024 12:34:19
Klaus B aus D
Hallo Luschi,

besten Dank für die Unterstützung. Jetzt klappt die Suche nach einer eingegebenen Ziffer (im Code) fehlerfrei!
Nachdem ich in der Spalte "Startnummer" jetzt beim Durchsuchen Treffer landen kann, muss ich noch dafür sorgen, dass weitere Einträge aus dem gefundenen Datensatz in die Felder einer UserForm aufgenommen werden. Anschließend sollte die zu suchende Startnummer nicht mehr im Code verankert sein, sondern aus der UserForm stammen. Mal sehen, wie weit ich komme ...

Nochmals ein "Danke schön".
Gruß Klaus
Anzeige
AW: Objektvariable nicht definiert
15.11.2024 14:25:37
Yal
Hallo Klaus,

bei der Menge an Daten ist eine einzelne Prüfung nicht wesentlich langsamer.
Da Du mit einem ListObject arbeitest, kannst Du direkt mit dem Objekt bzw, seine Unterobjekte arbeiten (ListRows, ListRow, ListColumn, ...)

Es würde so aussehen:
Private Function Datensatz(ByVal Schlüssel As String) As ListRow

Dim LR As ListRow
For Each LR In Range("tblWertungspunkte").ListObject.ListRows
If LR.Range(1).Value = Schlüssel Then
Set Datensatz = LR
Exit Function
End If
Next
End Function

Public Sub Test()
Dim TestSchlüssel As Long
Dim LR As ListRow

For TestSchlüssel = 0 To 15 Step 3
Set LR = Datensatz(TestSchlüssel)
If Not LR Is Nothing Then
Debug.Print LR.Range(LR.Parent.ListColumns("Name").Index).Value
End If
Next
End Sub


VG
Yal
Anzeige
AW: Objektvariable nicht definiert
15.11.2024 21:21:12
Klaus B aus D
Hallo Yal,

danke für die Codezeilen. Ich versuche immer noch die "Private Function" zu begreifen.
Hier meine Gedanken:
- "Private Function" ermittelt im gesamten Tabellenbereich "tblWertungspunkte" die Zeilen auf dem Excel-Arbeitsblatt.
- Über eine Schleife werden Werte in der jeweiligen Zeile eingelesen.
- Es folgt die Prüfung, ob in der Zeile ein Wert "Schlüssel" (nicht als String zu verstehen) vorkommt, und zwar in LR.Range(1). Hier muss ich passen: was ist der Schlüssel", was "Range(1)"?
- Wenn dieser Begriff (Schlüssel) in der Zeile vorkommt, dann wird die Zeile mit "LR" gekennzeichnet.
- Das müsste also ein gesuchter Treffer sein? Eigene Antwort: Nein, dieser Eintrag wird (im Direktfenster) ausgegeben.

In Public Sub Test() erkenne ich:
- An die Funktion "Datensatz" wird der Wert "Testschlüssel" übergeben, z. B. ??
- Das Ergebnis wird dann in der Public Sub kontrolliert und bei Vorhandensein von gefüllten Zeilen im Arbeitsblatt im Direktfenster ausgegeben.
- In der Debug.Print-Anweisung lässt sich "Name" z. B. durch "HK1" ersetzen, um mir drei Ergebnisse von Wertungspunkten statt Namen zurückzugeben.

Habe ich das richtig wiedergegeben?

Gruß Klaus
Anzeige
AW: Objektvariable nicht definiert
18.11.2024 17:32:02
Yal
Hallo Klaus,

hmm... Du bist noch an den Anfang auf dem Weg zum VBA-Versteher. Wir begleiten dich. Vor allem, weil es hier mit Objekt-Variablen gearbeitet wird, was zwar intuitiv, aber nicht direkt ohne Erklärung zu erfassen ist.

"private" (im ggt zu "public") dient nur die Sichtbarkeit/Ausrufbarkeit der Sub oder Function: Private sind nur innerhalb der Modul, in dem sie definiert sind, aufrufbar. Diese Modul können den Mappen-Modul "DieseArbeitsmappe", jede einzelne Tabellen-Modul ("Tabelle1", usw) oder einen allgemeine Modul ("Module1"). Später kommen noch andere dazu. "Public" sind von überall sichtbar/abrufbar.

Da "Datensatz" eine Function, spricht ein Sub, die eine Wert zurückgibt, kann diese nicht direkt gestartet werden, sondern nur gerufen werden. Der Aufruf wird im "Test" gemacht.

Im Test befindet sich eine Schleife mit einer Schleifen-Variable "TestSchlüssel":
Für jeden Werte von 0 bis 15 in 3er Schritt, übernimmt die Variable TestSchlüssel diesen Wert: 0, 3, 6, 9, 12, 15.
Dann wird die Function "Datensatz" mit TestSchlüssel als Parameter gerufen. Hier gibt es eine Schweinerei: TestSchlüssel ist eigentlich ein Zahl, die Function "Datensatz" erwartet einen String (=Zeichenkette). Es wird einen Typenkonversion bei der Übergabe stattfinden. Nicht schlimm: aus einem Zahl kann man immer einen String machen. Andersrum nicht.

Springen wir ins "Datensatz":
die Wert "0" wird genommen und der Variable "Schlüssel" übergeben ("Schlüssel" ist eine lokale Variable, so ein Art von "sehr-private", das nur innerhalb der Sub/Function gilt!)
Es werden durch die "For Each"-Schleife jede Zeile des Objekts vom Typ "ListObject" durchgelaufen. Hier arbeitet man mit Objektvariablen vom Typ "ListRow". Um diese zu verstehen, solltest Du im Schritt-Modus (F8-Taste) mit offenen Lokalfenster (Ansicht, Lokalfenster) durchlaufen lassen. ListRows (mit s) ist die Auflistung aller ListRow (ohne s) innerhalb eines ListObject (hier verzichte ich absichtlich auf dem genitiv-s. ListObjects (mit s) ist die Auflistung aller ListObject in einem Arbeitsblatt).
Kurz: vom Range mit dem Namen "tbl..." davon das untergeordnete ListObject-Objekt, davon die Auflistung ListRows.
Ein "For Each" kann nur auf einem Auflistung oder Array gemacht werden. Jede einzelne Element von ListRows ist von Typ ListRow (mit/ohne s).

Die ListRow hat eine Eigenschaft "Range". Dieses Objekt ist so ein Art von "Array" (auf deutsch "Tabelle", aber sagen wir lieber "Liste". Array und Auflistung sind sehr ähnlich). Jede einzelne Element von Range ist selber ein Objekt vom Typ "Zelle" (dieser Typ existiert nicht richtig. Aber die Erklärung wäre sonst zu kompliziert. Es ist ein "Range", der nur eine einzige Zelle hat).
Auflistung und Array kann man mit einem Index zugreifen. Diese Array startet mit 1 und endet bei ListRow.Range.Count also der Anzahl von Element in diesem Array. Hier ist es aber egal, da wir nur die erste SPalte beachten, also Range(1). Wir vergleichen den Wert darin ("Range(1).value") mit der Wert, den wir die lokale Variable "Schlüssel" übergeben haben. Wenn Gleicheit, wird das gesamte ListRow dem Ergebnis der Function allokiert ("Set Datensatz = LR"). Weil es ein Objekt ist, muss man mit "Set" allokieren. Um die Verarbeitung zu beschleunigen, steigt man aus dem Function aus ("Exit Function") und springt dementsprechend ins Haupt-Sub zurück.

In "Test" wird das Ergebnis von Datensatz die Objekt-Variable LR zugewiesen (=allokiert), da Objekt -> "Set". Aber: wenn die Schleife in "Datensatz" ohne Ergebnis komplett durchgelaufen wäre, hätten wir keine "ListRow" zuweisen können. Die Function "Datensatz" liefert dann "Nothing" zurück. "Nothing" ist ein reserviertes Wort für fehlende Objekt, das Equivalent zu "0" für Zahlen oder "" (leere Zeichenkette) für String.

Daher wird geprüft ob "LR" ungleich "Nothing ist, und wenn es zutrifft, also LR setzt auf eine tatsächliche ListRow aus dem ListObject, dann wird der Wert des Ranges mit dem Index der Spalte mit dem Name "Name" im Direktfenster herausgegeben.


Diese Verwendung von Objekt und Objektauflistung kennst Du sicher schon, wenn Du den Makro-Rekorder verwendet hast, oder Code irgendwo gelesen:
Worksheets("Tabelle1") 'hier wird in der Auflistung der Worksheets das Element mit Namen "Tabelle" gerufen
Worksheets(1) 'das gleich wie oben, nur dass das erste Element gerufen wird

Range("A1") 'hier wird in dem Range-Array das Element mit Namen "A1" gerufen
Cells(1,1) 'in der Auflistung der "Cells" (mit s), was eine zwei-dimensionale Auflistung ist, wird die Zelle von Zeile 1 | Spalte 1 gerufen.
Cells(1,"A") ' Misch-Modus, wo die Spalten nicht als Index, sondern als Namen gerufen wird.

usw.

VG
Yal
Anzeige
AW: Objektvariable nicht definiert
14.11.2024 12:44:41
Klaus B aus D
Hallo Lushi

danke sehr für die sehr aufschlussreiche Antwort. Leider hat mich die Erweiterung des Codes nicht vorangebracht: Es erscheint zwar keine Fehlermeldung mehr, doch mein Ziel, einen Treffer in einer intelligenten Tabelle zu landen, erreiche ich noch nicht.

Gruß Klaus
AW: Objektvariable nicht definiert
14.11.2024 13:51:18
Luschi
Hallo Klaus,

mit 1 kleinen Beispieldatei kann man Dir besser helfen, als mit vielen theoretischen Erklärungen.

Gruß von Luschi
aus klein-Paris
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige