这是我正在使用的代码,我遇到了这个问题。我是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
答案 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模型损坏了,这就是为什么我的代码(类似于此代码)停止工作的原因。这是对我有用的,并且每次都在起作用-
答案 4 :(得分:-1)
这就是你以一种简单而非复杂的方式解决这个问题的方法
而不是使用sheet(x).range
使用Activesheet.range("range").select