Макрос VBA копирует неверные данные в ячейку - PullRequest
2 голосов
/ 12 мая 2011

Вот что я пытаюсь сделать:

Если J содержит слово Ответчик А также Если F содержит слово выкупа затем Если G содержит "V ESTATE OF" Тогда держите все справа от "OF" Иначе, если G содержит "VS" Тогда держите все справа от "VS" Иначе, если G содержит «V» (обратите внимание на пробелы до и после V) Затем держите все справа от буквы "V"

Если K содержит "" (два последовательных пробела) Тогда держи это Или же Если K содержит «НЕИЗВЕСТНЫЙ ВЫСТУПЛЕНИЕ» Затем удалите самый последний символ ячейки, который будет запятой И если клетка начинается с подчеркивания Тогда удали это Тогда держи это

Присвойте результат G соответствующей ячейке N Присвойте результат K соответствующей ячейке O

Вот что я сделал:

Sub Inspect()

Dim RENums As Object
Dim RENums2 As Object
Dim LValue  As String
Dim LValue2  As String


Set RENums = CreateObject("VBScript.RegExp")
Set RENums2 = CreateObject("VBScript.RegExp")


RENums.Pattern = "DEFENDANT"
RENums2.Pattern = "FORECLOSURE"


  Dim lngLastRow As Long
  lngLastRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row


  Dim i

  For i = 1 To lngLastRow

    If RENums2.test(Range("F" & i).Value) Then

      If RENums.test(Range("J" & i).Value) Then

          pos = InStr(Range("G" & i), " V ")

          pos2 = InStr(Range("G" & i), " VS ")

          pos3 = InStr(Range("G" & i), " V ESTATE OF ")

          dbspace = InStr(Range("K" & i), "  ")

          If pos3 <> 0 Then
             LValue2 = Right(Range("G" & i), Len(Range("G" & i)) - pos * 2)
          ElseIf pos <> 0 Then
             LValue2 = Right(Range("G" & i), Len(Range("G" & i)) - pos - 2)
          ElseIf pos2 <> 0 Then
            LValue2 = Right(Range("G" & i), Len(Range("G" & i)) - pos - 2)
          End If

          If dbspace <> 0 Then
            LValue = Range("K" & i)
          End If


            schr = Right(LValue, 1)
            If schr = "_" Then
              With WorksheetFunction
               Range("N" & i).Value = Trim(.Substitute(LValue, "_", ""))
              End With
            Else
              Range("N" & i).Value = Trim(LValue)
            End If
            Range("O" & i).Value = Trim(LValue2)


      End If
    End If

  Next i

End Sub

В приведенном выше макросе в некоторых случаях правильное значение никогда не вставляется в N. Скорее, значение из другой ячейки в K вставляется в неправильную ячейку в N.

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

http://www.excelforum.com/excel-programming/775695-wrong-data-copied-into-new-cell-from-macro.html

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

Ответы [ 2 ]

1 голос
/ 12 мая 2011

При проверке подчеркивания вы проверяете, является ли символ последний подчеркиванием. В вашем вопросе говорится, что вы хотите проверить, начинается ли значение со знака подчеркивания.

schr = Right(LValue, 1)
    If schr = "_" Then

Попробуйте

schr = Left(LValue, 1)
    If schr = "_" Then
1 голос
/ 12 мая 2011

Ваши переменные LValue и LValue2 заполняются условно (т. Е. Не каждый раз в цикле), но ваш последний блок выполняется КАЖДЫЙ ВРЕМЯ, поэтому понятно, что несколько раз в цикле вы используете old значение LValue или LValue2 (или оба).

Вам необходимо очистить их в начале цикла, или же в вашем LValue и LValue2 * 1006 есть предложение ELSE* блоки, отвечающие за этот сценарий.

Редактирование на основе вашего комментария : в этом сценарии я предпочитаю использовать от MID() до RIGHT(), что упрощает понимание математики, так как мы считаем слева (это значение, которое возвращает InStr()):

cellText = Range("K" & i).Value
LValue = Mid(cellText, Unknown + 18, 100)

Несколько дополнительных примечаний:

  • Вы используете его много разпоместите проверенное значение в переменную, как я делал выше.Это может быть даже немного быстрее, вместо того, чтобы каждый раз возвращаться к рабочему листу.
  • Я предпочитаю использовать от Cells(11, i).Value до Range("K" & i).Value.Работает так же, но намного проще в использовании с переменными номерами строк или столбцов.
  • Это , обычно работает так, как вы это сделали, но обязательно используйте правильное свойство объекта диапазона (Range().Value или Range().Formula или что-то еще) вместо того, чтобы просто полагаться на "свойство по умолчанию", чтобы всегда быть правильным.
...