Сравнение строк, дающих неожиданные результаты - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть список данных, и я создал форму для ввода новых данных, которые будут добавлены в список.При нажатии на кнопку он возьмет информацию (имя и адрес электронной почты) из формы и добавит ее на соответствующие листы в алфавитном порядке.Здесь задействованы связанные ячейки, поэтому я не могу просто добавить это к основанию и отсортировать.Вместо этого он выполняет поиск в ячейке с фамилией на правильных листах, чтобы вставить строку в правильное местоположение.

В большинстве случаев это работало, как и ожидалось, до тех пор, пока я не столкнулся с, возможно, уникальной ситуацией, которую я могу 't выяснить.

По сути, у меня есть оператор if, проверяющий, является ли имя дубликатом, и впоследствии проверяющий, должно ли быть добавлено новое имя.

    For i = 2 To lastrow

        ''^^IF STATEMENT CHECKING FOR DUPLICATE^^''
        '''''''''''''''''''''''''''''''''''''''''''
        '''vvIF STATEMENT CHECKING TO ADD DATAvv'''

        ElseIf StrComp(lastname, searchl) = 1 And StrComp(lastname, searchl2) = -1 Then

            Sheets("Master List").Range("A" & i).Offset(1).EntireRow.Insert (xlDown)
            Sheets("Master List").Range("A" & i + 1).Value = firstname
            Sheets("Master List").Range("B" & i + 1).Value = lastname
            Sheets("Master List").Range("C" & i + 1).Value = fullname

Переменные searchl и searchl2 - это фамилии из строк поиска i и i + 1 соответственно.

Моя проблема в том, что когда я пытался добавить фамилию "Kralik", этопопытался вставить данные между фамилиями "Day" и "de Castro"

Первоначально я попытался сравнить имена, используя следующую строку кода:

ElseIf lastname > searchl And lastname < searchl2 Then

Это выполнило точноетак же, как код, изложенный выше.Затем я вставил точку останова и решил использовать метод StrComp для устранения неполадок.Сравнение «Kralik» с «Day» дало ожидаемые результаты, но проблема возникает при сравнении «Kralik» с «de Castro».По какой-то причине код думает, что «Kralik» меньше, чем «de Castro», и вводит оператор if, чтобы вставить данные в это место.Для меня еще более царапает мысль, что я открыл новую рабочую книгу и быстро набрал «Kralik» в A1, «de Castro» в A2 и формулу «= A1> A2» в A3.Формула дала результат ИСТИНА, чего я и ожидал от VBA.

РЕДАКТИРОВАТЬ: После дополнительных испытаний, я думаю, что это должно быть как-то связано с капитализацией «Kralik» против «де Кастро»«мой код работает, как и ожидалось, пока« k »в« Kralik »некапитализирован.Я буду использовать метод UCase для своих переменных и вернусь с результатами.

РЕДАКТИРОВАТЬ 2: Использование UCase также работает.Ниже приведен ответ GSerg о том, почему мой оригинальный метод не работал.

1 Ответ

2 голосов
/ 29 апреля 2019

В формулах Excel по умолчанию используются сравнения без учета регистра.
VBA по умолчанию использует регистрозависимые сравнения.

Если вы хотите сравнения без учета регистра, либо введите

Option Compare Text

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

ElseIf StrComp(lastname, searchl, vbTextCompare) = 1 And StrComp(lastname, searchl2, vbTextCompare) = -1 Then

Кроме того, вы должны использовать бинарный поиск в вашем конкретном случае, чтобы найти позицию для вставки. MATCH с match_type = 1 вернет вам позицию в отсортированном списке, куда должно идти значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...