2017-01-06 5 views
0
  • 私は複数のシートを持つExcelワークブックを持っています。カウントが更新される場合VBAでの辞書(ハッシング)の使用

  • 私は(私が代わりにここにフィルタを使用してのテキストを検索しています)フィルタを使用して、特定のエントリの数を取得する必要があります

  • 「メイン」シートです。文字列はブック内の他のシートから検索されます

  • カウントが更新されるセルは異なります。

  • 検索条件、キーワード、シート、範囲などは、私が投稿したサンプルコードに記載されています。コードから

例:シート「TT」が挙げ基準を満たす場合にのみ

セルに、AE43は、カウントが更新されます。

同様に、データを取得するために、異なるセルに同じ種類のコードを30回以上使用する必要があります。

同様の検索のためのコードを入力する代わりに、「辞書」機能(他の言語ではハッシング)を使用できるかどうかを知りたいので、条件を満たすセルを自動的に更新できます。

Sub WBR() 
Dim wf As WorksheetFunction 
Set wf = Application.WorksheetFunction 

With ActiveWorkbook.Worksheets("TT")    'no of tickets processed - summary 
[AE43] = wf.CountIfs(.Range("I:I"), "<>Duplicate TT", _ 
        .Range("G:G"), "<>Not Tested", _ 
        .Range("U:U"), "Item") 
End With 

With ActiveWorkbook.Worksheets("TT")    'not tested tickets - summary 
[AE44] = wf.CountIfs(.Range("G:G"), "Not Tested") 
End With 

With ActiveWorkbook.Worksheets("TT")    'Tickets moved back- outdated OS and App Versions - summary 
[AE45] = wf.CountIf(.Range("I:I"), "Outdated App Version") + wf.CountIf(.Range("I:I"), "Outdated OS") 
End With 
+1

はい、辞書型は、例えば 'Set dict = CreateObject(" Scripting.Dictionary ")を介してVBA(MAC OSではなく)で利用可能ですが、何をしようとしているのか分かりません。 –

+0

マニュアルで説明する - 別のシートにフィルタを適用し、特定のテキストを選択してカウントを取得し、 "sheet1"でカウントを更新するだけです。この作業は今、vbaで自動化されました。ここでサンプルのExcelファイルを見つけることができます。[リンク] https://expirebox.com/download/5d2fe6f97f7097860cbc0208a663ecd6.html –

+0

は、VBA.itsにC#/ Javaスタイルのコードを書こうとしないと、コードが醜く読み込み不能になります。 – cyboashu

答えて

2

ここでは、開始する必要がある基本的な例を示します。ご利用の例

Sub Tester() 

    With ThisWorkbook.Sheets("Main") 
     .Range("A1") = GetCount("TT", False, "A:A", "Blue") 
     .Range("A2") = GetCount("TT", False, "A:A", "Blue", "C:C", "Red") 
     .Range("A3") = GetCount("TT", True, "A:A", "Blue", "C:C", "Red") 
    End With 


End Sub 

一般化バージョン:コードを呼び出す方法を示す

サブ

'If addValues is True and there are >1 set of criteria then 
' sum up a bunch of COUNTIF(), else use COUNTIFS() so all 
' criteria are applied at the same time 
Function GetCount(shtName As String, addValues As Boolean, _ 
              ParamArray crit()) As Long 

    Dim sht As Worksheet, f As String, num As Long, i As Long 
    Set sht = ThisWorkbook.Sheets(shtName)'<< counting things on this sheet 
    num = UBound(crit) 

    If num = 1 Or addValues Then 
     f = "COUNTIF(" & crit(0) & ",""" & crit(1) & """)" 
    End If 

    If num > 1 Then 
     If addValues Then 
      'already got the first pair: add the rest 
      For i = 2 To num Step 2 
       f = f & " + COUNTIF(" & crit(i) & ",""" & crit(i + 1) & """)" 
      Next i 
     Else 
      f = "COUNTIFS(" 
      For i = 0 To num Step 2 
       f = f & crit(i) & ",""" & crit(i + 1) & """" 
       If i <> num - 1 Then f = f & "," 
      Next i 
      f = f & ")" 
     End If 
    End If 

    If f <> "" Then 
     Debug.Print f 
     GetCount = sht.Evaluate(f) '<<do not use Application.Evaluate here 
    Else 
     GetCount = -1 '<< something went wrong... 
    End If 

End Function 

デバッグ出力:

COUNTIF(A:A,"Blue") 
COUNTIFS(A:A,"Blue",C:C,"Red") 
COUNTIF(A:A,"Blue") + COUNTIF(C:C,"Red") 

は、おそらくいくつかのエラー処理を使用することができます他のユースケースがある場合は、それらを追加する必要があります。

+0

「偽」と「真」はしますか? –

+0

呼び出されたプロシージャの "addValues"に渡されます。そこのコメントを見てください。 –

+0

@TimWilliamsは学習のために、 '' << Application.Evaluateを使用しないでください.''なぜですか? – cyboashu