[英]How to pass an Excel worksheet name to an Access subroutine?
我正在嘗試使用 Access VBA 遍歷 Excel 文件中的所有工作表。
子程序需要在每個工作表中選擇第一行並設置行高度。
我正在使用字符串變量來調用子例程並將工作表名稱傳遞給它。 它第一次有效,但下次我得到
“范圍類的選擇方法失敗”
我試着移動變量聲明,改變我打開 Excel 的位置(如果我把它放在子例程中,它會打開兩次)並將它作為函數而不是子例程來執行。
'我的對象和工作表變量在對象的頂部聲明:
Dim objExcel As Object
Dim wks As Worksheet
Dim wkb As Workbook
'我正在打開 Excel 並在子例程中設置工作簿對象:
Set objExcel = CreateObject("Excel.Application") 'Excel is invoked 01
Set wkb = objExcel.Workbooks.Open(strOutputPathAndFileName)
objExcel.Application.Visible = True
'然后調用子程序設置行高和文本換行屬性
FirstRowHeightAndWrap ("ChangeTracking")
FirstRowHeightAndWrap ("FivePCalcsThisPPE")
'這是函數
Function FirstRowHeightAndWrap(strSheetName As String)
Set wks = wkb.Sheets(strSheetName)
With wks
.Rows(1).Select
.Rows(1).RowHeight = 28
.Rows(1).WrapText = True
End With
End Function
這是關於在與 objExcel 和 wkb 變量不同的地方設置 wks 變量的事情,很明顯,因為如果我在一個地方完成所有工作,它就可以工作。
您只需要像這樣循環工作表:
Public Function SetRowHeight()
Dim objExcel As Object
Dim wkb As Workbook
Dim wks As Worksheet
Set objExcel = CreateObject("Excel.Application")
Set wkb = objExcel.Workbooks.Open("c:\test\test.xlsx")
For Each wks In wkb.Worksheets
wks.Rows(1).RowHeight = 28
wks.Rows(1).WrapText = True
Next
wkb.Close True
Set wkb = Nothing
objExcel.Quit
Set objExcel = Nothing
End Function
為什么它不起作用?
這是關於在與 objExcel 和 wkb 變量不同的地方設置 wks 變量的事情,很明顯,因為如果我在一個地方完成所有工作,它就可以工作。
您的函數調用不起作用的主要原因是因為您試圖使用超出其范圍的變量。 您在子/函數中聲明和設置的變量是該子/函數的本地變量。
在您的情況下, wkb
變量只能在聲明和設置它的子中引用。 一旦您調用FirstRowHeightAndWrap
,您將收到一個Object required
錯誤,因為訪問不知道變量wkb
是什么。
您可以通過使用View > Locals Window
並逐行執行代碼來查看此過程,並且您會注意到,一旦到達新的子/函數調用,您現有的局部變量就會顯示為Empty
。
你怎么能修好呢?
1.解決方法是將wkb
對象作為函數中的引用傳遞。 換句話說,您需要按如下方式調整行:
在你的子...
FirstRowHeightAndWrap wkb, "ChangeTracking"
FirstRowHeightAndWrap wkb, "FivePCalcsThisPPE"
您還需要將函數頭和函數更改為:
如果你想循環所有工作表......
Function FirstRowHeightAndWrap(ByRef wkb As Object)
For Each wks In wkb.Worksheets
wks.Rows(1).RowHeight = 28
wks.Rows(1).WrapText = True
Next
End Function
如果您想使用特定的 sheetname 參數保留原始函數...
Function FirstRowHeightAndWrap(ByRef wkb As Object, strSheetName As String)
Set wks = wkb.Sheets(strSheetName)
With wks
.Rows(1).RowHeight = 28
.Rows(1).WrapText = True
End With
End Function
2.更簡單的解決方案,尤其是在您使用簡單函數的情況下,是將所有內容轉儲到同一個 sub 中,這樣您就不必在每次函數調用時傳遞引用。
同樣如評論中所述,您的函數中不需要.Select
行。 如果您有其他用戶使用您的應用程序,我還建議對您的變量使用后期綁定,以防止任何可能的引用問題。
祝你好運! :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.