我有一个工作簿,我正在成功运行一些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
答案 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