![](/img/trans.png)
[英]Advanced Filter generates 1004 Error "Method 'Range' of object' _Global' failed
[英]Accessing open workbook in a sub generates Error 1004 “Method of 'Sheets' of Object '_Global' not failed” sometimes
嘗試引用活動的工作簿時,結果不一致。 大約有一半時間出現“對象'_Global'的'Sheets'方法未失敗”錯誤,而其他時候代碼運行正常。 我沒有看到圖案。
VBA代碼是Word文檔的一部分,該文檔允許用戶打開模板Excel文件並從Word文檔中選擇文本/將文本復制到Excel文件中的行中。
在上一小節中,我成功打開了Excel模板文件(我稱其為RTM模板)。 在下面的代碼中,我想激活“ RTM”工作表,選擇第一個單元格,其中模板可以從上一次執行中獲取數據,如果有,則計算存在多少行數據。 這樣,新數據將被發布在沒有任何數據的第一行中。 我在工作簿中使用命名范圍來引用起始單元格(“ First_Cell_For_Data”)。
當我運行我的代碼時,有時它運行時沒有錯誤,而其他時候,它停止在“ Sheets(“ RTM”)。Activate“上,並給我“ Method ....”錯誤。 當我將wb_open的變量定義更改為Object時,會發生相同的結果。 我也嘗試過使用“ wb_open.Sheets(“ RTM”)。Activate“獲得相同的結果。
如以下注釋中所建議,我添加了“ If wb_open is no ....”以調試問題。 我還添加了子List_Open_Workbooks,它枚舉了打開的工作簿(其中只有1個),並激活了一個與正確文件名匹配的工作簿。 這是成功的。 但是,當返回Check_Excel_RTM_Template時,我仍然在“ Sheets(“ RTM”)。Activate“行上收到Method錯誤。
第二次更新 :經過更多時間診斷問題后(仍然間歇性地發生),我添加了一些代碼,可能有助於找出問題的根源。 在“ List_Open_Workbooks”子目錄中,我測試xlApp.Workbooks.Count = 0
。 因此,對打開的Excel工作簿的所有引用都將失敗。 此時,我的模板工作簿已在Windows中打開。 我得出正確的結論嗎?
第三次更新:我嘗試Set wb_open = GetObject(str_filename)
,其中str_filename
包含我剛剛打開的Excel模板文件的名稱。
另外,我注意到,如果我重新啟動Word和Excel,它似乎運行得很好。
Sub Check_Excel_RTM_Template(b_Excel_File_Has_Data As Boolean, i_rows_of_data As Integer)
Dim i_starting_row_for_data As Integer
Dim wb_open As Object
Set wb_open = ActiveWorkbook
i_rows_of_data = 0
If wb_open Is Nothing Then
MsgBox "RTM Workbook not open in Check_Excel_RTM_Template"
Call List_Open_Workbooks(b_Excel_File_Has_Data, i_rows_of_data)
Else
' On Error GoTo Err1:
' Sheets("RTM").Activate
' range("First_Cell_For_Data").Select
Workbooks(wb_open.Name).Worksheets("RTM").range("First_Cell_For_Data").Select
If Trim(ActiveCell.Value) <> "" Then
b_Excel_File_Has_Data = True
Do Until Trim(ActiveCell.Value) = ""
ActiveCell.Offset(1, 0).Select
i_rows_of_data = i_rows_of_data + 1
Loop
Else
b_Excel_File_Has_Data = False
End If
End If
Exit Sub
Err1:
MsgBox getName(str_Excel_Filename) & " is not a RTM template file."
b_abort = True
End Sub
子列舉所有打開的工作簿
Sub List_Open_Workbooks(b_Excel_File_Has_Data As Boolean, i_rows_of_data As Integer)
Dim xlApp As Excel.Application
Set xlApp = GetObject(, "Excel.Application")
Dim str_filename As String
Dim xlWB As Excel.Workbook
If xlApp.Workbooks.Count = 0 Then
MsgBox "Error: Windows thinks there are no workbooks open in List_Open_Workbooks"
b_abort = True
Exit Sub
End If
For Each xlWB In xlApp.Workbooks
Debug.Print xlWB.Name
str_filename = getName(str_Excel_Filename)
If Trim(xlWB.Name) = Trim(str_filename) Then
xlWB.Activate
If xlWB Is Nothing Then
MsgBox "Workbook still not active in List_Open_Workbooks"
b_abort = True
Exit Sub
Else
' Sheets("RTM").Activate
Workbooks(xlWB.Name).Worksheets("RTM").range("First_Cell_For_Data").Select
range("First_Cell_For_Data").Select
If Trim(ActiveCell.Value) <> "" Then
b_Excel_File_Has_Data = True
Do Until Trim(ActiveCell.Value) = ""
ActiveCell.Offset(1, 0).Select
i_rows_of_data = i_rows_of_data + 1
Loop
Else
b_Excel_File_Has_Data = False
End If
End If
End If
Next xlWB
Set xlApp = Nothing
Set xlWB = Nothing
End Sub
從路徑/文件名提取文件名的功能
Function getName(pf)
getName = Split(Mid(pf, InStrRev(pf, "\") + 1), ".")(0) & ".xlsx"
End Function
我希望我找到了問題的根源並解決了。
我相信在使用Dim wb_open As Object
並在Check_Excel_RTM_Template
子Set wb_open = ActiveWorkbook
在子目錄中引用打開的工作簿會導致我出現不一致的問題....也許這是Word中VBA實現中的一個異常(錯誤)。
在下面發布的修改后的代碼中,我從調用例程傳遞了o_Excel
對象,並使用oExcel.Activesheet.xxx
引用了范圍和值。
現在,我的下一個問題是表單控件按鈕代碼上有錯誤,該代碼還使用Dim wb_open As Object
並Set wb_open = ActiveWorkbook
方法來引用打開的工作簿。 但我會將其發布為新問題。
感謝所有評論和提供建議的人。
Sub Check_Excel_RTM_Template(oExcel As Object)
Dim i_starting_row_for_data As Integer
Dim str_filename As String
i_rows_of_data = 0
On Error GoTo Err1:
oExcel.ActiveSheet.range("First_Cell_For_Data").Select
If Trim(oExcel.ActiveCell.Value) <> "" Then
b_Excel_File_Has_Data = True
Do Until Trim(oExcel.ActiveCell.Value) = ""
oExcel.ActiveCell.Offset(1, 0).Select
i_rows_of_data = i_rows_of_data + 1
Loop
Else
b_Excel_File_Has_Data = False
End If
Exit Sub
Err1:
Documents(str_doc_index).Activate
MsgBox getName(str_Excel_Filename) & " is not a RTM template file."
b_abort = True
End Sub
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.