VBA错误424,使用"。值"将值写入单元格属性

时间:2015-10-02 15:22:28

标签: excel vba excel-vba range

我是VBA的新手,并且仍然对使用带/不带.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

1 个答案:

答案 0 :(得分:2)

...
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

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

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

然而,这没有任何好处(除了键入一些较少的字符),它可能会导致不良行为,因此通常不建议。

进一步说明

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