2016-12-20 6 views
1

ich gedimmt die Variable:Wie erhalte ich den Namen einer Tabelle aus einer Bereichsvariablen?

Dim mainTableRange As Range 

gab es dann einen Wert:

Set mainTableRange = Range("tLedgerData") ' tLedgerData is an Excel table. 

Jetzt versuche ich den Namen der Tabelle zu erhalten von der Variablen (die „tLedgerData“ ist) zu Referenzspalten in dieser Tabelle, auch wenn sich der Tabellenname ändert.

Ich versuchte

mainTableRange.Name 

und

mainTableRange.Name.Name 

(Siehe how do you get a range to return its name.) Beide warfen Laufzeitfehler '1004': Anwendung definiert oder Objekt definierte Fehler.

mainTableRange.Select ausgewählt alle Tabellendaten mit Ausnahme der Kopfzeile und Gesamtzeilen.

+1

* [...] Spalten in der Tabelle zu verweisen, auch wenn der Tabellenname ändert * - Wartezeit, wenn der Tabellenname ändert, wird nicht 'Range („tLedgerData“)' auf nichts verweisen? –

+0

Können Sie ein Beispiel für genau das hinzufügen, was Sie * eigentlich * erreichen wollen, d. H. Genau, was meinen Sie mit "Referenzspalten in dieser Tabelle"? –

+1

Laufzeitfehler '1004', vielleicht haben Sie den Bereichsnamen falsch geschrieben, oder das ActiveSheet enthält den benannten Bereich nicht. versuchen Sie, den Namen des Bereichs zu korrigieren, oder versuchen Sie, den Blattnamen vor Range ("tLedgerData") hinzuzufügen, oder stellen Sie sicher, dass der Blattwunsch den benannten Bereich enthält. –

Antwort

4

Ich glaube, Sie ein XY-Problem hier sind mit: Problem X lösen, wenn die Lösung für Problem Y. ist

[...] Spalten in dieser Tabelle auch wenn die Tabellennamensänderungen zu referenzieren

Haben die Tabelle/ListObject allein auf einer eigenen dedizierten Arbeitsblatt, und gibt das Blatt ein CodeName. Auf diese Weise können Sie dies tun:

Dim tbl As ListObject 
Set tbl = LedgerDataSheet.ListObjects(1) 

Und jetzt haben Sie die Allmacht der ListObject API zu tun, was es ist, dass Sie tun möchten. Zum Beispiel, rufen Sie die Spaltennamen:

Dim i As Long 
For i = 1 To tbl.ListColumns.Count 
    Debug.Print tbl.ListColumns(i).Name 
Next 

Mit anderen Worten, Sie nicht brauchen für den Namen der Tabelle zu kümmern. Was Sie wollen, ist mit seiner ListObject arbeiten. Und da Sie nie auf den Namen verweisen müssen, ist der Name der Tabelle völlig irrelevant und der Benutzer kann sie nach Belieben ändern, was Ihr Code nicht bemerkt.

+0

Ich stimme zu. Wenn Sie jedoch fortfahren möchten, indem Sie den Tabellennamen aufrufen, machen Sie folgendes: 'Dim mainTableRange As ListObject' und dann' Set mainTableRange = Arbeitsblätter ("Sheet1"). ListObjects ("tLedgerData") ' –

+0

Das' listobject' war das Weg zu gehen! Danke Mat! – ChrisB

0

Ich glaube, eine Excel-Tabelle und named-Bereich sind zwei verschiedene Dinge, weshalb der .name.name nicht funktioniert. Eine Tabelle ist ein ListObject, und sobald Sie einen Bereich festgelegt haben, der einer Tabelle entspricht, sollten Sie in der Lage sein, diesen Bereich weiterhin ohne Fehler aufzurufen.

Neugierig, was ist der Grund, warum Ihre Tabelle unerwartet geändert werden kann?

Ich schrieb einige Zeilen Code, um ein paar Dinge zu zeigen. Sie können Tabellen erstellen und die Bereichsvariablen wiederverwenden, nachdem sich der Tabellenname geändert hat. Sie können auch AlternativeText für die Tabelle mit einer identifizierenden Zeichenfolge festlegen und diese verwenden, um nach einer bestimmten Tabelle zu suchen, wenn Sie vermuten, dass sich der Tabellenname ändert.

Option Explicit 
Public TestTable As Range 
Sub CreateTable() 
    ActiveSheet.ListObjects.Add(xlSrcRange, [$A$1:$C$4], , xlYes).name = "Table1" 
    ActiveSheet.ListObjects("Table1").AlternativeText = "Table1" 
End Sub 
Sub SetTableRange() 
    Set TestTable = Range("Table1") 
End Sub 
Sub SelectTable() 
    TestTable.Select 
End Sub 
Sub RenameTable() 
    ActiveSheet.ListObjects("Table1").name = "Table2" 
    [A1].Select 
End Sub 
Sub SelectRenamedTable() 
    TestTable.Select 
End Sub 
Sub ClearSelection() 
    [A1].Select 
End Sub 
Sub FindTable1() 
    Dim obje As ListObject 
    For Each obje In ActiveSheet.ListObjects 
     If obje.AlternativeText = "Table1" Then 
     MsgBox "Found " & obje.AlternativeText & ". Its current name is: " & obje.name 
     End If 
    Next obje 
End Sub 
Sub ConvertTablesToRanges() 
    ' I found this snippet in a forum post on mrexcel.com by pgc01 and modified 
    Dim rList As Range 
    On Error Resume Next 
    With ActiveSheet.ListObjects("Table1") 
     Set rList = .Range 
     .Unlist       ' convert the table back to a range 
    End With 
    With ActiveSheet.ListObjects("Table2") 
     Set rList = .Range 
     .Unlist       ' convert the table back to a range 
    End With 
    On Error GoTo 0 
    With rList 
     .Interior.ColorIndex = xlColorIndexNone 
     .Font.ColorIndex = xlColorIndexAutomatic 
     .Borders.LineStyle = xlLineStyleNone 
    End With 
End Sub 
Verwandte Themen