&引用;对象变量或未设置块变量";在VBA中

&引用;对象变量或未设置块变量";在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.

我想用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.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"