以下是代码:
For R = 5 To 145
If Worksheets("CHPSpecs").Cells(R, 4).Value >= 0.9 * CHPSize And Worksheets("CHPSpecs").Cells(R, 4).Value <= 1.1 * CHPSize Then
j = 0
ReDim Preserve eleOutput(j)
eleOutput(j) = Worksheets("CHPSpecs").Cells(R, 3).Value
End If
Next R
For j = LBound(eleOutput) To UBound(eleOutput)
If eleOutput(j) <= compareNum Then
MsgBox ???????
End If
Next j
我带走了一些代码以便更好地观看,但这是我遇到麻烦的一大块。因此,我让VBA查看指定的列,如果这些单元格中的值与条件匹配,那么它们将存储在名为eleOutput(j)
的数组中。
然后,我想将数组与变量compareNum
进行比较,如果这是If语句为真,我想MsgBox
数组中包含的单元格旁边的单元格eleOutput(j)
1}}。
假设所有内容都已声明并且If statements
已正确完成,我应该用???????
代替{I}代码输出我想要的内容? (编辑:我想将单元格的值输出到相应数组元素左侧的一列)
答案 0 :(得分:2)
尝试这只是基于你想要在你的问题中完成的事情
第一种方法是放弃数组并改为使用Range Objects
第二种方法是使用2D阵列。
Dim eleOutput As Range, c As Range
With Sheets("CHPSpecs")
For R = 5 To 145
If .Cells(R, 4).Value >= 0.9 * CHPSize _
And .Cells(R, 4).Value <= 1.1 * CHPSize Then
If eleOutput Is Nothing Then
Set eleOutput = .Cells(R, 3)
Else
Set eleOutput = Union(eleOutput, .Cells(R, 3))
End If
End If
Next R
End With
For Each c In eleOutput
If c.Value <= compareNum Then
MsgBox c.Offset(0, 1).Value
End If
Next
我不确定为什么你需要存储比较的值
在我看来,如果您只想在MsgBox
中显示这样的值,您可以直接执行此操作:
With Sheets("CHPSpecs")
For R = 5 To 145
If .Cells(R, 4).Value >= 0.9 * CHPSize _
And .Cells(R, 4).Value <= 1.1 * CHPSize Then
If .Cells(R, 3) <= compareNum Then
MsgBox .Cells(R, 4).Value2
End If
End If
Next R
End With
另一种方法是传递数组中的两列,创建一个2D数组:
Dim eleOutput as Variant
eleOutput = Sheets("CHPSpecs").Range("C5:D145")
For j = LBound(eleOutput, 1) To UBound(eleOutput, 1)
If eleOutput(j, 2) >= 0.9 * CHPsize _
And eleOutput(j, 2) <= 1.1 * CHPsize Then
If eleOutput(j, 1) <= compatenum Then
MsgBox eleOutput(j, 2)
End If
End If
Next
再次,正如您所看到的,如果您的唯一目的是展示它,我会直接进行比较 否则,您必须将其传输到另一个数组中,您可以在代码的其他部分中使用它。
答案 1 :(得分:0)
当您在阵列eleOutput(j)
中包含的单元格旁边写入单元格时,目前尚不清楚要显示哪些单元格。我将假设您指的是每个eleOutput(j)
单元格右侧的单元格,但如果我的假设不正确,您可能需要进行调整。
最好的方法是将Range
对象存储在您的数组中,而不是仅存储在Value
中。当您使用Range.Value
获取单元格的值时,您不再具有对单元格本身的引用。
由于这是较大子例程的子集,您可能需要对其他地方的eleObject
进行一些调整,或者完全使用新数组来存储这些Range
个对象。
在您允许eleObject
存储Range
而不是Range.Value
(Variant
)后,您可以执行以下操作:
j = 0 ' Moved before loop
For R = 5 To 145
If Worksheets("CHPSpecs").Cells(R, 4).Value >= 0.9 * CHPSize And Worksheets("CHPSpecs").Cells(R, 4).Value <= 1.1 * CHPSize Then
ReDim Preserve eleOutput(j)
eleOutput(j) = Worksheets("CHPSpecs").Cells(R, 3) ' Note that .Value has been removed
End If
Next R
For j = LBound(eleOutput) To UBound(eleOutput)
If eleOutput(j).Value <= compareNum Then
MsgBox Worksheets("CHPSpecs").Cells(eleOutput(j).Row, eleOutput(j).Column + 1).Value ' Assuming cell is one position to the right
End If
Next j
如@BranislavKollár的评论中所述,您将为此循环的每次迭代分配j = 0
。相反,您可以将j = 0
移到循环开始之上。我编辑了我的答案,以显示此作业的新位置。