1

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

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

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. 尽可能高效地执行此操作,程序明智(诚然,我怀疑任何愿意回答的人都会渴望不这样做)。我们正在使用的一些计算机......不是很好。

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

4

1 回答 1

0

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

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 的工作原理与这里的非常相似......)

于 2013-01-13T11:42:06.060 回答