簡體   English   中英

有時在子目錄中訪問打開的工作簿會生成錯誤1004“對象'_Global'的'Sheets'的方法未失敗”

[英]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_TemplateSet wb_open = ActiveWorkbook在子目錄中引用打開的工作簿會導致我出現不一致的問題....也許這是Word中VBA實現中的一個異常(錯誤)。

在下面發布的修改后的代碼中,我從調用例程傳遞了o_Excel對象,並使用oExcel.Activesheet.xxx引用了范圍和值。

現在,我的下一個問題是表單控件按鈕代碼上有錯誤,該代碼還使用Dim wb_open As ObjectSet 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM