&引用;对象变量或未设置块变量";在VBA中
我想用VBA计算一列(在wsOut中)的平均值。输入在另一个工作表(wsRefor)中 我使用以下代码,其中我使用工作表函数来计算平均值&引用;对象变量或未设置块变量";在VBA中,vba,excel,Vba,Excel,我想用VBA计算一列(在wsOut中)的平均值。输入在另一个工作表(wsRefor)中 我使用以下代码,其中我使用工作表函数来计算平均值 Dim Avg As Double Dim AvgRange As Range Set Reformulering = ActiveSheet For i = 1 To lastCol AvgRange = Range(wsRefor.Cells(1 + i, 4), wsRefor.Cells(1 + i, lastCol)) wsOut.
Dim Avg As Double
Dim AvgRange As Range
Set Reformulering = ActiveSheet
For i = 1 To lastCol
AvgRange = Range(wsRefor.Cells(1 + i, 4), wsRefor.Cells(1 + i, lastCol))
wsOut.Cells(i + 1, 4).Value = Application.WorksheetFunction.Average(AvgRange)
Next
然而,我从for循环中的第二行得到了错误:
“未设置对象变量或带块变量”
我不确定我是否理解我观看的视频和其他论坛讨论中的错误,因此我希望任何人都能解释错误或潜在的错误点假设您将
Dim wsRefor定义为工作表
,并将其设置为正确的工作表,然后修改您的行:
AvgRange = Range(wsRefor.Cells(1 + i, 4), wsRefor.Cells(1 + i, lastCol))
致:
或者,为了安全起见:
With wsRefor
Set AvgRange = .Range(.Cells(1 + i, 4), .Cells(1 + i, lastCol))
End With
编辑1:我已经测试过的完整代码(也有平均值
函数的错误处理)
指定对象而不是值时,需要使用
Set
关键字
范围
是一个对象,因此需要对其进行设置
要查看差异,可以执行以下操作:
Dim test As Variant
Range("A1").Value = "some text"
test = Range("A1") '// test is now a string containing "some text"
Set test = Range("A1") '// test is now a range object
MsgBox test.Value '// Displays the value of the range object "some text"
对
wsRefor
的引用是否设置为OK,以便指向有效的工作表对象?如果在For循环中首先运行MsgBox wsRefor.Name
,是否会出现相同的错误?顺便说一句,您的示例中没有If语句!:)嘿@OlleSjögren。是的,应该是。另外,谢谢你指出我写的是“如果”而不是“为了”。现在改变了:)在VBA工作时需要了解的相关帖子-。这很有魅力。非常感谢。你在这帮了多少忙。当我现在运行代码时,我收到错误警告运行时错误“1004”无法获取WorksheetFunction类的匹配属性,但它仍然计算并打印平均值。知道原因吗?@papappa将行修改为wsOut.Cells(i+1,4).Value=WorksheetFunction.Average(AvgRange)
,您不需要在WorksheetFunction
之前使用应用程序。和以前一样。它确实正确计算,但仍然给我警告/错误消息。@papappapa在您的代码中,您正在运行一个循环,用于i=1到lastCol
,并使用此数据推进行?你确定你没有打字错误?
Option Explicit
Sub DynamicAvgRange()
Dim wsRefor As Worksheet
Dim wsOut As Worksheet
Dim Avg As Double
Dim AvgRange As Range
Dim lastCol As Long
Dim i As Long
Set wsRefor = ThisWorkbook.Sheets("Refor")
Set wsOut = ThisWorkbook.Sheets("Out")
' just for simulating the tests
lastCol = 6
For i = 1 To lastCol
With wsRefor
Set AvgRange = .Range(.Cells(1 + i, 4), .Cells(1 + i, lastCol))
End With
If Not IsError(Application.Average(AvgRange)) Then
wsOut.Cells(i + 1, 4).Value = Application.Average(AvgRange)
Else
' Average value returned an error (no values in the searched range)
wsOut.Cells(i + 1, 4).Value = "" ' put a blank value >> modify to your needs
End If
Next i
End Sub
Set AvgRange = Range(wsRefor.Cells(1 + i, 4), wsRefor.Cells(1 + i, lastCol))
Dim test As Variant
Range("A1").Value = "some text"
test = Range("A1") '// test is now a string containing "some text"
Set test = Range("A1") '// test is now a range object
MsgBox test.Value '// Displays the value of the range object "some text"