如果我打开另一个工作簿,则运行时错误“9”

时间:2018-01-24 10:13:11

标签: excel vba excel-vba

我有一个工作簿,我正在成功运行一些VBA代码。但是,如果我在后台打开此工作簿然后打开第二个工作簿来处理其他内容,则第一个工作簿中的代码将停止运行,并且出现“运行时错误'9':下标超出范围”消息。

有谁知道为什么会这样?我是一个真正的新手(我本周才开始深入研究VBA!)但怀疑这可能是因为我的代码可能是指“活动”工作簿,因此现在正试图在我打开的第二个工作簿上运行。这是我正在使用的主要“模块”代码:

Sub Auto_Open()

Call CopyValues

End Sub

    Sub CopyValues()

    Dim RowNo As Long
RowNo = Sheets(4).Cells(Rows.Count, 4).End(xlUp).Row + 1

    Sheets(4).Cells(RowNo, 2) = Sheets(1).Cells(14, 2)
    Sheets(4).Cells(RowNo, 3) = Sheets(1).Cells(14, 3)
    Sheets(4).Cells(RowNo, 4) = Sheets(1).Cells(14, 4)
    Sheets(4).Cells(RowNo, 5) = Sheets(1).Cells(15, 2)
    Sheets(4).Cells(RowNo, 6) = Sheets(1).Cells(15, 3)
    Sheets(4).Cells(RowNo, 7) = Sheets(1).Cells(15, 4)
    Sheets(4).Cells(RowNo, 8) = Sheets(1).Cells(16, 2)
    Sheets(4).Cells(RowNo, 9) = Sheets(1).Cells(16, 3)
    Sheets(4).Cells(RowNo, 10) = Sheets(1).Cells(16, 4)
    Sheets(4).Cells(RowNo, 11) = Sheets(1).Cells(17, 2)

If RowNo > 1440 Then
     Rows("2:2").Delete Shift:=xlUp
End If

Application.OnTime Now + TimeValue("00:01:00"), "CopyValues"

End Sub 

我也在工作簿上运行它:

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim z As Integer
    z = 1440

    Worksheets("Sheet4").Range("A2:K" & z).Delete Shift:=xlUp
End Sub

这就是'Sheet4':

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 1 Or Target.Column > 11 Then Exit Sub
    Application.EnableEvents = False
    Cells(Target.Row, 1) = Now
    Application.EnableEvents = True
End Sub

2 个答案:

答案 0 :(得分:1)

所以,正如@Xabier所提到的那样,你并没有完全确定你的射程。您还可以创建一个循环来复制数据,因为那里有一个模式。

CopyValues()中,替换

RowNo = Sheets(4).Cells(Rows.Count, 4).End(xlUp).Row + 1

Sheets(4).Cells(RowNo, 2) = Sheets(1).Cells(14, 2)
Sheets(4).Cells(RowNo, 3) = Sheets(1).Cells(14, 3)
Sheets(4).Cells(RowNo, 4) = Sheets(1).Cells(14, 4)
Sheets(4).Cells(RowNo, 5) = Sheets(1).Cells(15, 2)
Sheets(4).Cells(RowNo, 6) = Sheets(1).Cells(15, 3)
Sheets(4).Cells(RowNo, 7) = Sheets(1).Cells(15, 4)
Sheets(4).Cells(RowNo, 8) = Sheets(1).Cells(16, 2)
Sheets(4).Cells(RowNo, 9) = Sheets(1).Cells(16, 3)
Sheets(4).Cells(RowNo, 10) = Sheets(1).Cells(16, 4)
Sheets(4).Cells(RowNo, 11) = Sheets(1).Cells(17, 2)
If RowNo > 1440 Then
    Rows("2:2").Delete Shift:=xlUp
End If

以下内容:

With ThisWorkbook
    RowNo = .Sheets(4).Cells(Rows.Count, 4).End(xlUp).Row + 1
    For t = 2 To 11
        .Sheets(4).Cells(RowNo, t) = .Sheets(1).Cells(((t - 2) \ 3) + 14, 2 + ((t - 2) Mod 3))
    Next
    If RowNo > 1440 Then .Rows("2:2").Delete Shift:=xlUp
End With
<{1>}替换

中的

BeforeClose()

Worksheets("Sheet4").Range("A2:K" & z).Delete Shift:=xlUp

最后,对于ThisWorkBook.Worksheets("Sheet4").Range("A2:K" & z).Delete Shift:=xlUp ,就像在工作表中一样,您只需要更改

Worksheet_Change

为:

Cells(Target.Row, 1) = Now

答案 1 :(得分:1)

看看这个。您需要在VBA编辑器匹配中检查工作表名称。这样做可以确保您定位正确的工作表(即使有人更改了前端的工作表名称)

Sub Auto_Open()
    Call CopyValues
End Sub

Sub CopyValues()
    Dim RowNo As Long

    With Sheet4
        RowNo = .Cells(.Rows.Count, 4).End(xlUp).Row + 1

        .Cells(RowNo, 2) = Sheet1.Cells(14, 2)
        .Cells(RowNo, 3) = Sheet1.Cells(14, 3)
        .Cells(RowNo, 4) = Sheet1.Cells(14, 4)
        .Cells(RowNo, 5) = Sheet1.Cells(15, 2)
        .Cells(RowNo, 6) = Sheet1.Cells(15, 3)
        .Cells(RowNo, 7) = Sheet1.Cells(15, 4)
        .Cells(RowNo, 8) = Sheet1.Cells(16, 2)
        .Cells(RowNo, 9) = Sheet1.Cells(16, 3)
        .Cells(RowNo, 10) = Sheet1.Cells(16, 4)
        .Cells(RowNo, 11) = Sheet1.Cells(17, 2)

        If RowNo > 1440 Then
             .Rows("2:2").Delete Shift:=xlUp
        End If

        Application.OnTime Now + TimeValue("00:01:00"), "CopyValues"
    End With
End Sub
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim z As Long
    z = 1440

    Sheet4.Range("A2:K" & z).Delete Shift:=xlUp
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 1 Or Target.Column > 11 Then Exit Sub
    With Application
        .EnableEvents = False
        Me.Cells(Target.Row, 1) = Now
        .EnableEvents = True
    End With
End Sub