【发布时间】:2019-09-04 12:58:23
【问题描述】:
这是我在这里的第一篇文章,我几乎没有接受过正式的编码培训,所以这可能是一个非常简单的问题。
在运行由以下代码定义的宏时,我遇到了错误 9,VBA 下标超出范围。 具体来说,它是 Sub Select_Last() 函数。 Excel 不喜欢随后的表达式,但是如果在单独的 Excel 文件中单独使用它,那么它可以正常工作。
我认为问题在于 Excel 的默认变量(Activesheet 等)相互冲突。但我不确定如何解决这个问题。其他潜艇工作正常。任何人都可以帮忙吗?谢谢。
Public lastsheet As String
Sub Select_Last()
Sheets(lastsheet).Select
End Sub
Sub Protect()
For i = 1 To Sheets.Count
Sheets(i).Protect
Next i
End Sub
Sub UnProtect()
For i = 1 To Sheets.Count
Sheets(i).UnProtect
Next i
End Sub
Sub SelectUnlockedCells()
Dim WorkRng As Range
Dim OutRng As Range
Dim Rng As Range
On Error Resume Next
Set WorkRng = Application.ActiveSheet.UsedRange
Application.ScreenUpdating = False
For Each Rng In WorkRng
If Rng.Locked = False Then
If OutRng.Count = 0 Then
Set OutRng = Rng
Else
Set OutRng = Union(OutRng, Rng)
End If
End If
Next
If OutRng.Count > 0 Then OutRng.Select
Application.ScreenUpdating = True
End Sub
其他功能正常。
【问题讨论】:
-
在哪里以及如何为
lastsheet赋值?该变量在哪里声明(哪个模块)? -
欢迎来到 SO。首先
On Error Resume Next隐藏了错误,但它们仍然会发生。如果您正在学习,我建议您在不使用它的情况下编写代码。其次,您定义了Public lastsheet As String,但在您的代码中,您从未为该变量赋值。字符串变量中的默认值为"",它等于无(空值)。它有点空。因此,当您执行Sheets(lastsheet).Select时,您是在告诉 Excel 选择一个名为 null value 的工作表,但这是不可能的。工作簿中的所有工作表必须有名称 -
嗨,James,还请记住,“Sub SelectUnlockedCells()”中的“For”循环在“Next”语句之后没有指示变量。您的代码中有一些小错误让我认为它可以在整体结构中进行一些重新思考,例如@Rory 所指出的评论。
-
使用Option Explicit,运行前编译!!!!!!!!!!!!
-
谢谢。 lastsheet 值是通过Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) lastsheet = Sh.Name End Sub 分配的