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

时间:2010-10-11 00:26:06

标签: 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

错误是通过VBA选择Range类失败的方法,错误1004。 有什么想法吗?

感谢。

编辑:

所以我只是将代码更改为

Sheets("BxWsn Simulation").Select
Range("Result").Select

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

5 个答案:

答案 0 :(得分:25)

我相信你在这里the same problem 工作表必须处于活动状态才能在其上选择范围。

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

Sheets("BxWsn Simulation").Select
Sheets("BxWsn Simulation").Range("Result").Select

或者,

With Sheets("BxWsn Simulation")
  .Select
  .Range("Result").Select
End WIth

是一样的。

答案 1 :(得分:14)

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

Select something
Do something to the selection
Select something else
Do something to the selection

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

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

默认的Parent对象可以根据具体情况而有所不同。如果您的代码在标准模块中,则ActiveSheet将是默认的Parent,Excel将尝试解析ActiveSheet.Range(“Result”)。您的代码位于工作表的类模块中(带有按钮的工作表)。当在那里使用非限定引用时,默认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

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

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

答案 2 :(得分:2)

这对我有用。

RowCounter = Sheets(3).UsedRange.Rows.Count + 1

Sheets(1).Rows(rowNum).EntireRow.Copy
Sheets(3).Activate
Sheets(3).Cells(RowCounter, 1).Select
Sheets(3).Paste
Sheets(1).Activate

答案 3 :(得分:0)

这是一个对我有用的解决方案,而且我发现上述所有解决方案都是正确的。我的excel模型损坏了,这就是为什么我的代码(类似于此代码)停止工作的原因。这是对我有用的,并且每次都在起作用-

  1. 计算工作簿-公式->立即计算(在计算部分下)
  2. 保存工作簿
  3. 关闭并重新打开文件。它是固定的,并且每次都能工作。

答案 4 :(得分:-1)

这就是你以一种简单而非复杂的方式解决这个问题的方法 而不是使用sheet(x).range使用Activesheet.range("range").select