Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

DataBodyRange als Range

Forumthread: DataBodyRange als Range

DataBodyRange als Range
19.05.2020 09:13:59
Sandro
Liebes Forum
Ich möchte verschiedene ComboBoxen in meiner Userform über VLookup befüllen. Dazu möchte ich eine Tabelle "Infoblatt_Tabelle" auf dem Tabellenblatt "Infoblatt" mittels ListObjects("Infoblatt_Tabelle").DataBodyRange als Range für den Suchbereich definieren.
Dazu habe ich folgenden Code:

Private Sub TextBox28_AfterUpdate()
Dim Range_Infoblatt As Range
Set wbMappe = Application.ActiveWorkbook
Set wsBlattZiel = wbMappe.Worksheets("Infoblatt")
Set Range_Infoblatt = wsBlattZiel.ListObjects("Infoblatt_Tabelle").DataBodyRange
Me.ComboBox4 = Application.WorksheetFunction.VLookup(Val(TextBox28), Worksheets("Infoblatt"). _
Range("Range_Infoblatt"), 2, True)
Me.ComboBox5 = Application.WorksheetFunction.VLookup(Val(TextBox28), Worksheets("Infoblatt"). _
Range("Range_Infoblatt"), 3, True)
End Sub

Leider bekomme ich immer den Fehler "Anwendungs- oder objektdefinierter Fehler"
Ich hoffe hier kann mir jemand weiterhelfen.
Grüsse
Sandro
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: DataBodyRange als Range
19.05.2020 09:30:38
Daniel
Hi
1. solltst du, wenn du einen Fehler in einem Code hast und um Hilfe bittest, immer dazu sagen in welcher Programmzeile dieser Fehler auftritt. Excel zeigt DIR das an, und für uns erleichtert das die Arbeit, weil wir dann nicht den ganzen Code durchschauen müssen, sondern gleich in der Fehlerverursachenden Zeile mit der Suche beginnen können.
Aber wir sind keine Hellseher, auch wenn viele Fragesteller das immer wieder annehmen.
2. wenn man eine Range-Variable erstmal zugewiesen hat, dann kann man in der Folge diese Range-Variable direkt ohne jegliche Vorsätze (Worksheet, Tabellenblatt) verwenden, weil das in der Range-Varible schon drin steckt:
Me.ComboBox4 = Application.WorksheetFunction.VLookup(Val(TextBox28), Range_Infoblatt, 2, True)
so wie du das programmiert hast, müsste "Range_Infoblatt" ein definierter Name auf dem Tabellenblatt sein.
da du eine "intelligente Tabelle" hast, hast du diesen Namen ja auch. dh ohne die Variable könntest du den Zellbereich auch so ansprechen:
Me.ComboBox4 = Application.WorksheetFunction.VLookup(Val(TextBox28), Worksheets("Infoblatt"). _
Range("Infoblatt_Tabelle"), 2, True)
Gruß Daniel
Gruß Daniel
Gruß Daniel
Anzeige
AW: DataBodyRange als Range
19.05.2020 09:46:41
Sandro
Hallo Daniel
Danke für den Hinweis, werde dies bei künftigen Beiträgen gerne beachten.
Wenn ich dich richtig verstanden habe, sollte mein Code so funktionieren:
Private Sub TextBox28_AfterUpdate()
Me.ComboBox4 = Application.WorksheetFunction.VLookup(Val(TextBox28), Worksheets("Infoblatt"). _
Range("Infoblatt_Tabelle"), 2, True)
End Sub
Wie du richtig erkannt hast, habe ich die Tabelle mit den Daten "Infoblatt_Tabelle" genannt.
Leider erhalte ich nun in der Me.Combobox4 Spalte folgende Fehlermeldung:
"Die VLookup-Eigenschaft des WorksheetFuncion-Objektes kann nicht zugeordnet werden."
Als Ergänzung, die Suchbegriffe sehen so aus "D1231234" "D1234568". Also immer ein Buchstabe gefolgt von 7 Zahlen.
Vielleicht kommen wir nun zu einer Lösung.
Grüsse
Sandro
Anzeige
AW: DataBodyRange als Range
19.05.2020 09:58:26
Daniel
Hi
wenn du mit der SVerweis-Option 4. Parameter = True suchst, dann musst du folgendes beachten:
1. der verwendete Zellbereich des 2. Paramteters muss aufsteigend sortiert sein
2. wird der gesuchte Wert nicht gefunden, so wird der nächstkleinere Wert aus der List als Ergebnis verwendet.
der von dir genannte Fehler kann daher nur auftreten wenn der gesuchte Begriff kleiner ist als der erste Wert in der Liste, oder wenn die Liste unsortiert ist. Verwendet man TRUE in unsortierten Listen, kann man zwar ein Ergebnis bekommen, aber das ist Blödsinn (und manchmal auch der Fehler)
wenn deine Listen nicht sortiert sind, musst du den 4. Parameter auf FALSE setzen.
dann bekommst du aber immer einen Fehler, wenn der Suchbegriff nicht vorhanden ist.
um diesen Fehler zu vermeiden, musst du prüfen, ob der Wert überhaupt in der Liste drin ist:
If Worksheetfunction.CountIf(Worksheets("Infoblatt").Range("Infoblatt_Tabelle"), Val(TextBox28)) _
> 0 Then
me.Comobobox4 = Application.WorksheetFunction.VLookup(Val(TextBox28), Worksheets("Infoblatt" _
). _
Range("Infoblatt_Tabelle"), 2, False)
end if
kommen wir jetzt aber zu deinem eigentlichen Fehler und das ist, wie mein alter Lehrer zu sagen pflege, "ein dicker Hund":
schau dir mal in der Hilfe an, was die Funktion VAL macht und vergleiche das mit deinen Suchbegriffen "D1231234".
Fällt dir irgendwas auf?
Gruß Daniel
Anzeige
AW: DataBodyRange als Range
19.05.2020 10:20:26
Sandro
Hallo Daniel
Perfekt, jetzt hat's "Klick" gemacht!Code angepasst und nun funktioniert er.
Danke für deine Hilfe.
Grüsse
Sandro
Private Sub TextBox28_AfterUpdate()
Me.ComboBox4 = Application.WorksheetFunction.VLookup(CVar(TextBox28), Worksheets("Infoblatt"). _
Range("Infoblatt_Tabelle"), 2, False)
End Sub

Anzeige
;
Anzeige

Infobox / Tutorial

DataBodyRange als Range in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Öffne Excel und erstelle eine Userform, falls noch nicht vorhanden.

  2. Füge ComboBoxen zu Deiner Userform hinzu, um die Daten anzuzeigen.

  3. Erstelle eine Tabelle auf dem Arbeitsblatt "Infoblatt". Benenne die Tabelle als "Infoblatt_Tabelle".

  4. Verwende den folgenden VBA-Code in der Userform, um die ComboBoxen mit den Daten zu befüllen:

    Private Sub TextBox28_AfterUpdate()
        Dim Range_Infoblatt As Range
        Set Range_Infoblatt = Worksheets("Infoblatt").ListObjects("Infoblatt_Tabelle").DataBodyRange
    
        If WorksheetFunction.CountIf(Range_Infoblatt, CVar(TextBox28)) > 0 Then
            Me.ComboBox4 = Application.WorksheetFunction.VLookup(CVar(TextBox28), Range_Infoblatt, 2, False)
        End If
    End Sub
  5. Überprüfe den 4. Parameter des VLookup, um sicherzustellen, dass er auf False gesetzt ist, wenn die Liste unsortiert ist.


Häufige Fehler und Lösungen

  • Anwendungs- oder objektdefinierter Fehler: Dieser Fehler kann auftreten, wenn die Range-Variable nicht korrekt definiert ist. Stelle sicher, dass die Tabelle "Infoblatt_Tabelle" korrekt benannt ist und der DataBodyRange nicht leer ist.

  • VLookup kann nicht zugeordnet werden: Dies kann passieren, wenn der gesuchte Wert nicht im ersten Parameter des VLookup vorhanden ist oder wenn der 4. Parameter auf True gesetzt ist und die Liste unsortiert ist. Überprüfe, ob der Suchwert in der Liste existiert und setze den Parameter gegebenenfalls auf False.


Alternative Methoden

Wenn Du den DataBodyRange nicht direkt verwenden möchtest, kannst Du die Range auch manuell definieren:

Dim myRange As Range
Set myRange = Worksheets("Infoblatt").Range("A2:C100") ' Beispiel für manuelle Range

Du kannst dann myRange anstelle von ListObjects("Infoblatt_Tabelle").DataBodyRange in Deinem VLookup verwenden.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie Du den DataBodyRange in einer ComboBox verwenden kannst:

Private Sub TextBox28_AfterUpdate()
    Dim wbMappe As Workbook
    Dim wsBlattZiel As Worksheet
    Dim Range_Infoblatt As Range

    Set wbMappe = Application.ActiveWorkbook
    Set wsBlattZiel = wbMappe.Worksheets("Infoblatt")
    Set Range_Infoblatt = wsBlattZiel.ListObjects("Infoblatt_Tabelle").DataBodyRange

    Me.ComboBox4 = Application.WorksheetFunction.VLookup(CVar(TextBox28), Range_Infoblatt, 2, False)
End Sub

Achte darauf, dass die Daten in der Tabelle entsprechend formatiert sind, um Fehler beim VLookup zu vermeiden.


Tipps für Profis

  • Nutze .DataBodyRange immer, wenn Du mit Tabellen in Excel arbeitest, um sicherzustellen, dass Du nur die relevanten Daten ansprichst.

  • Füge Fehlerbehandlungsroutinen hinzu, um unerwartete Fehler zu vermeiden, zum Beispiel:

    On Error Resume Next
    ' Dein Code hier
    If Err.Number <> 0 Then
        MsgBox "Ein Fehler ist aufgetreten: " & Err.Description
    End If
    On Error GoTo 0
  • Verwende CVar(), um sicherzustellen, dass der Typ der Eingabe in der TextBox korrekt ist, um Fehler beim VLookup zu vermeiden.


FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen .DataBodyRange und .Range? .DataBodyRange bezieht sich auf die Daten innerhalb einer Tabelle in Excel, während .Range auf einen bestimmten Zellbereich verweist.

2. Wie kann ich den Bereich einer Tabelle dynamisch anpassen? Du kannst die Tabelle mit der Methode Resize anpassen oder den DataBodyRange in einer Variablen speichern und die Größe entsprechend ändern.

3. Was mache ich, wenn mein VLookup keinen Wert zurückgibt? Überprüfe, ob der gesuchte Wert im Bereich vorhanden ist und ob die Liste sortiert ist, wenn der 4. Parameter auf True gesetzt ist. Andernfalls setze den 4. Parameter auf False.

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