我是 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
pos1
和 pos2
不再是 Range
对象,因此它们没有 .Value
> 属性(property)。
相关:最佳实践是始终直接引用您尝试访问的属性,如下所示:
Range("A1").Value = someVar
someOtherVar = Range("A1").Value
但是,大多数对象都有一个默认属性 - 对于Range
对象,它的默认属性是.Value
因此,如果您单独引用该对象,编译器将默认为... 嗯... default 属性。所以理论上你可以这样做:
Range("A1") = someVar
someOtherVar = Range("A1")
但是,这样做没有任何好处(除了少输入一些字符之外),并且可能会导致不良行为,因此通常不建议这样做。
进一步说明
这是一个完美的例子,说明了为什么在学习 VBA 时应该始终使用Option Explicit
。在模块顶部使用它会强制您在使用前声明 Dim
所有变量,这意味着您不仅可以获得 intellisense 的额外好处但您也无法为 pos1
和 pos2
分配数值,因为它们将被声明为 Range
对象。
关于VBA 错误 424,使用 ".Value"属性将值写入单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32910549/