Макрос VBA копирует одни и те же данные в каждую ячейку - PullRequest
0 голосов
/ 21 июля 2011

У меня есть этот макрос:

Sub StringChecker()

Dim string_arr() As Variant
Dim k As Integer

Dim c As Range
Set c = ActiveSheet.[A1]

end_string = Array(" &", _
            " TR", _
            " SR", _
            " DEFEN")

substring = Array(" SR ", _
            " JR ")

Do While c <> "End Loop"

   c.Offset(0, 1) = c

   For k = 0 To UBound(end_string)

      If Right(c, Len(end_string(k))) = end_string(k) Then
          cleaner_string = Mid(c, 1, Len(c) - Len(end_string(k)))

      End If


   Next k
   clean_string = cleaner_string
   For l = 0 To UBound(substring)
        clean_string = Replace(clean_string, substring(l), " ")
    Next l

    If clean_string = "" Then
            clean_string = c
    End If
    c.Offset(0, 1) = clean_string
   Set c = c.Offset(1, 0)

Loop



End Sub

Проблема в том, что, когда он находит в массиве символ, соответствующий текущей итерации строки, он в итоге копирует эту строку в каждую итерацию ячейки после этого.

Вот пример вывода:

 Owner1                 Owner1
BURDINES 1225 LLC           BURDINES 1225 LLC
MIAMI-DADE COUNTY           MIAMI-DADE COUNTY
RELATED GROUP OF FLORIDA &  RELATED GROUP OF FLORIDA
BURDINES 1225 LLC           RELATED GROUP OF FLORIDA
CITY OF MIAMI DEPT OF P & D RELATED GROUP OF FLORIDA
MIAMI-DADE COUNTY           RELATED GROUP OF FLORIDA
FEC R R CO                  RELATED GROUP OF FLORIDA
BDG 200 SOUTH MIAMI AVE LLC RELATED GROUP OF FLORIDA
STATE OF FLORIDA DOT    RELATED GROUP OF FLORIDA

Он копирует RELATED GROUP OF FLORIDA во время каждой итерации после того, как обнаруживает, что эта ячейка заканчивается символом &, который был частью нашего массива end_string.То же самое может происходить с массивом подстрок.Я внимательно посмотрел на это, и я не уверен, почему это происходит.Предполагается удалить все символы в ячейке, которые были найдены в массиве end_string и substring, и скопировать их в новую ячейку.Если индексы из массива не были найдены в строке, то он просто копирует исходную строку в столбец B. Также я использую строку «Конец цикла», потому что не могу проверить пустую строку, поскольку может быть 4 или 5 пустых ячеек.в столбце a ранее есть еще одна ячейка с содержимым, поэтому я не хочу, чтобы итерация просто остановилась только потому, что одна ячейка была пустой.

Спасибо за ответ

1 Ответ

1 голос
/ 21 июля 2011

Вам нужно протирать строку очистителя в начале каждого прохода через цикл. В противном случае он сохраняет свое значение с последнего раза, и если ячейка не соответствует критериям для редактирования строки очистителя, строка очистки становится строкой очистки (которая была строкой очистки последней итерации), поэтому строка очистки никогда не будет "". Имеет ли это смысл?

EDIT

Чтобы сделать это более понятным:

Если ячейка, на которую вы смотрите, не соответствует критериям редактирования, для строки-очистителя никогда не устанавливается ничего нового. Так что, если в последний раз было задано значение, оно все равно имеет это значение. Таким образом, когда вы говорите

cleanstring = cleanerstring

если для строки-очистителя никогда не задавалось ничего нового, строка-чистка теперь имеет значение строки-уборщика с последнего раза. Cleanstring теперь очищается в вашем коде форматирования, и когда вы затем проверяете, если

cleanstring = ""

вы оцениваете как ложное, потому что cleanstring - это строка в последний раз, очищенная снова. Таким образом, чистая строка не сбрасывается в c, поэтому

c.Offset(0, 1) = clean_string

устанавливает ячейку для очищенного текста с прошлого раза.

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