Сравнение строк в VBA

#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. Большое спасибо за всю помощь, Дэвид