Live-Forum - Die aktuellen Beiträge
Datum
Titel
18.04.2024 18:04:29
18.04.2024 16:33:24
Anzeige
Archiv - Navigation
1408to1412
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
Inhaltsverzeichnis

Suche in Tabellen-NamensBereich per Variable

Suche in Tabellen-NamensBereich per Variable
17.02.2015 15:42:17
Frank
Hallo liebe Forums-Mitglieder,
.
such seit vielen Stunden im INet rauf und runter und finde nicht die Lösung.
Ich habe in einer Tabelle 'Tabelle1' per 'Namens-Manager' mehreren Bereichen Namen zugeordnet, z. B.: 'Abteilung' =Tabelle1!$A$3:$A$199,
'PSPElement' =Tabelle1!$B$3:$B$199, 'Ressort' =Tabelle1!$M$3:$M$199, ...
.
Nun möchte ich aus einer UserForm Namens 'UfrmPlanDaten' mit vielen TextBoxen, denen ich selbstdefinierte, nicht fortlaufende Namen in
Anlehnung an den darin darzustellenden Inhalt zugewiesen habe, eine Suche in der zugrunde liegenden Tabelle anstoßen.
.
Z. B. soll der String 'NSO-NTT' der in die TextBox mit Name = 'Ressort' eingetragen wurde, in der Daten-Tabelle - deren Name ist in der
Variablen 'AusgangsTabelle' (defaultmäßig 'Tabelle1') abgelegt - in dem entsprechenden o. g. Tabellen-NamensBereich 'Ressort' gesucht werden.
Der Tabellen-NamensBereich wird in der Variablen 'SuchSpalte' zwischen gespeichert; in diesem Beisp. der Name 'Ressort'. Als Ergebnis hätte
ich gerne die Zeilen-Nummer des ersten Treffers. Suche von Oben nach unten. Mehrere Treffer-Möglichkeiten müssen (vorerst) nicht
berücksichtigt werden.
.
Mein entsprechender Code (-Ausschnitt):
AktuelleDatenZeile = Sheets(AusgangsTabelle).Names(SuchSpalte). _
Find(what:=SuchString, LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByRows).Row
. . . bringt folgende Fehlermeldung:
Laufzeitfehler '1004':
Anwendungs- oder objektdefinierter Fehler
.
Mein Problem ist, dass ich k. A. habe, wie die Variable 'SuchSpalte' richtig zu verwenden ist.
.
Meine herzlichen Dank vorab, für all die sachdienliche Hinweise.
.
Viele Grüße
Frank

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Suche in Tabellen-NamensBereich per Variable
17.02.2015 21:34:49
Jürgen
Hallo Frank,
um Deinen Code verstehen und Deine Frage beantworten zu können, ist wichtig zu wissen, wie die Variablen (z. B. "Ausgangstabelle", "Suchspalte" usw.) deklariert und gefüllt sind. Daher solltest Du den gesamten Code einstellen oder noch besser eine Beispieldatei.
Gruß, Jürgen

AW: Suche in Tabellen-NamensBereich per Variable
18.02.2015 11:52:58
Frank
Hallo Jürgen,
Danke für Deine Unterstützung.
Mein grundsätzliches Problem ist (leider noch), dass ich die VBA-Grundlagen zu Range-Objekten noch nicht wirklich kenne! Ich arbeite dran. Evtl. hast Du einen Literatur-Tip für mich. Habe vor Jahren 2 dicke Bücher für teuer Euro gekauft, die leider mit viel Prosa umschreiben und dabei doch viele Fragen offen lassen!
Im Standard-Modul 'Modul1' habe ich folgende Deklarationen:
Option Explicit
Public AktuelleDatenZeile As Integer ' vorher: Long ! aber Integer ist völlig ausreichend!
Public LetzteDatenZeile As Integer
Public LetzteTabellenZeile As Integer
Public AusgangsTabelle As String  '    vorher: Worksheet ! funzt aber auch mit 'String'

Habe meine Datei zu einem Beispiel reduziert und hier hoch geladen. https://www.herber.de/bbs/user/95840.xlsm
Darin sind zwei UserForms 'UfrmMenue' und 'UfrmPlanDaten'.
Mein Problem steckt im 'Private Sub cmdSucheStarten_Click()' das unter 'UfrmPlanDaten' steht.
Gruß und Dank
Frank

Anzeige
AW: Suche in Tabellen-NamensBereich per Variable
18.02.2015 17:08:02
Jürgen
Hallo Frank,
der Code in Deinem Eröffnungsbeitrag war der Lösung näher als derjenige in der Beispieldatei, es müssten jedoch zwei Dinge angepasst werden. Das erste: Du versuchst über das Arbeitsblatt auf einen definierten Bereichsnamen zuzugreifen, der aber arbeitsmappenbezogen angelegt wurde. Deswegen erreichst Du ihn auch nur über das entsprechende Workbook-Objekt. Das zweite: den zugehörigen Zellbereich eines Bereichsnamens erhältst Du über die Eigenschaft "RefersToRange", ein .Names("Bereichsname") reicht nicht. Es könnte also lauten:
AktuelleDatenZeile = Sheets(AusgangsTabelle).Names(SuchSpalte).RefersToRange.Find(what:=SuchString, LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByRows).Row
Nach Durchsicht der Datei hätte ich noch folgende Anregungen für Dich:
  • Vermeide globale Variablen

  • Wenn es ohne nicht geht: Deine globalen Variablen werden zum falschen Zeitpunkt gefüllt, nämlich beim Öffnen der Datei. Einmal den Dialog schließen genügt, um sie zu leeren, d. h. beim nächsten Aufruf des Dialogs kommt es zu einem Fehler. Fülle sie lieber im Initialize-Event des Dialogs.

  • Zeilenzähler als Integer zu definieren kann zwar gut gehen, aber Du hättest es sicherheitshalber bei der ursprünglichen Deklaration als Long belassen sollen - das tut nicht weh, und das Makro läuft auch noch, wenn es mal mehr als ca. 32.000 Zeilen werden.

  • Nutze sprechende ("rng" und "cnt" sind grenzwertig) und zutreffende Variablen ("AktuelleDatenZeile" beschreibt besser den Inhalt als "SuchRange").

  • Wenn in der obigen Zeile nach einem Begriff gesucht wir, der nicht vorhanden ist, erzeugt die Suche eine Fehler, den Du noch abfangen musst.

  • Die Suche würde ich in einen separaten Suchdialog auslagern, in dem man zuerst über eine Dropdownliste den Spaltenamen wählt, und anschließend über eine weitere (dann passend gefüllte) Dropdownliste einen vorhandenen Wert.

  • Für Deinem Zweck könnte es hilfreich sein, die Tabelle in eine Liste umzuwandeln, was Dir den Zugriff auf Dateninhalte oder auch die Spaltenköpfe erleichtert.


  • Ich hoffe, das hilft Dir weiter.
    Gruß, Jürgen

    Anzeige
    Korrektur
    18.02.2015 17:43:57
    Jürgen
    Hallo Frank,
    die Codezeile müsste natürlich so lauten:
    AktuelleDatenZeile = Activeworkbook.Names(SuchSpalte).RefersToRange.Find(what:=SuchString, LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByRows).Row
    
    Gruß, Jürgen

    AW: Korrektur
    18.02.2015 18:01:21
    Frank
    Hallo Jürgen,
    vielen herzlichen Dank für Deine Unterstützung.
    Das hat mir sehr geholfen. Alle bisher durchsuchten Beiträge in den diversen Foren haben nie genau mein Problem getroffen. Logisch, jeder formuliert ja nur sein individuelles Problem. Eine schlichte Datenbank der VBA-Möglichkeiten, aber mit exakten Formulierungen desssen, was die Code-Schnipsel anstellen. Da hapert es bei vielen sehr.
    Die, wie Du schreibst grenzwertigen Variablen-Bezeichnungen "rng" und "cnt" stammen aus Code-Schnipseln aus eben den diversen Forenbeiträgen, die ich schlicht rüber kopiert habe. Die machten mich nie glücklich, da ich sie nicht wirklich verstanden habe! Alle sprechenden Variablen-Bezeichnungen stammen von mir, da ich ja auch später meinen eigenen Sch... noch mal wieder verstehen möchte. Programmiere eben nicht so oft mit VBA.
    "Tabelle in eine Liste umzuwandeln" sagt mir leider nichts; habe es noch nie genutzt.
    VG
    Frank

    Anzeige
    AW: Korrektur
    18.02.2015 22:18:03
    Jürgen
    Hallo Frank,
    danke für die Rückmeldung. Das Thema "Liste" (seit neuerem "Tabelle" im Microsoft-Sprech) ist sicher etwas für eine stille Stunde, in der man mal etwas ausprobieren und die Hilfe studieren kann. Die investierte Zeit zahlt sich sicher aus, sowohl bei der Gestaltung von Lösungen über die Excel-Oberflache als auch bei der Erstellung von VBA-Makros (dort ist eine Liste als ListObject ansprechbar).
    Gruß, Jürgen

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige