PDA

Vollständige Version anzeigen : Eine definierte, dynamische Tabelle durchsuchen


GerdGrote
02.09.2017, 20:30
Hallo,

Ich benutze Excel 2013, Win 8 bzw. Win 10...

Mein Ziel ist es eine Tabelle (KEIN Tabellenblatt !!!) die fast täglich erweitert/verringert wird (nur in der Anzahl der Zeilen) auf Knopfdruck, nach einem bestimmten Wert in einer Spalte dieser Tabelle zu durchsuchen. Wenn ich diesen Wert gefunden habe, dann soll die ganze Zeile in ein anderes Tabellenblatt kopiert werden.

Zuerst will ich die Anzahl der Zeilen und Spalten bestimmen.

Die Tabelle (sie hat den Namen Lodi) ist auf dem ersten Tabellenblatt darunter ist eine 2. Tabelle (diese hat einen anderen Namen).

Die folgenden Codezeilen funktionieren also nicht ...
ZeilenEnde = Worksheets(1).UsedRange.Rows.Count
SpaltenEnde = Worksheets(1).UsedRange.Columns.Count

Denn sie geben als Ergebnis 20 zeilen bzw. 5 Spalten aus.
Das ist aber nicht richtig, denn die Tabelle hat ja nur 12 Zeilen und 4 Spalten.

Ich suche nach einer Möglichkeit den Teil Worksheet(1) durch meinen Tabellennamen (Lodi) zu ersetzen.

Kann mir jemand sagen wie ich das machen kann?

Gruß

Gerd

R J
02.09.2017, 22:25
Hi Gerd,

Deine Lodi - Tabelle ist ein Listobject innerhalb eines Worksheets. Und genauso musst Du sie auch ansprechen.

Bsp.:

Dim tabZeilen&, zeilen&, spalten%
With ThisWorkbook.Worksheets("Tabelle1").ListObjects("Lodi")

tabZeilen = .Range.Rows.Count 'inklusive Kopfzeile
zeilen = .DataBodyRange.Rows.Count 'nur die Datenbereichszeilen
spalten = .DataBodyRange.Columns.Count
Debug.Print tabZeilen, zeilen, spalten

End With

GerdGrote
03.09.2017, 07:37
Hallo,

Vielen Dank klappt super.
Schade, daß eine Tabelle kein TableObject ist, dann hätte ich es fast alleine rausbekommen :)

Ein Frage habe ich noch:

Da ich noch recht neu bei VBA bin würde ich gerne IntelliSense (ich glaube so heißt das) benutzen, da ich die ganzen Befehle wie DataBodyRange usw. nicht kenne. Meine Versuche mit
' Dim Tabelle As Worksheet
Dim Tabelle As ListObjects
Dim Lodi As Range
Dim AlleZeilen As Long
Dim Zeile As Long
Dim ZeilenEnde As Long
Dim Spalte As Long
Dim SpaltenEnde As Long
Dim i As Integer
Dim k As Integer

Set Tabelle = Worksheets(1).ListObjects("Lodi")

With Tabelle 'Worksheets(1).ListObjects("Lodi")

AlleZeilen = Tabelle.Range.Rows.Count 'alle Zeilen inklusive Kopfzeilen
Zeile = Tabelle.DataBodyRange.Rows.Count ' nur Datenbereichszeilen
Spalte = Tabelle.DataBodyRange.Columns.Count

Debug.Print AlleZeilen, Zeile, Spalte

End With

sind leider gescheitert.
Es kommen Fehlermeldungen wie z.B. Typenunverträglichkeit bzw. Objektvariable oder With-Blockvariable nicht festgelegt
Kannst Du mir eventuell noch sagen wie ich das richtig definieren muß.

Gruß

Gerd

GerdGrote
03.09.2017, 07:41
Hallo,
Habe es selbst gefunden ...

Manchmal ist die Sch.. ja gar nicht kaputt, sondern man ist einfach nur zu doof...:)

Es muß heißen:

Dim Tabelle As ListObject

und nicht

Dim Tabelle As ListObjects

Ein s zu viel ...

Gruß

Gerd

Hajo_Zi
03.09.2017, 07:54
benutze STRG + Leerstelle, dann wir es vorgeschlagen.

<img src="http://Hajo-Excel.de/images/grusz1.gif" align="middle" height="40" alt="Grußformel"><a href="http://Hajo-Excel.de/index.htm"><img border="0" src="http://Hajo-Excel.de/images/logo_hajo3.gif" align="middle" height="40" alt="Homepage"></a>

GerdGrote
03.09.2017, 08:10
Danke

Guter Tipp

R J
03.09.2017, 08:49
Warum mal mit und mal ohne s?

Das ist relativ einfach. Das s kennzeichnet den Plural. Mit s kannst Du also aus einer Sammlung gleichartiger Objekte gezielt auf bestimmte Objekte zugreifen.

Wenn Du mehrere Objekte gleichen Typs hast und brauchst ein bestimmtes, dann benutzt Du
Worksheets(1).Listobjects(1)

Willst Du, wie in Deinem Fall, ein Objekt erstellen um an dessen Eigenschaften und Methodenzu gelangen, dann muss logischerweise der Singular (EIn Objekt), ohne s verwendet werden.