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

基本的に、最初の値と2番目の値でフィルタリングできる必要があります。Stackoverflowのメンバーの多大な支援を受けて、これらの値を配列に配置し、最初と2番目の値を決定し、それらを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. すべてのデータを調べて、trueの場合はそれらをカウントした後、上記の変数の1つ(例:testcase8511)でフィルター処理します。(この情報をVBAに保存して、リソースに関して意味のある方法はありますか?疑わしいです、わかりません。)
  2. このフィルタリングされたデータをテキストファイルにエクスポートします(私はほとんど自分で並べ替えました)
  3. ブックを視覚的に同じように返します(またはそのままにします)。つまり、エクスポートプロセスが完了した後、このフィルターをユーザーに視覚的に表示したくありません。
  4. これを可能な限り効率的に、プログラム的に実行します(確かに、答える意思のある人が他の方法でやりたいと思う人はいないと思います)。私たちが使用しているコンピューターのいくつかは...素晴らしいものではありません。

前もって感謝します!うまく説明できなかったことがあれば明確にします。遠ざけてください。

4

1 に答える 1

0

さて、フィルタリングの 1 つの解決策を次に示します。
Worksheet-Module 内:

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ため、私は使用しました。)しかし、実用的な観点から、私は個人的にルールに固執します:数字を数字として扱いたい場合は、数字でなければなりません!したがって、値を 2 つの列に分割し、これらに対して「通常の」数値フィルターを使用することをお勧めします。(そのためのサブは、ここのものとかなり似たように機能します...)CStr3,5

于 2013-01-13T11:42:06.060 に答える