Фрагмент кода не обрабатывает MS Excel VBA - PullRequest
0 голосов
/ 31 августа 2018

У меня есть макрос с 1300+ строками VBA, который делает многое в электронной таблице. Последние несколько команд скопированы ниже.

Раздел «Сравнить город» всегда работает, раздел «Сравнить АДРЕС» всегда работает. «Сравнить ГОСУДАРСТВО» никогда не работает.

«Сравнить СОСТОЯНИЕ» работает, только если я запускаю его в отдельном макросе. (Само по себе) Или он запускается, если я перемещаю его в другой раздел (в начале кода, или в середине кода и т. Д.), Но он работает только при первом запуске. Если я открываю новый файл, City, Address, Zip работают (они делают то же самое, что и «STATE», но в разных столбцах.), Но логика STATE не работает.

Я не получаю сообщения об ошибках. Он просто не копирует Not Null в пустую ячейку.

Есть идеи почему?

Спасибо

'Сравните СОСТОЯНИЕ слева и справа. Если оба пустые или полные, никаких действий. Если один пустой другой полный, скопируйте в пустой.

For x = 2 To RowsInFile

    LeftCell = "G" & x
    RightCell = "FN" & x


        If IsEmpty(Range(LeftCell)) = True And IsEmpty(Range(RightCell)) = False Then
                Range(RightCell).Select
                Application.CutCopyMode = False
                Selection.Copy
                Range(LeftCell).Select
                ActiveSheet.Paste

        ElseIf IsEmpty(Range(LeftCell)) = False And IsEmpty(Range(RightCell)) = True Then
                Range(LeftCell).Select
                Application.CutCopyMode = False
                Selection.Copy
                Range(RightCell).Select
                ActiveSheet.Paste
        End If
Next x

'Сравните CITY слева и справа. Если оба пустые или полные, никаких действий. Если один пустой другой заполнен, скопируйте в пустой.

For x = 2 To RowsInFile

    LeftCell = "F" & x
    RightCell = "FM" & x


        If IsEmpty(Range(LeftCell)) = True And IsEmpty(Range(RightCell)) = False Then
                Range(RightCell).Select
                Application.CutCopyMode = False
                Selection.Copy
                Range(LeftCell).Select
                ActiveSheet.Paste

        ElseIf IsEmpty(Range(LeftCell)) = False And IsEmpty(Range(RightCell)) = True Then
                Range(LeftCell).Select
                Application.CutCopyMode = False
                Selection.Copy
                Range(RightCell).Select
                ActiveSheet.Paste
        End If
Next x

'Сравните АДРЕС слева и справа. Если оба пустые или полные, никаких действий. Если один пустой другой полный, скопируйте в пустой.

For x = 2 To RowsInFile

    LeftCell = "D" & x
    RightCell = "FL" & x


        If IsEmpty(Range(LeftCell)) = True And IsEmpty(Range(RightCell)) = False Then
                Range(RightCell).Select
                Application.CutCopyMode = False
                Selection.Copy
                Range(LeftCell).Select
                ActiveSheet.Paste

        ElseIf IsEmpty(Range(LeftCell)) = False And IsEmpty(Range(RightCell)) = True Then
                Range(LeftCell).Select
                Application.CutCopyMode = False
                Selection.Copy
                Range(RightCell).Select
                ActiveSheet.Paste
        End If
Next x

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Не так уж много информации, но попробуйте что-то вроде этого.

Если копирование форматирования не важно:

Dim x As Integer
Dim LeftCellColumn As Integer
Dim RightCellColumn As Integer

LeftCellColumn = Range("G" & 1).Column
RightCellColumn = Range("FN" & 1).Column

For x = 2 To RowsInFile
    With ActiveSheet
        If IsEmpty(.Cells(x, LeftCellColumn)) = True And IsEmpty(.Cells(x, RightCellColumn)) = False Then

                .Cells(x, LeftCellColumn).Value = .Cells(x, RightCellColumn).Value

        ElseIf IsEmpty(.Cells(x, LeftCellColumn)) = False And IsEmpty(.Cells(x, RightCellColumn)) = True Then

                 .Cells(x, RightCellColumn).Value = .Cells(x, LeftCellColumn).Value
        End If
    End With
Next x

В качестве альтернативы, если вы хотите это форматирование:

Dim x As Integer
Dim LeftCellColumn As Integer
Dim RightCellColumn As Integer

LeftCellColumn = Range("G" & 1).Column
RightCellColumn = Range("FN" & 1).Column

For x = 2 To RowsInFile
    With ActiveSheet
        If IsEmpty(.Cells(x, LeftCellColumn)) = True And IsEmpty(.Cells(x, RightCellColumn)) = False Then

                .Range(.Cells(x, RightCellColumn), .Cells(x, RightCellColumn)).Copy .Range(.Cells(x, LeftCellColumn), .Cells(x, LeftCellColumn))

        ElseIf IsEmpty(.Cells(x, LeftCellColumn)) = False And IsEmpty(.Cells(x, RightCellColumn)) = True Then

                .Range(.Cells(x, LeftCellColumn), .Cells(x, LeftCellColumn)).Copy .Range(.Cells(x, RightCellColumn), .Cells(x, RightCellColumn))
        End If
    End With
Next x

Если это не решит вашу проблему, то предоставление нам данных, которые вы добавите в эти формулы, поможет.

Кстати, в первом коде, который «с ActiveSheet» не был необходим, во втором он не хотел работать без этого. Вы можете изменить этот «ActiveSheet» на «WorkSheets (1)» или «WorkSheets (« Name »).

0 голосов
/ 31 августа 2018
  1. Нет необходимости циклически повторять одни и те же значения x несколько раз. Просто вложите все в одну и ту же петлю.
  2. Укажите каждый экземпляр Range на листе. With / End With блок будет здесь справедливым
  3. Вам не нужно Select ячейка, чтобы переместить, изменить или удалить ее. Это означает, что вам также не нужно полагаться на Active или Selection. Все их экземпляры были удалены здесь
  4. Вы можете установить значения, равные друг другу, что ускорит процесс (чем больше значение RowsInFile, тем больше выгоды вы увидите)
  5. Вы можете сделать это умеренно проще, просто протестировав, если диапазон пуст, с vbNullString или "", например, (If Range(?) = vbNullString Then или If Range(?) = "" Then
  6. Application.CutCopyMode = False просто занимает здесь место. Вы можете удалить все экземпляры этого кода и оставить эту строку один раз прямо перед End Sub

For x = 2 To RowsInFile

    If IsEmpty(Range("G" & x)) = True And IsEmpty(Range("FN" & x)) = False Then
        Range("G" & x).Value = Range("FN" & x).Value
    ElseIf IsEmpty(Range("G" & x)) = False And IsEmpty(Range("FN" & x)) = True Then
        Range("FN" & x).Value = Range("G" & x).Value
    End If

    If IsEmpty(Range("F" & x)) = True And IsEmpty(Range("FM" & x)) = False Then
        Range("F" & x).Value = Range("FM" & x).Value
    ElseIf IsEmpty(Range("F" & x)) = False And IsEmpty(Range("FM" & x)) = True Then
        Range("FM" & x).Value = Range("F" & x).Value
    End If

    If IsEmpty(Range("D" & x)) = True And IsEmpty(Range("FL" & x)) = False Then
        Range("FL" & x).Value = Range("D" & x).Value
    ElseIf IsEmpty(Range("D" & x)) = False And IsEmpty(Range("FL" & x)) = True Then
        Range("FL" & x).Value = Range("D" & x).Value
    End If

Next x

  1. Добро пожаловать в Переполнение стека . Спасибо, что поделились кодом в своем первом посте! Вы отлично стартуете
...