2017-04-11 54 views
2

我可能是盲目的,但我一直在用VBA現在工作了幾年,但還是寫出來workbook()的簡寫。worksheets()?

Workbook("Book1").Sheets("Sheet1").Range("A1").Value 

或(調光第一冊的工作簿和工作表Sheet1作爲一個字符串

Book1.Sheets(Sheet1).Range("A1").Value 

有沒有一種方法,你可以速記「workbook.sheets」部分(不包括做一個「with」語句)

+1

來引用,你應該避免使用Worksheet(「Sheet1」),因爲它返回一個Object,意味着您後續的所有來電都將延遲。 – ThunderFrame

回答

4

當然。只要做到這一點的正確方法:

Dim wb As Workbook 
Set wb = Workbooks("Book1") 
Dim ws As Worksheet 
Set ws = wb.Worksheets("Sheet1") 
Dim x As Variant 
x = ws.Range("A1").Value 

(對不起墊的杯 - 我不得不有點冷嘲熱諷與第一行:d)

+2

哈哈哈金...所以,*使用簡短的免疫識別名稱*哈? ;-) –

+0

你擊敗了我約30秒:) –

+0

@ Mat'sMug - 短,但不在乎他們是否dismvoweled - 我懶惰,恨我打字比我需要更多的字符。 – YowE3K

7

當然只是做了錯誤的方式:?

Sheet1.Activate 
Range("A1").Value = 42 

不合格,Range_Global的成員,該工具通過返回指定範圍(無論哪個工作表碰巧處於活動狀態)來實現其Range屬性。

如果你要含蓄地工作過ActiveSheet,你也可以推遲類型解析到一個不太高性能後期綁定調用運行時間,使主機應用程序(這裏的Excel)評估一個括號內的表達甚至更​​快的打字:

[A1].Value = 42 

哎呀,該Range類型都有一個指向其Value一個默認成員,所以你甚至可以這樣做:

[A1] = 42 

正如你所看到的,代碼並不總是更好代碼。認證您的Worksheet成員電話,並有意識和謹慎地使用默認成員。

每次有人對_Global進行暗示調用時,獨角獸會死亡,並且兩個新的堆棧溢出問題會從黑暗中傳出,這些問題涉及由不合格的工作表調用導致的錯誤。

+4

+1表明答案是諷刺性地發佈的,並解釋爲什麼缺乏適當的資格會導致如此多的問題。 – YowE3K

2

喜歡這個

Sub temp() 
    Dim WB As Workbook, WS As Worksheet 
    Set WB = ActiveWorkbook 
    Set WS = WB.Sheets(2) 
    MsgBox WS.Range("A2").Text 
End Sub 
0

你可以設置工作表變量與其父工作簿一起

Dim wb1s1 As Worksheet 
Set wb1s1 = Workbook("Book1").Sheets("Sheet1") 

然後寫

wb1s1.Range("A1").Value 
3

OK,我要採取「第一冊」名字的字面,並假設你正在編寫代碼來處理一個工作簿 - 可能喜歡的東西:

Dim myWorkbook As Workbook 
Workbooks.Add 
Set myWorkbook = Workbooks("Book1") 

這已經是一個糟糕的開始,因爲:

  1. 用戶的語言將決定名稱的「Book」部分。
  2. 的數字後綴將與每增加新的工作簿

遞增所以,許多沒有經驗的編碼器試試這個:

Dim myWorkbook As Workbook 
Workbooks.Add 
Set myWorkbook = ActiveWorkbook 

但是,這是開放的錯誤了。如果有事件處理程序希望更改活動工作簿呢?用戶在通過代碼時如何更改活動工作簿?

分配您的myWorkbook變量的最佳方式是這樣的:

Dim myWorkbook As Workbook 
Set myWorkbook = Workbooks.Add 

並增加了新的工作簿時,只是想,你應該打開現有的工作簿時遵循相同的方法

Dim myWorkbook As Workbook 
Set myWorkbook = Workbooks.Open("C:\Foo.xlsx") 

在這兩種情況下,你知道你有正確的工作簿的引用,你不在乎它叫什麼是否有效。您剛剛使代碼更加健壯效率更高。

或者,如果您的VBA正在使用它所在的工作簿,您可以使用ThisWorkbook或工作表的代號。

Debug.Print ThisWorkbook.Name 

'By default, a sheet named "Sheet" has a codename of 'Sheet1' 
Debug.Assert Sheet1.Name = ThisWorkbook("Sheet1").Name 

'But give meaningful names to your sheet name and 
'sheet codename, and your code becomes clearer: 
Debug.Assert AppSettings.Name = ThisWorkbook("Settings").Name 

你可能會發現,大多數的與您的代碼創建你的代碼中打開其所在的工作簿或現有工作簿,或新的工作簿代碼交易。所有這些情況都在上面處理。在極少數情況下在你的代碼必須與已經打開,或者通過一些其他進程正在打開的工作簿進行交互,就需要通過名字來引用到工作簿或枚舉Workbooks集合:

Dim myWorkbook As Workbook 
Set myWorkbook = Workbooks("DailyChecklist.xlsx") 

For Each myWorkbook In Workbooks 
    Debug.Print myWorkbook.Name 
Next myWorkbook 

一個例外是加載項,不能使用Workbooks集合來枚舉,但可以用Workbooks("MyAddin.xlam")

+0

「'默認情況下,名爲」Sheet「的工作表的代碼名爲'Sheet1'」 - 事實並非如此 - VBE第一次打開時Worksheets(1)如果創建工作簿,則在「Sheet1」上插入新工作表(如果每個新工作簿中都創建了三個工作表,則默認情況下新工作表將命名爲「Sheet4」),然後打開VBE,你會發現「Sheet4」的代碼名稱爲「Sheet1」,「Sheet1」的代號爲「Sheet2」,「Sheet2」的代號爲「Sheet3」,「Sheet3」的代號爲「Sheet4」。 – YowE3K