2017-03-25 13 views
0

配列に値を呼び出し、値を比較して結果を返すプログラムに従う。私は別のスレッドでこの質問をしました。 VPA program for compare values in array and give a result (MS Excel)多次元配列と各配列の値を比較し、各配列の結果を返す

ここで、値が割り当てられる1次元配列がわかります。しかし、私はIF条件が私はコードarr(y) = Cells(j, 27)を使用する1次元配列の場合

Dim arr as variable 
For i = 1 to u 
if mycondition1 then 
x = Cells(i, 2).Value 
m = Application.WorksheetFunction.CountIf(Range("B4:B" & u), x) 
ReDim arr(1 To m) 
For j = 1 to u 
if mycondition2 then 
arr(y) = Cells(j, 27) 
End If 
Next j 

trueの場合、複数の列の値を呼び出したいです。ここで私は列27から値を呼び出す。このように私は異なる列から値を割り当てたい(Say 27、28、29 upto 32)。 6つの配列を作成する代わりに、私はarr(1 to m, 1 to 6)という2次元配列を使用し、各列と行のセルから値を取得することができます。しかし、各列の値を以下のコードと同様に比較する方法はわかりません(これは1つの列値の比較です)。私は各列に1つの比較コードを書くことを余儀なくされました。ですから、私のコーディング・ラインはより多くあり、実行に多くの時間を要します。そして、私は最大ループu=100.000行までをしたいです。簡単な方法はありますか?

このコードを書き直して、各列から呼び出された値を比較する方法を教えてください。

答えて

0

まず、私はあなたが望むものを理解していないと言わなければなりません。第二に、私はあなたがそれについて間違った方向に向かっていると感じています。私の最初の観察の観点から、私はお詫び申し上げます。これは私がそれに行くかの方法である: -

Private Sub TestIsYes() 
     Dim Arr As Variant 
     Arr = Array("Yes", "-", "Yes", "yes", "Yes") 

     Debug.Print IsYes(Join(Arr, ",")) 
    End Sub 

Function IsYes(StrArr As String) As String 
    ' 25 Mar 2017 

    Dim Fun As Boolean 

    Fun = CBool(InStr(1, StrArr, "no", vbTextCompare)) 
    If Not Fun Then 
     Fun = CBool(InStr(StrArr, "-")) 
    End If 
    IsYes = Split("No Yes")(CInt(Fun) + 1) 
End Function 

ご覧のとおり、機能IsYesは「はい、 - 、はい、はい」のような文字列を受信あなたに基づいて、リターン「はい」または「いいえ」基準。サブ配列TestIsYesのパラメータ配列の要素を変更することで、関数をテストできます。 TestIsYesは、この結果をワークシートの任意のセルに直接書き込むことができます。

この機能は、必要に応じて変更できますが、プロジェクトの中核に残ります。したがって、引数はIsYesに渡された文字列を生成する方法です。あなたは、範囲からこの文字列を生成したい(または、おそらく)必要があります。次の関数はそれを行います。

Private Function RangeToString(Rng As Range) As String 
    ' 25 Mar 2017 

    Dim Fun As String 
    Dim Arr As Variant 
    Dim R As Long, C As Long   ' rows/columns 

    Arr = Rng.Value 
    With Arr 
     For R = LBound(Arr) To UBound(Arr) 
      For C = LBound(Arr, 2) To UBound(Arr, 2) 
       Fun = Fun & Arr(R, C) & "," 
      Next C 
     Next R 
    End With 
    RangeToString = Fun 
End Function 

Excelの範囲から生成された配列は、単一の列から取得されたものであっても3次元であることに注意してください。したがって、上記の関数は、列の数に関係なく、任意の範囲のIsYesで必要とされる種類の文字列を生成します。

ワークシートの範囲B2:C5(4行2列 - 希望通りに展開または縮小)でテストを設定し、条件を満たしています。前に説明した関数を使って次の関数を作成しました。

Function UDFIsYes(Rng As Range) As String 
    ' 25 Mar 2017 
    UDFIsYes = IsYes(RangeToString(Rng)) 
End Function 

あなたは=UDFIsYes(B2:C5)を入力するワークシートからこの関数を呼び出すことができます。次のようなVBAプロシージャから同じ関数を呼び出すことができます。

Private Sub TestUDF() 
    Debug.Print UDFIsYes(ActiveSheet.Range(Cells(2, 2), Cells(5, 3))) 
End Sub 

これが役立ちます。この情報があなたの必要としていないところにどこにあるのか教えてください。

関連する問題