2016-08-29 5 views
0

I stumped。これを永遠に働いている。値を計算するルーチンが必要です。 ColAの範囲には、「v」または「h」のいずれかがあります...単に「v」ロジックを最初に働かせようとしています。Excel VBA問題... Colの値範囲が次の操作を決定します - 他の2つのCol値を比較します

かなり簡単です。この機能を少しでも機能させることはできません。どんなアドバイスも大いに感謝しています。ありがとう!ここで

は私のコードは次のとおりです。

Function CountFunction() As Integer 

Dim ColA As Range, ColB As Range, ColJ As Range 

Dim vResult As Integer 
Dim Visitor As String 

Set ColA = Range("A5:A20") 
Set ColB = Range("B5:B20") 
Set ColJ = Range("J5:J20") 

Visitor = "v" 
vResult = 0 

For Each ColA In ColA.Range("A5:A20") 
    For Each ColB In ColB.Range("B5:B20") 
     For Each ColJ In ColJ.Range("J5:J20") 
      If ColA.Cells.Value = Visitor Then 
       If ColB.Cells.Value = ColJ.Cells.Value Then 
        vResult = vResult + 1 
       Else 
        vResult = vResult + 0 
       End If 
      Else 
       If ColB.Cells.Value = ColJ.Cells.Value Then 
        vResult = vResult + 0 
       Else 
        vResult = vResult + 1 
       End If 
      End If 
     Next 
    Next 
Next 

CountFunction = vResult 

End Function 
+0

達成しようとしていることは何ですか?それは何をしているべきではないのですか? (これは、列Aの "v"のカウントを行い、列Bの値の数を列Jのどこかにマッチさせた数を掛けているように見えます。それはあなたが望むものか、それとも別のものを望みますか? – YowE3K

答えて

1

"非常に簡単。" いいえ、そうではありません:]

あなたは、

Set ColA = Range("A1") 
Set ColB = Range("A1") 
Set ColJ = Range("A1") 

以上と

Set ColA = Range("A5:A20") 
Set ColB = Range("B5:B20") 
Set ColJ = Range("J5:J20") 

置き換える置き換えることができます

For Each ColA In ColA.Range("A5:A20") 
    For Each ColB In ColB.Range("B5:B20") 
     For Each ColJ In ColJ.Range("J5:J20") 

For Each ColA In Range("A5:A20") 
    For Each ColB In Range("B5:B20") 
     For Each ColJ In Range("J5:J20") 
付き
1

何を達成しようとしていることであるとことが可能です(ただし、私は本当に推測しています):あなたはUDFとしてこれを使用したい場合は、I

Function CountFunction() As Integer 

    Dim ColA As Range 

    Dim vResult As Integer 
    Dim Visitor As String 

    Visitor = "v" 
    vResult = 0 

    For Each ColA In Range("A5:A20") 
     If ColA.Value = Visitor Then 
      If ColA.Offset(0, 1).Value = ColA.Offset(0, 9).Value Then 
       vResult = vResult + 1 
      End If 
     Else 
      If ColA.Offset(0, 1).Value <> ColA.Offset(0, 9).Value Then 
       vResult = vResult + 1 
      End If 
     End If 
    Next 

    CountFunction = vResult 

End Function 

アップデート次のコメント使用している3つの異なる範囲(例: "A5:A20"、 "B5:B20"、 "J5:J20")にVisitorの値を加えたものを渡すことをお勧めします(コードを変更すると思われます「v」または「h」の値の計算を行っているかどうかによって異なります)。

Function CountFunction(rngA As Range, rngB As Range, rngX As Range, Visitor As String) As Variant 

    Dim vResult As Integer 
    Dim r As Long 

    vResult = 0 

    If rngA.Rows.Count <> rngB.Rows.Count Or _ 
     rngA.Rows.Count <> rngX.Rows.Count Then 
     CountFunction = CVErr(xlErrRef) 
     Exit Function 
    End If 

    For r = 1 To rngA.Rows.Count 
     If rngA.Cells(r, 1).Value = Visitor Then 
      If rngB.Cells(r, 1).Value = rngX.Cells(r, 1).Value Then 
       vResult = vResult + 1 
      End If 
     Else 
      If rngB.Cells(r, 1).Value <> rngX.Cells(r, 1).Value Then 
       vResult = vResult + 1 
      End If 
     End If 
    Next 

    CountFunction = vResult 

End Function 

=CountFunction($A5:$A20,$B5:$B20,J5:J20,"v") 

(もちろん、私は範囲が適切であるどんな範囲に合わせて調整することができる、願っています。)

としてそれを呼び出す:

そうする機能を変更

この関数は非常に制限されたエラーチェックを行います。3つの範囲のそれぞれが同じ行数を持つかどうかをチェックするだけです。しかし、列の数や値の有効性などはチェックしません。

+0

YowE3K、ありがとう!それは動作します。私はとても感謝しています!もう1つ質問があります。その2番目のオフセット(0,9)を関数に入力する変数にしたい場合は、どのようにして(0,9)を再記述し、Columnの位置を関数に渡して動作させますか?この関数をスプレッドシートの他の列にコピー/ペーストする必要があります。再度、感謝します。あなたの援助は素晴らしいものでした。 Tom –

+0

@TominFlorida - 3つの範囲を渡す方法と、 'Visitor'の値をパラメータとして渡す答えを更新しました。 – YowE3K

+0

パーフェクト。あなたは人生の節約者です。お時間をいただきありがとうございます。これは、私が必要としていたものにとても完璧です。ありがとう!トム –

関連する問題