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

我是一个VBA新手,仍然混淆了使用/不带.Value属性的variables之间的区别。 从我可以告诉,为了写一个单元格的值,你必须使用Range对象的.Value属性? 当试图将variablespos1和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 

然而,大多数对象都有一个默认属性 – 在Range对象的情况下 ,它的默认属性是.Value ,所以如果你自己引用该对象,编译器将默认为…呃… 默认属性。 所以你可以在理论上这样做:

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

然而,这没有什么好处(除了inputless一些的字符),它可能会导致意外的行为,所以一般不build议。


进一步注释

这是一个很好的例子,为什么你应该总是使用Option Explicit在VBA学习。 在模块的顶部使用它会迫使你在使用之前声明Dim所有的variables,这意味着你不仅可以获得intellisense的额外好处,而且你也不能为pos1pos2赋值,因为它们会有被声明为Range对象。