VBA ("Scripting.Dictionary"). Exists возвращает значение false, когда предполагается, что оно истинно - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь посчитать букву P.Код, который я сейчас имею, «ломается» в операторе if, потому что resDict.Exist - это false. Мы знаем это, потому что if оператор заменяется на If Not, он выполняет тело if.

Он всегда идет прямо к концу if.Я выбрал ссылку «Microsoft Scripting Runtime», чтобы это не было проблемой.

' Get results from 'resDict' dictionary
Function CountResult(word As String) As Integer
    Set resDict = CreateObject("Scripting.Dictionary")
    Dim count As Integer
    count = 0

    If resDict.Exists(UCase(word)) Then
        count = resDict.Item(UCase(word))
    End If

    CountResult = count
End Function

Редактировать: Я только что обнаружил, что в предыдущем фрагменте кода словарьнаполняется.Теперь я пытаюсь сделать общедоступный диктатор таким, чтобы его можно было использовать в фрагменте кода, который я разместил перед редактированием.Есть ли какие-либо подсказки о том, как это сделать, так как я продолжаю получать ошибку Compilingerror: invalid Charactesteric in sub or function для этого фрагмента кода:

Sub CountResults()
    Public resDict
    Set resDict = CreateObject("scripting.dictionary")

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Решение, которое я искал, оказалось публичной переменной.Для этого мне нужно было добавить в качестве первой строки кода (вне каждой подпрограммы и функции) эту строку кода

Public resDict As Variant
0 голосов
/ 22 ноября 2018

Если ваша цель состоит в том, чтобы посчитать вхождения буквы в строку, вы можете использовать что-то вроде этого:

Function CountOccurrencesOf(Letter As String, InString As String, Optional CaseSensitive As Boolean = True) As Long
    CountOccurrencesOf = Len(InString) - Len(Replace$(InString, Letter, vbNullString, , , IIf(CaseSensitive, vbBinaryCompare, vbTextCompare)))
End Function

И вызвать функцию как:

MsgBox CountOccurrencesOf(Letter:="A", InString:="A Sentence with occurences of a or A or anything else", CaseSensitive:=False)

Как отметил Натан_Сав: для подсчета нескольких букв (например, Letter:="en") вам нужно разделить на Len(Letter):

CountOccurrencesOf = (Len(InString) - Len(Replace$(InString, Letter, vbNullString, , , IIf(CaseSensitive, vbBinaryCompare, vbTextCompare)))) / Len(Letter)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...