需要MsgBox在数组中的单元格旁边显示excel单元格

时间:2015-03-22 06:47:38

标签: excel vba excel-vba

以下是代码:

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}代码输出我想要的内容? (编辑:我想将单元格的值输出到相应数组元素左侧的一列)

2 个答案:

答案 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.ValueVariant)后,您可以执行以下操作:

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移到循环开始之上。我编辑了我的答案,以显示此作业的新位置。