2010-04-16 71 views
12

似乎Visual Basic無法根據用戶修改的表名引用工作表。工作表選項卡可以更改其名稱,但似乎Visual Basic仍將工作表名稱視爲Sheet1等,儘管工作簿選項卡已更改爲有用的東西。Excel選項卡表名稱與Visual Basic表名稱

我有這樣的:

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

,但我想用在Visual Basic程序表名稱。到目前爲止我所能得到的最好的結果是選擇工作表選項卡與Visual Basic名稱,這並沒有使我的一天。 Visual Basic必須知道Sheet1,Sheet2等名稱。如何將這些與Excel選項卡名稱關聯起來,以便我不必維護一個隨每個新工作表或工作表選項卡重新命名而變化的查找表? 在此先感謝您的答覆。

+1

我從來沒有遇到過表單名稱改變但VB無法看到改變的情況。你能顯示你的關聯代碼嗎? – 2010-04-16 00:27:32

回答

16

在Excel對象模型中的工作表中有2點不同名稱的屬性:

Worksheet.Name
Worksheet.CodeName

Name屬性爲讀/寫,幷包含出現在名稱工作表選項卡。它是用戶和VBA多變

代號屬性是隻讀

您可以參考一個特定的片作爲 工作表(「佛瑞德」)。範圍(「A1」)其中佛瑞德是請將.Name屬性 或 Sheet1.Range(「A1」)其中Sheet1是工作表的代號。

+0

是的,那正是我在尋找的,謝謝! – SteveNeedsSheetNames 2010-04-16 16:29:41

+0

現在我想要一個具有ParamArray輸出的可視化基本函數,並且我希望該輸出可用於其他函數,而不必將其放在工作表上,只是將其輸入到第二個函數中。有沒有辦法在Visual Basic中的函數之間傳遞數組?預先感謝您的回覆。 – SteveNeedsSheetNames 2010-04-28 21:57:45

3

您應該能夠通過用戶提供的名稱參考工作表。你確定你正在引用正確的工作簿嗎?如果您在參考工作表時打開了多個工作簿,那肯定會導致問題。

如果這是問題,則使用ActiveWorkbook(當前活動的工作簿)或ThisWorkbook(包含宏的工作簿)應解決此問題。

例如,

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

有(至少)兩種不同的方式來獲得的Worksheet對象

    經由 SheetsWorksheets集合
  • 通過DanM
  • 引用由不合格對象名稱

當創建包含三個工作表的新工作簿時,將存在四個對象,您可以通過非限定名稱訪問這四個對象:ThisWorkbook; Sheet1; Sheet2; Sheet3。這使您可以這樣寫:

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

雖然這可能看起來是一個有用的快捷方式,當工作表被重命名問題就來了。即使工作表被重命名爲完全不同的東西,非限定對象名仍保留爲Sheet1

有一些邏輯,這是因爲:

  • 工作表的名稱不符合相同的規則變量名
  • 你可能會不小心掩蓋現有變量

例如(在Excel 2003中進行測試),用三張工作表創建一個新的Workbook。創建兩個模塊。在一個模塊聲明如下:

Public Sheet4 As Integer 

在其他模塊的說:

Sub main() 

Sheet4 = 4 

MsgBox Sheet4 

End Sub 

運行這和消息框應正確顯示。

現在將第四張工作表添加到工作簿,該工作簿將創建一個Sheet4對象。嘗試再次運行main,這次你會得到一個「對象不支持這個屬性或方法」的錯誤

0

我不得不訴諸於此,但這與維護有關。

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

其實「Sheet1」對象/代碼名稱可以更改。在VBA中,單擊Excel Objects對象列表中的Sheet1。在屬性窗口中,可以將Sheet1更改爲rng。

然後,您可以引用rng作爲全局對象,而無需先創建變量。所以debug.print rng.name工作得很好。沒有更多的工作表(「rng」)。

與標籤不同,對象名稱與其他變量(即無空格)具有相同的限制。

0

使用片代號是我需要太多的答案,停止一系列的宏倒下 - ccampj的回答上面的鏡子this solution(屏幕圖片)

1

這是一個非常基本的解決方案(也許我錯過了全問題的一點)。 ActiveSheet.Name將返回當前選項卡名稱的字符串(並將反映用戶將來的任何更改)。我只是調用活動工作表,設置變量,然後將其用作工作表的對象。在這裏,我正在從表格中檢索數據來爲分部設置報告。該宏可以在我的工作簿中的任何工作表中工作,該工作簿的格式爲相同的過濾器(標準和複製範圍) - 每個部門都有自己的工作表,並可以使用此單個宏更改條件並進行更新。

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

列出Proc的問題讓我們設置Get Subs Func已經和我在一起了幾年,其中模塊名稱表名代碼名稱是一團糟......這解決了這個問題。非常感謝您的代碼Harry S – 2016-12-21 09:25:50

3

這將所有工作表對象的名稱改變(從VBA編輯的角度看),以匹配其表的名稱(從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 

這是很重要請注意,對象名稱(代號)「(Name)」正被屬性名稱「Name」覆蓋,因此它必須作爲子屬性引用。

+0

「對Visual Basic項目的編程訪問不受信任」 - 啓用宏設置http://stackoverflow.com/a/25638419/ – user423430 2016-04-08 19:54:08

+0

.Properties(「Name」)。Value was Exactly what I was was尋找,謝謝! – baldmosher 2016-08-30 12:27:13

+0

列出Proc的問題讓我們設置Get Subs Func已經有幾年了,其中模塊名稱表名代碼名稱是一團糟......這解決了這個問題。非常感謝你的代碼Harry S – 2016-12-21 09:28:16