通过VBA选择Range类失败的方法

gue*_*123 16 excel vba

这是我正在使用的代码,我遇到了这个问题.我是Excel的新手,我无法弄清楚出了什么问题.

Private Sub cmdRecord_Click()
Sheets("BxWsn Simulation").Range("Result").Select //This is the line with the problem, as excel told me.
    Selection.Copy
    Sheets("Reslt Record").Select
    Sheets("Reslt Record").Range("A5000").End(xlUp).Offset(1).Select
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
    Sheets("CuCon Simulator").Select
    Application.CutCopyMode = False
    Range("Improvement").Select
End Sub
Run Code Online (Sandbox Code Playgroud)

错误是Range类的Select方法通过VBA失败,错误1004.任何想法?

谢谢.

编辑:

所以我只是将代码更改为

Sheets("BxWsn Simulation").Select
Range("Result").Select
Run Code Online (Sandbox Code Playgroud)

我相信这就是你的意思,让它活跃起来?但是我仍然得到对象'_Worksheet'的方法'范围'失败,错误1004

GSe*_*erg 28

我相信你在这里遇到同样的问题.
工作表必须处于活动状态才能在其上选择范围.

另外,不要省略工作表名称限定符:

Sheets("BxWsn Simulation").Select
Sheets("BxWsn Simulation").Range("Result").Select
Run Code Online (Sandbox Code Playgroud)

要么,

With Sheets("BxWsn Simulation")
  .Select
  .Range("Result").Select
End WIth
Run Code Online (Sandbox Code Playgroud)

这是一样的.


Dic*_*ika 15

这个特定问题的正确答案是"不要选择".有时您必须选择或激活,但99%的情况下您不必选择或激活.如果您的代码看起来像

Select something
Do something to the selection
Select something else
Do something to the selection
Run Code Online (Sandbox Code Playgroud)

您可能需要重构并考虑不选择.

对象'_Worksheet'的错误,方法'范围'失败,错误1004,你得到的是因为带有按钮的工作表没有名为"Result"的范围.返回对象的大多数(可能是所有)属性都具有默认的Parent对象.在这种情况下,您使用Range属性返回Range对象.由于您不限定Range属性,因此Excel使用默认值.

默认的Parent对象可以根据具体情况而有所不同.如果你的代码是一个标准的模块中,那么ActiveSheet将是默认的家长和Excel会尝试解决ActiveSheet.Range("结果").您的代码位于工作表的类模块中(带有按钮的工作表).当在那里使用非限定引用时,默认Parent是附加到该模块的表单.在这种情况下,它们是相同的,因为单击该按钮必须处于活动状态,但情况并非总是如此.

当Excel给出包含'_Object'之类的文本的错误时(你说'_Worksheet'),它总是引用默认的Parent对象 - 下划线给出了它.通常,修复它的方法是通过明确父类来限定引用.但是在不需要时选择和激活的情况下,最好只重构代码.

这是编写代码而无需任何选择或激活的一种方法.

Private Sub cmdRecord_Click()

    Dim shSource As Worksheet
    Dim shDest As Worksheet
    Dim rNext As Range

    'Me refers to the sheet whose class module you're in
    'Me.Parent refers to the workbook
    Set shSource = Me.Parent.Worksheets("BxWsn Simulation")
    Set shDest = Me.Parent.Worksheets("Reslt Record")

    Set rNext = shDest.Cells(shDest.Rows.Count, 1).End(xlUp).Offset(1, 0)

    shSource.Range("Result").Copy
    rNext.PasteSpecial xlPasteFormulasAndNumberFormats

    Application.CutCopyMode = False

End Sub
Run Code Online (Sandbox Code Playgroud)

当我在一个类模块中,就像你正在使用的工作表的类模块一样,我总是尝试用这个类来做事.所以我使用Me.Parent而不是ActiveWorkbook.它使代码更具可移植性,并在事情发生变化时防止意外问题.

我确定你现在的代码在几毫秒内运行,所以你可能不在乎,但避免选择肯定会加速你的代码,你不必设置ScreenUpdating.随着代码的增长或处于不同的情况,这可能会变得很重要.