【问题标题】:VBA, Filtering by multiple array parameters in one cellVBA,一个单元格中的多个数组参数过滤
【发布时间】:2013-01-12 19:50:21
【问题描述】:

环顾四周,还没有找到合适的解决方案,所以这是我的问题!对此还是很陌生,请原谅我的任何不当词汇。

我正在尝试对类似于以下的数据进行过滤:

8.5 x 11
8.3 x 10.9
8.7 x 10.9
8.3 x 10.9
11 x 8.5
8.5 x 11
8.5 x 11
15 x 11

基本上我需要能够按第一个值和第二个值进行过滤。在 Stackoverflow 成员的大力帮助下,我整理出将这些值放入数组中,确定第一个和第二个值并将它们分配为 Arrval(0) 和 Arrval(1),然后将这些值分配给变量“小”和“大”基于尺寸。这样,如果第一面较大,等等。它仍然有效。以下是与此相关的相关代码:

val = Trim(arr(r, 1))
    If val Like "*x*" Then
        Arrvals = Split(val, "x")
        V1 = Trim(Arrvals(0))
        V2 = Trim(Arrvals(1))
        If IsNumeric(V1) And IsNumeric(V2) Then
            V1 = CDbl(V1)
            V2 = CDbl(V2)
                            If V1 > V2 Then
                Small = V2: Large = V1
            Else
                Small = V1: Large = V2
            End If
            End If
            End If

随后,我使用这些值来确定“尺寸”的尺寸,并在它满足某些参数时对其进行计数。例如

testcase8511 = Small <= 9.9 And Large <= 14.5
test117 = Small >= 10 And Large <= 17.6

然后我使用 if-else 语句(仅使用 if x then range.value = range.value +1)对它们进行计数,并更改它们所在行的颜色。

长话短说(希望提供足够的背景资料以使这更容易!)我需要能够按这些参数进行过滤,然后将结果导出到文本文件。我已经将文本导出大部分整理出来,但我不知道如何正确过滤。我怀疑这主要是语法问题。

快速而肮脏的方法是在这些变量为真的行中添加一个“x”或“y”或其他一些标记,然后在我进行计数时将其添加到它们,然后按此过滤,但我怀疑对于比我有更多线索的人来说,有一种更好/更有效/更少资源密集型的方法可以做到这一点。我什至不知道从字面上使用自动过滤器,导出然后关闭自动过滤器是否是最好的方法。由于这些行是彩色的,我想我也可以通过单元格的内部颜色或其他东西进行过滤。只是不知道去哪里才能正确完成这项工作。

所以基本上,总而言之,我需要能够做到

  1. 在我检查完所有数据并计算它们是否为真后,按我的上述变量之一(例如 testcase8511)进行过滤。 (有没有办法将这些信息存储在 VBA 中,这对资源来说是有意义的?我对此表示怀疑,不知道。)
  2. 将此过滤后的数据导出到文本文件(我主要为自己排序)
  3. 返回工作簿(或保留)外观相同。即,我不希望在导出过程完成后这个过滤器在视觉上呈现给用户。
  4. 尽可能高效地执行此操作,程序明智(诚然,我怀疑任何愿意回答的人都会渴望不这样做)。我们正在使用的一些计算机......不是很好。

提前致谢!如果我没有解释清楚,我会澄清任何事情。问远点。

【问题讨论】:

  • 有这篇文章询问页面大小选择...check this out..您使用的是哪个版本的 Excel?因为在 2003 年之后,您有 CountIFs() 来帮助您解决这个问题...

标签: arrays vba syntax parameters filtering


【解决方案1】:

好的,这是过滤的一种解决方案:
在工作表模块中:

Sub test()
    Dim i As Long
    Dim f1 As String, f2 As String
    Dim f As String
    Dim c As New Collection
    Dim arr() As String

    f = InputBox("Enter two filters with comma, e.g. '>3.2, <10", "Filters")
    If InStr(f, ",") = 0 Then Exit Sub
    f1 = Split(f, ",")(0)
    f2 = Split(f, ",")(1)

    For i = 2 To Me.UsedRange.Rows.Count
        If xFilter(f1, f2, Me.Cells(i, "A").Text) Then c.Add Me.Cells(i, "A").Text
    Next
    If Not Me.AutoFilterMode Then Me.Rows(1).AutoFilter

    ReDim arr(c.Count - 1)
    For i = 1 To c.Count
        arr(i - 1) = c(i)
    Next
    Me.UsedRange.AutoFilter Field:=1, Criteria1:=arr, Operator:=xlFilterValues

End Sub

Field为列号,必须与上面的Cell(i, "A")匹配)

在一个模块中:

Public Function xFilter(f1 As String, f2 As String, t As String) As Boolean
    Dim v1 As Double
    Dim v2 As Double
    Dim r1 As Boolean
    Dim r2 As Boolean

    v1 = Val(Split(t, "x")(0))
    v2 = Val(Split(t, "x")(1))

    r1 = Evaluate( _
        WorksheetFunction.Text(v1, "0.0########") & f1)
    r2 = Evaluate( _
        WorksheetFunction.Text(v2, "0.0########") & f2)
    xFilter = r1 And r2
End Function

它似乎做的伎俩“OK”。 (我使用了WorksheetFunction.Text,因为CStr 提供了一个本地化字符串,例如德语中的3,5。) 然而,从实际的角度来看,我个人会坚持以下规则:如果您想将数字用作数字,它们应该是数字!所以我宁愿将这些值分成两列,并在这些列上使用“普通”数字过滤器。 (一个 sub 的工作原理与这里的非常相似......)

【讨论】:

  • 谢谢!给了我一些想法。
猜你喜欢
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 2019-11-05
相关资源
最近更新 更多