VBA Workbook.close函数:无法在所需位置

时间:2015-12-29 15:38:33

标签: .net excel vba excel-vba

我有这段代码:

Sub test()
    Dim wb As String
    Dim wbb As Workbook
    wb =     "C:\xyz.xlsx"
    Set wbb = Workbooks.Open(wb)
    MsgBox ("testing")
    wbb.Close
End Sub

上面的工作只是很好。 工作簿按预期结束

但是,此代码 似乎无法正常工作。但对我而言,它与workbooks.close函数相比看起来相同。有人可以告诉为什么这会抛出错误“运行时错误'1004':应用程序定义或对象定义错误

Sub filesTest(folder, dex)
Dim wb As String
Dim wbb As Workbook
Dim dat
Dim dat2
Dim dat3
Dim dat4

wb = "xyz.xlsm"
    For Each file In folder.Files
        If file.Name Like "*.xlsm" Then
            If InStr(file.Name, "~$") = 0 Then
            'sendFile (file.Name)
                Set wbb = Workbooks.Open(file)
                Worksheets("Sheet 1").Select
               dat = Range("F11")
                Worksheets("Sheet 2").Select
                dat2 = Range("C54")
                dat3 = Range("D54")
                dat4 = Range("E54")
               wbb.Close
            Workbooks(wb).Activate
            Range("B" & dex) = dat
            Range("C" & dex) = dat2
            Range("D" & dex) = dat3
            Range("E" & dex) = dat4
            End If
        End If
    Next
End Sub  

我试图移动wbb.close的位置,但这似乎没有任何帮助。

我还试图使用另一种“Activeworkbook.close false”,并对其进行修改,并出现完全相同的错误消息。

我还确认了Set wbb = Workbooks.Open( file )< - 文件变量的格式与测试块中的代码相同

非常感谢任何帮助,

谢谢。

3 个答案:

答案 0 :(得分:1)

这是解决方案:

Sub filesTest(folder, dex)
Dim wb As String
Dim wbb As Workbook
Dim dat
Dim dat2
Dim dat3
Dim dat4

wb = "xyz.xlsm"
    For Each file In folder.Files
        If file.Name Like "*.xlsm" Then
            If InStr(file.Name, "~$") = 0 Then
        'sendFile (file.Name)
application.enableevents = false
                Set wbb = Workbooks.Open(file)
                Worksheets("Sheet 1").Select
               dat = Range("F11")
                Worksheets("Sheet 2").Select
                dat2 = Range("C54")
                dat3 = Range("D54")
                dat4 = Range("E54")
               wbb.Close
application.enableevents = true
             Workbooks(wb).Activate
            Range("B" & dex) = dat
            Range("C" & dex) = dat2
            Range("D" & dex) = dat3
            Range("E" & dex) = dat4
            End If
        End If
    Next
End Sub  

答案 1 :(得分:0)

这可能无法解决问题,但我认为问题的一部分是多个工作簿,而Range中没有明确的引用。值得指出的是,评论太长了。

尝试使用以下内容:

Sub filesTest(folder, dex)
Dim wb      As String
Dim wbb     As Workbook
Dim dat, dat2, dat3, dat4

wb = "xyz.xlsm"
For Each file In folder.Files
    If file.Name Like "*.xlsm" Then
        If InStr(file.Name, "~$") = 0 Then
            'sendFile (file.Name)
            Set wbb = Workbooks.Open(file)
            With wbb
                dat = .Worksheets("Sheet 1").Range("F11")
                dat2 = .Worksheets("Sheet 2").Range("C54")
                dat3 = .Worksheets("Sheet 2").Range("D54")
                dat4 = .Worksheets("Sheet 2").Range("E54")
                .Close
            End With

            With Workbooks(wb)
                .Range("B" & dex) = dat
                .Range("C" & dex) = dat2
                .Range("D" & dex) = dat3
                .Range("E" & dex) = dat4
            End With
        End If
    End If
Next
End Sub

我所做的是使用With来帮助明确说明正在使用的范围。这可能有所帮助,但如果没有,请告诉我。

答案 2 :(得分:0)

您似乎在开放事件和/或工作表激活事件中运行了事件代码,因此您可以使用EnableEvents禁用该事件代码。还有很多不必要的选择:

Sub filesTest(folder, dex)
Dim wb As String
Dim wbb As Workbook
Dim dat
Dim dat2
Dim dat3
Dim dat4

On Error Goto clean_up
wb = "xyz.xlsm"
    Application.Enableevents = False
    For Each file In folder.Files
        If file.Name Like "*.xlsm" Then
            If InStr(file.Name, "~$") = 0 Then
            'sendFile (file.Name)
                Set wbb = Workbooks.Open(file)

               dat = wbb.Worksheets("Sheet 1").Range("F11").Value
               With wbb.Worksheets("Sheet 2")
                  dat2 = .Range("C54").Value
                  dat3 = .Range("D54").Value
                  dat4 = .Range("E54").Value
               End With
               wbb.Close
            Workbooks(wb).Activate
            Range("B" & dex) = dat
            Range("C" & dex) = dat2
            Range("D" & dex) = dat3
            Range("E" & dex) = dat4
            End If
        End If
    Next

clean_up:
    Application.Enableevents = True
End Sub