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

nwnhqdif  于 2023-05-19  发布在  其他
关注(0)|答案(5)|浏览(595)

这是我目前正在处理的代码,我遇到了这个问题。我是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

错误是Select method of Range class failed via VBA, Error 1004。有什么想法吗

预计到达时间:

所以我把密码改成了

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

我想这就是你所说的让它活跃起来?
但是我还是得到了Method 'Range' of object '_Worksheet' failed, error 1004

am46iovg

am46iovg1#

我相信你在这里有the same problem
必须先激活工作表,然后才能在其上选择范围。
另外,不要省略工作表名称限定符:

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

或者

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

这是一样的

xdnvmnnf

xdnvmnnf2#

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

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

您可能需要重构并考虑不选择。
错误,对象'_Worksheet'的方法'Range'失败,错误1004,你得到的是因为上面有按钮的工作表没有名为“Result”的范围。大多数(可能是所有)返回对象的属性都有一个默认的Parent对象。在本例中,您使用Range属性返回一个Range对象。因为您没有限定Range属性,所以Excel使用默认值。
默认的父对象可以根据情况而不同。如果您的代码在标准模块中,则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。它使代码更具可移植性,并防止发生意外的问题时,事情的变化。
我相信你现在的代码运行在毫秒级,所以你可能不在乎,但避免选择肯定会加快你的代码,你不必设置屏幕更新。随着代码的增长或在不同的情况下,这一点可能变得很重要。

ovfsdjhp

ovfsdjhp3#

这对我很有效。

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
ijxebb2r

ijxebb2r4#

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

nwwlzxa7

nwwlzxa75#

这里有一个解决方案为我工作,而且,我发现上述所有的解决方案都是正确的。我的Excel模型被破坏了,这就是为什么我的代码(类似于这一个)停止工作。以下是对我有效的方法,每次都有效-
1.计算工作簿-公式->立即计算(在计算部分下)
1.保存工作簿
1.关闭并重新打开文件。它是固定的,每次都能工作。

相关问题