#string #vba #compare
#строка #vba #Сравнить
Вопрос:
У меня есть базовые знания в области программирования, и я много лет был самодостаточным, но эту проблему я, похоже, не могу решить. У меня есть программа на VBA, и мне нужно сравнить две строки. Я пытался использовать следующие методы для сравнения приведенных ниже строк, но безрезультатно:
//Assume Cells(1, 1).Value = "Cat"
Dim A As String, B As String
A="Cat"
B=Cell(1, 1).Value
If A=B Then...
If A Like B Then...
If StrCmp(A=B, 1)=0 Then...
I've even tried inputting the Strings straight into the code to see if it would work:
If "Cat" = "Cat" Then...
If "Cat" Like "Cat" Then...
If StrCmp("Cat" = "Cat", 1) Then...
VBA по какой-то причине не распознает эти строки как равные. При прохождении через отладчик показано, что StrComp возвращает 1. Имеют ли мои строки разные длины символов? Спасибо за любую помощь.
Комментарии:
1. Что вы увидите, если сделаете
B = "@@@" Cell(1, 1).Value "@@@"
это? Есть лишние пробелы? Пробовал переносB
сTrim()
помощью?2. Да, и VBA по-прежнему возвращает 1 с помощью StrComp()
3. Я думаю, что вы используете
StrComp
неправильно. Но другие функции должны работать (и действительно работают, когда я их тестирую).4. Я использую это неправильно? И я не знаю, продолжайте пытаться, если «D555177» похож на «D555177″… но я ничего не получаю. Это потому, что у меня есть целые числа в строке? Это не должно иметь значения, верно?
5. смотрите мой ответ ниже, вы, безусловно, используете его неправильно, сравнивая логическое значение с целым числом.
Ответ №1:
Публикация в качестве ответа, потому что он не помещается в комментарии:
Мне трудно поверить, что что-то вроде:
MsgBox "Cat" = "Cat"
Не будет отображаться True
на вашем компьютере. Пожалуйста, проверьте.
Однако я замечаю, что вы, безусловно StrComp
, неправильно используете функцию.
Правильное использование StrComp(string, anotherstring, [comparison type optional])
Когда вы это делаете StrComp(A=B, 1)
, вы, по сути, просите его сравнить, эквивалентно ли логическое значение ( A=B
будет либо равно True, либо False) целому числу 1
. Это не так и никогда не будет.
Когда я запускаю следующий код, все четыре окна сообщений подтверждают, что каждое утверждение оценивается как True .
Sub CompareStrings()
Dim A As String, B As String
A = "Cat"
B = Cells(1, 1).Value
MsgBox A = B
MsgBox A Like B
MsgBox StrComp(A, B) = 0
MsgBox "Cat" = "Cat"
End Sub
Обновление из комментариев
Я не вижу ничего странного, если я использую массив, просто к вашему сведению. Пример данных, используемых в массиве:
Модифицированная процедура для использования массива:
Sub CompareStrings()
Dim A As String, B() As Variant
A = "Cat"
B = Application.Transpose(Range("A1:A8").Value)
For i = 1 To 8
MsgBox A = B(i)
MsgBox A Like B(i)
MsgBox StrComp(A, B(i)) = 0
MsgBox "Cat" = B(i)
Next
End Sub
Что я бы проверил, так это то, как вы создаете экземпляр массива. Массивы диапазонов (согласно моему примеру) имеют основание 1. Если он назначен каким-либо другим способом, скорее всего, это базовый 0, поэтому убедитесь, что вы сравниваете правильный индекс массива.
Комментарии:
1. Хм, вы правы. Я получаю true через сообщение сообщения. Может быть, это потому, что что-то не так с моим массивом, который я использую. Для i = от 1 до 8, если A = B (i), то… Далее я
2. Да, StrComp не должен так сравнивать. Спасибо.
3. см. Дополнительную информацию, добавленную выше. Возможно, это приблизит вас к решению проблемы (потенциально) с вашим массивом.
4. Большое спасибо за всю помощь, Дэвид