VBA 错误 424,使用“.Value”向单元格写入值属性

VBA Error 424, Writing value to a cell using ".Value" property

我是 VBA 新手,仍然对使用变量 with/without 和 .Value 属性 之间的区别感到困惑。据我所知,为了将值写入单元格,您必须使用 Range 对象的 .Value 属性 吗?尝试将变量 pos1 和 pos2 写入该子函数底部附近的特定单元格时出现错误 424。这里有什么问题,有没有更好的方法将值写入单元格?

Sub Calcs1()
Sheets("Calculations").Select
Sheets("Calculations").Range("P1", Range("P1").End(xlDown)).Clear
Sheets("Calculations").Range("Q1", Range("Q1").End(xlDown)).Clear
Sheets("Calculations").Range("R1", Range("R1").End(xlDown)).Clear
Set l = Range("length")
Sheets("Calculations").Range("P1") = -l

Set incr = Range("incr")

Application.ScreenUpdating = False

Dim I As Long
For I = 2 To (2 * l / incr + 1)
    Cells(I, 16).Value = Sheets("Calculations").Range("P1") + (I - 1) * incr
Next I

LastRow = Sheets("Calculations").Range("P1").CurrentRegion.Rows.Count

Set pos = Sheets("Calculations").Range("P1:P" & LastRow)
Set V = Range("v")
Set m = Range("m")
Set cpos = Range("currpos")
Set mvals = Sheets("Calculations").Range("Q1:Q" & LastRow)
Set vvals = Sheets("Calculations").Range("R1:R" & LastRow)
Set mmax = Range("mmax")
Set vmax = Range("vmax")
Set pos1 = Range("posmmax")
Set pos2 = Range("posvmax")

Dim NumRows As Long
NumRows = pos.Rows.Count

Dim ii As Long
For ii = 1 To NumRows
    cpos.Value = Round(pos(ii) * (1 / incr), 0) / (1 / incr)
    mvals(ii).Value = m
    vvals(ii).Value = V
Next ii

mmax.Value = Application.Max(mvals)
vmax.Value = Application.Max(vvals)

pos1 = -l
pos2 = -l

Dim jj As Long
For jj = 1 To NumRows
    If mvals(jj) = mmax Then
        pos1.Value = pos(jj)
    End If
    If vvals(jj) = vmax Then
        pos2.Value = pos(jj)
    End If
Next jj


Sheets("Max Shear_Moment").Select
Application.ScreenUpdating = True
End Sub
...
pos1 = -l    '<~~~
pos2 = -l    '<~~~

Dim jj As Long
For jj = 1 To NumRows
    If mvals(jj) = mmax Then
        pos1.Value = pos(jj)
    End If
    If vvals(jj) = vmax Then
        pos2.Value = pos(jj)
    End If
Next jj

pos1pos2 不再是 Range 对象,因此它们没有 .Value 属性.

相关: 最佳做法是始终直接引用您尝试访问的 属性,如下所示:

Range("A1").Value = someVar
someOtherVar = Range("A1").Value

但是,大多数对象都有一个 default 属性 - 对于 Range 对象,它是 default 属性 是 .Value 所以如果你自己引用对象,编译器将默认为......好吧...... default 属性。所以理论上你可以这样做:

Range("A1") = someVar
someOtherVar = Range("A1")

然而,这样做没有任何好处(除了少输入几个字符),而且可能会导致意外行为,因此通常不建议这样做。


进一步说明

这是一个完美的例子,说明了为什么在 VBA 中学习时应该始终使用 Option Explicit。在模块顶部使用它会强制您在使用前声明 Dim 所有变量,这意味着您不仅可以获得 的额外好处,而且您也无法分配数值到 pos1pos2 因为它们将被声明为 Range 对象。