2014-10-03 53 views
0

输入:我在Excel工作表中有一个范围。比方说“Sheet 1”上的B1:F100 = 100X5矩阵。如何在VBA中检查矩阵中行的条件

现在我要计算任何列B到F(从第1到第100行)中具有“数据”的行数。即我正在寻找一个函数,比方说,ExistIfRow(B1:F100),它将返回一个0或1的100X1数组。所以我可以简单地做一个总和(ExistIfRow(B1:F100))来获得行数。 我希望能够选择100个单元格,并以数组公式的形式输入此函数,以在表单中获得100X1结果。

我希望这是有道理的。


另外,我试图创建这个函数,但是当我尝试将它放入单元格时,它不会显示在我的Excel表格中。有人能帮我看看我做错了什么吗? 该功能位于工作表的“模块”下。

Function RowWiseOR(Rin As Range, Condition As Variant) As Range 

Dim rw As Range 
Dim Out As Variant 
Dim i As Integer 

i = 0 

For Each rw In Rin.Rows 
    If WorksheetFunction.CountIf(rw, Condition) > 0 Then Out(i).Value = 1 Else Out(i).Value = 0 
    i = i + 1 
End 

RowWiseOR = Out 
End Function 

回答

0

我不知道为什么“它没有出现”,但功能本身有一些问题。具体而言,

  • 该函数应返回一个Variant阵列,而不是一个Range
  • 需要被初始化为一个数组来保存结果阵列的
  • 元素没有.Value属性的变量Out。例如,使用的Out(i) = 1代替Out(i).Value = 1
  • Transpose阵列写出来的片材,如果你希望它是一个列向量之前。

参见下文订正功能:

Function RowWiseOR(Rin As Range, Condition As Variant) As Variant 

    Dim rw As Range 
    Dim Out As Variant 
    Dim i As Integer 

    i = 0 

    ReDim Out(Rin.Rows.Count - 1) 

    For Each rw In Rin.Rows 
     If WorksheetFunction.CountIf(rw, Condition) > 0 Then Out(i) = 1 Else Out(i) = 0 
     i = i + 1 
    Next 

    RowWiseOR = Application.Transpose(Out) 

End Function 

记住输入它作为数组公式。有关更多信息,请参阅here

+0

很好。谢谢史蒂夫。这工作。 但是,当我尝试在此范围上执行Countif()时,它会给出#Value错误。例如。当我总结(RowWiseOR(A1:C20,“data”))时,它给了我适当数量的行,在任何地方都有“数据”。使用它作为数组公式我可以看到20X1阵列(我没有转置)与0和1。但是,当我做一个countif(RowWiseOR(A1:C20,“数据”),1)我期望5,但我得到一个错误,而不是。 你能帮忙吗? – StreetHawk 2014-10-03 12:36:30

+0

我需要一点澄清。你是否想用'1'和'0'来查看20X1数组,然后在结果20X1数组中看到单个单元格包含'1'的计数,还是只想计算包含'数据'的行数? – 2014-10-03 15:05:07

+0

所以我想看看'1和'0的20X1阵列。然后,我可以将这个数组求和到一个单元格中,以获得“20X1数组中的'1的数量”。 但我试图用'countifs()'中的另一个20X1数组使用这个20X1数组。那有意义吗?所以我想要做的是countifs(<上面的20X1阵列>,1,H1:H20,1)。这就是错误。 – StreetHawk 2014-10-03 15:15:58

0

Countif由于countif无法使用数组而导致错误的原因。 尝试在Excel中相同,你会再次得到一个错误。

另外我不明白你为什么需要创建一个函数来计数0或1的。这可以很容易地通过Excel中的countif公式实现 - COUNTIF(A1:C3,“data”)