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

标签 vba excel 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

最佳答案

...
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 > 属性(property)。

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

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

但是,大多数对象都有一个默认属性 - 对于Range对象,它的默认属性是.Value 因此,如果您单独引用该对象,编译器将默认为... 嗯... default 属性。所以理论上你可以这样做:

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

但是,这样做没有任何好处(除了少输入一些字符之外),并且可能会导致不良行为,因此通常不建议这样做。


进一步说明

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

关于VBA 错误 424,使用 ".Value"属性将值写入单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32910549/

相关文章:

Excel 2010 - 在工作簿中存储功能区自定义

excel - 正确编码构造函数

python - 检查两个整数范围是否重叠

python - 使用 VBA 运行 .exe

excel - 使用powershell查找word和excel文档的最后保存者

python - FOR 循环范围一次处理一定数量的文件

javascript - 未捕获的 DOMException : Failed to execute 'setStart' on 'Range' : The offset is larger than the node's length

excel - 在 VBA 中使用 Excel 函数

vba - Excel VBA - 根据单元格值检测文件是否存在的函数

vba - 如何将 powerpoint 幻灯片注释导出到单个文本文件?