2010-04-16 10 views
12

Es scheint, dass Visual Basic Blätter nicht anhand benutzerdefinierter Blattnamen referenzieren kann. Auf den Registerkarten für Arbeitsblätter können die Namen geändert werden, es scheint jedoch, dass Visual Basic die Arbeitsblattnamen immer noch als Arbeitsblatt1 usw. ansieht, obwohl die Arbeitsmappenregisterkarte in etwas Nützliches geändert wurde.Registerkartennamen im Vergleich zu Visual Basic-Blattnamen

Ich habe dies:

TABname = rng.Worksheet.Name ' Excel sheet TAB name, not VSB Sheetx name. 

aber ich möchte Blattnamen in Visual Basic-Routinen verwenden. Das Beste, was ich bisher erreichen konnte, ist das Auswählen des Arbeitsblatt-Tabs im Vergleich zu Visual Basic-Namen, was meinen Tag nicht ausmacht. Visual Basic muss die Namen Sheet1, Sheet2 usw. kennen. Wie kann ich diese mit den Namen der Excel-Registerkarten verknüpfen, so dass ich keine Nachschlagetabelle verwalten muss, die sich mit jedem neuen Blatt- oder Tabellenregister ändert? Vielen Dank im Voraus für Ihre Antworten.

+1

Ich habe noch nie eine Situation gefunden, wo ein Blattname geändert wird, aber VB die Änderung nicht sehen kann. Können Sie Ihren relevanten Code anzeigen? –

Antwort

16

Im Objektmodell Excel ein Arbeitsblatt verfügt über 2 verschiedene Namen Eigenschaften:

Worksheet.Name
Worksheet.CodeName

die Name-Eigenschaft Lese-/Schreibzugriff und enthält den Namen, der auf erscheint das Blatt Registerkarte. Es ist benutzer und VBA änderbar

der Codename-Eigenschaft ist schreibgeschützt

Sie können ein bestimmtes Blatt als Worksheets („Fred“) verweisen. Range („A1“), wo Fred ist die .Name Eigenschaft oder als Sheet1.Range ("A1") wobei Sheet1 der Codename des Arbeitsblatts ist.

+0

Ja, das habe ich gesucht, danke! – SteveNeedsSheetNames

+0

Jetzt möchte ich eine visuelle Basisfunktion mit einer ParamArray-Ausgabe haben, und ich möchte, dass diese Ausgabe für eine andere Funktion verfügbar ist, ohne sie auf ein Arbeitsblatt zu legen, nur um sie in diese zweite Funktion aufzunehmen. Gibt es eine Möglichkeit, Arrays zwischen Funktionen in Visual Basic zu übertragen? Vielen Dank im Voraus für Ihre Antwort. – SteveNeedsSheetNames

3

Sie sollten Blätter anhand des vom Benutzer angegebenen Namens referenzieren können. Sind Sie sicher, dass Sie auf das richtige Arbeitsbuch verweisen? Wenn zu dem Zeitpunkt, zu dem Sie auf ein Blatt verweisen, mehr als eine Arbeitsmappe geöffnet ist, kann dies das Problem verursachen.

Wenn dies das Problem ist, sollte ActiveWorkbook (die derzeit aktive Arbeitsmappe) oder ThisWorkbook (die Arbeitsmappe, die das Makro enthält) lösen.

Zum Beispiel

Set someSheet = ActiveWorkbook.Sheets("Custom Sheet") 
0

Es gibt (mindestens) zwei verschiedene Möglichkeiten, das Worksheet Objekt

  • über die Sheets oder Worksheets Sammlungen zu erhalten, wie durch DanM verwiesen durch unqualifizierte
  • Objektnamen

Wenn eine neue Arbeitsmappe mit drei Arbeitsblättern erstellt wird, gibt es vier Objekte, auf die Sie über unqualifizierte Namen zugreifen können: ThisWorkbook; Sheet1; Sheet2; Sheet3. Auf diese Weise können Sie Dinge wie diese schreiben:

Sheet1.Range("A1").Value = "foo" 

Obwohl dies wie eine nützliche Abkürzung zu sein scheint, das Problem kommt, wenn die Arbeitsblätter umbenannt werden. Der Name des nicht qualifizierten Objekts bleibt Sheet1, auch wenn das Arbeitsblatt in etwas völlig anderes umbenannt wird.

Es gibt einige Logik ist dies, weil:

  • Arbeitsblatt Namen zum Beispiel nicht die gleichen Regeln wie für Variablennamen entsprechen
  • Sie versehentlich eine vorhandene Variable

maskieren könnten (getestet in Excel 2003), erstellen Sie einen neuen Workbook mit drei Arbeitsblättern. Erstelle zwei Module.In einem Modul deklarieren dies:

Public Sheet4 As Integer 

Im anderen Modul gesteckt:

Sub main() 

Sheet4 = 4 

MsgBox Sheet4 

End Sub 

Führen Sie dieses und das Meldungsfeld korrekt angezeigt werden soll.

Fügen Sie der Arbeitsmappe jetzt ein viertes Arbeitsblatt hinzu, das ein Objekt Sheet4 erstellt. Versuchen Sie es erneut mit main und dieses Mal erhalten Sie ein "Objekt unterstützt diese Eigenschaft oder Methode nicht" Fehler

0

Ich musste darauf zurückgreifen, aber das hat Probleme mit der Instandhaltung.

Function sheet_match(rng As Range) As String ' Converts Excel TAB names to the required VSB Sheetx names. 
    TABname = rng.Worksheet.Name    ' Excel sheet TAB name, not VSB Sheetx name. Thanks, Bill Gates. 
' Next, match this Excel sheet TAB name to the VSB Sheetx name: 
    Select Case TABname 'sheet_match 
     Case Is = "Sheet1": sheet_match = "Sheet1" ' You supply these relationships 
     Case Is = "Sheet2": sheet_match = "Sheet2" 
     Case Is = "TABnamed": sheet_match = "Sheet3" 'Re-named TAB 
     Case Is = "Sheet4": sheet_match = "Sheet4" 
     Case Is = "Sheet5": sheet_match = "Sheet5" 
     Case Is = "Sheet6": sheet_match = "Sheet6" 
     Case Is = "Sheet7": sheet_match = "Sheet7" 
     Case Is = "Sheet8": sheet_match = "Sheet8" 
    End Select 
End Function 
1

Eigentlich kann "Sheet1" Objekt/Codename geändert werden. Klicken Sie in VBA in der Liste Excel-Objekte auf Tabelle1. Im Eigenschaftsfenster können Sie Sheet1 in "rng" ändern.

Dann können Sie RNG als globales Objekt referenzieren, ohne zuerst eine Variable erstellen zu müssen. Also debug.print rng.name funktioniert gut. Keine Arbeitsblätter mehr ("rng"). Name.

Im Gegensatz zur Registerkarte hat der Objektname dieselben Einschränkungen wie andere Variablen (d. H. Keine Leerzeichen).

0

das Blatt Codenamen verwenden war die Antwort, die ich auch erforderlich, um eine Reihe von Makros zu stoppen Umfallen - Antwort ccampj die über Spiegel this solution (mit Bildschirm Fotos)

1

Dies ist eine sehr einfache Lösung (vielleicht fehlt ich die volle Punkt der Frage). ActiveSheet.Name gibt die Zeichenfolge des aktuellen Tab-Namens zurück (und spiegelt zukünftige Änderungen durch den Benutzer wider). Ich rufe einfach das aktive Blatt auf, setze die Variable und verwende sie dann als Arbeitsblattobjekt. Hier erhalte ich Daten aus einer Tabelle, um einen Bericht für eine Abteilung zu erstellen. Dieser Makro funktioniert auf jedem Blatt in meiner Arbeitsmappe, das für denselben Filter formatiert ist (Kriterien und Kopierbereich) - jede Abteilung erhält ihr eigenes Blatt und kann die Kriterien ändern und mit diesem einzelnen Makro aktualisieren.

Dim currRPT As String 
ActiveSheet.Select 
currRPT = (ActiveSheet.Name) 
Range("A6").Select 
Selection.RemoveSubtotal 
Selection.AutoFilter 
Range("PipeData").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _ 
    ("C1:D2"), CopyToRange:=Range("A6:L9"), Unique:=True 
Worksheets(currRPT).AutoFilter.Sort.SortFields.Clear 
Worksheets(currRPT).AutoFilter.Sort.SortFields.Add Key:= _ 
    Range("C7"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
    xlSortNormal 
+0

Das Problem der Auflistung Proc Lets gesetzt Get Subs Func war mit mir für ein paar Jahre, wo der Modulname Blattname Codename war ein Chaos. Das behebt das. Sehr geschätzt wurde Ihr Code Harry S –

3

Dadurch werden alle Arbeitsblatt Objekte Namen ändern (aus der Perspektive des VBA-Editor) die ihrer Blattnamen übereinstimmen (aus Sicht von Excel):

Sub ZZ_Reset_Sheet_CodeNames() 
'Changes the internal object name (codename) of each sheet to it's conventional name (based on it's sheet name) 

    Dim varItem As Variant 

    For Each varItem In ThisWorkbook.VBProject.VBComponents 
     'Type 100 is a worksheet 
     If varItem.Type = 100 And varItem.Name <> "ThisWorkbook" Then 
      varItem.Name = varItem.Properties("Name").Value 
     End If 
    Next 
End Sub 

Es ist wichtig, Beachten Sie, dass der Objektname (Codename) "(Name)" durch den Eigenschaftsnamen "Name" überschrieben wird und daher als Untereigenschaft referenziert werden muss.

+0

"Programmatic Zugriff auf Visual Basic-Projekt ist nicht vertrauenswürdig" - Makro-Einstellung aktivieren http://StackOverflow.com/a/25638419/ – user423430

+0

.Eigenschaften ("Name"). Wert war genau was ich war Auf der Suche nach, danke! – baldmosher

+0

Das Problem der Auflistung Proc Lets gesetzt Get Subs Func war mit mir für ein paar Jahre, wo der Modulname Blattname Codename war ein Chaos. Das behebt das. Sehr geschätzt war dein Code Harry S. –

Verwandte Themen