2017-01-06 6 views
0
  • У меня есть книга Excel с несколькими листами.Использование словаря (хеширование) в VBA

  • Я должен получить отсчеты определенных записей с помощью фильтров (я ищу текст вместо того, чтобы использовать фильтры здесь)

  • «Основной» лист, где счетчик обновляется. Строки выполняются с других листов в рабочей книге

  • Клетки, в которых следует обновлять счет, варьируются.

  • Критерии поиска, ключевое слово, лист, диапазон и т. Д. Приведены в примере кода, который я опубликовал.

Пример из кода:

In Cell, 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

Да, тип словаря доступен для VBA (но не для MAC OS), например, 'Set dict = CreateObject (« Scripting.Dictionary »)', но я не понимаю, что вы пытаетесь сделать. –

+0

Чтобы сказать в ручном режиме - я просто применяю фильтры в разных листах и ​​выбираю определенный текст и получаю счет и обновляю счет в «sheet1». Эта задача теперь автоматизирована в vba. Вы можете найти здесь пример файла excel [link] https://expirebox.com/download/5d2fe6f97f7097860cbc0208a663ecd6.html –

+0

Не пытайтесь писать код стиля C#/Java в VBA.its overkill, делает ваш код уродливым и не читаемым. – cyboashu

ответ

2

Вот базовый пример, который должен вас начать.

Sub, показывающий, как вызвать код:

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

Что делает «False» и «True»? –

+0

Это передается в "addValues" в вызываемой процедуре. Смотрите комментарий там. –

+0

@TimWilliams только для обучения, '' << не использовать Application.Evaluate here' why? – cyboashu

Смежные вопросы