Как сделать Excel VBA перейти к следующей ячейке в цикле? - PullRequest
2 голосов
/ 16 февраля 2012

У меня здесь есть код для макроса, который выполняет выборку и перенос данных с одного листа на другой. Прямо сейчас этот код делает 90% того, что я хочу. Проблема в том, что если он встречает исходную ячейку, в которой ничего нет (следовательно, Len(cellVal) = 0 и cellVal = "", он перезаписывает ячейку назначения.

Вы увидите, что во втором блоке ElseIf есть комментарий. Прямо сейчас он не выравнивается, но если оператор оценивается как true, то есть в исходной ячейке ничего нет, я хочу, чтобы Excel перешел к следующей исходной ячейке БЕЗ изменения содержимого целевой ячейки.

Есть идеи, как этого достичь?

Franklin

For i = 7 To endPointFlash
    Dim cellVal As String
    cellVal = Cells(i, "G")

    If (Len(cellVal)) > 0 Then
        RawData.Activate
    ElseIf (Len(cellVal)) = 0 Or cellVal = "" Then
        ' need to tell excel to do nothing and move to the next cell
    End If

    For j = 1 To endPointRaw
        If cellVal = Mid(Cells(j, "A"), 1, Len(cellVal)) Then
            val2 = Mid(Cells(j, "A"), 1, Len(cellVal))
            val3 = Cells(j, "D")
            Flash.Cells(i, "H").Value = val3
            Exit For
        Else: Flash.Cells(i, "H").Value = 0
        End If
    Next j
Flash.Activate
Next i

Ответы [ 3 ]

3 голосов
/ 16 февраля 2012

Вот так:

For i = 7 To endPointFlash
    Dim cellVal As String
    cellVal = Cells(i, "G")

    If (Len(cellVal)) > 0 Then
        RawData.Activate
    ElseIf (Len(cellVal)) = 0 Or cellVal = "" Then
        ' need to tell excel to do nothing and move to the next cell
    Else
        For j = 1 To endPointRaw
            If cellVal = Mid(Cells(j, "A"), 1, Len(cellVal)) Then
                val2 = Mid(Cells(j, "A"), 1, Len(cellVal))
                val3 = Cells(j, "D")
                Flash.Cells(i, "H").Value = val3
                Exit For
            Else: Flash.Cells(i, "H").Value = 0
            End If
        Next j
    End If

Flash.Activate
Next i

Или вот так:

For i = 7 To endPointFlash
    Dim cellVal As String
    cellVal = Cells(i, "G")

    If (Len(cellVal)) > 0 Then
        RawData.Activate
    ElseIf (Len(cellVal)) = 0 Or cellVal = "" Then
        ' need to tell excel to do nothing and move to the next cell
        Goto NextLoop
    End If

    For j = 1 To endPointRaw
        If cellVal = Mid(Cells(j, "A"), 1, Len(cellVal)) Then
            val2 = Mid(Cells(j, "A"), 1, Len(cellVal))
            val3 = Cells(j, "D")
            Flash.Cells(i, "H").Value = val3
            Exit For
        Else: Flash.Cells(i, "H").Value = 0
        End If
    Next j
NextLoop:
Flash.Activate
Next i
2 голосов
/ 16 февраля 2012

Чтобы быть очень ясным и явным, я написал бы следующее:

Dim cellVal As String

For i = 7 To endPointFlash
    cellVal = Flash.Cells(i, "G")

    If Len(cellVal) = 0 Then
        ' Do nothing.
    Else
        For j = 1 To endPointRaw
            If cellVal = Mid(RawData.Cells(j, "A"), 1, Len(cellVal)) Then
                val2 = Mid(RawData.Cells(j, "A"), 1, Len(cellVal))
                val3 = RawData.Cells(j, "D")
                Flash.Cells(i, "H").Value = val3
                Exit For
            Else
                Flash.Cells(i, "H").Value = 0
            End If
        Next j
    End If

Next i

Здесь читателю довольно ясно, что ячейка, содержащая пустую строку, не должна приводить ни к каким действиям;во всех остальных случаях делайте следующее.

Также я не активирую каждый лист туда-сюда.Это делает ваш код медленным (и заставляет ваш экран мерцать).Вместо этого я идентифицирую каждый вызов Cells, используя правильное имя листа.Опять же, это очень четко показывает, где вы получаете вещи.

NB: cellVal = "" обязательно подразумевает Len(cellVal)) = 0, поэтому нет необходимости писать оба в вашем условном выражении.

0 голосов
/ 16 февраля 2012

Вы можете попробовать это (не уверен, что ваш Flash.Activate должен выполняться, когда ячейка пуста - если это так, переместите его ниже End If):

Dim cellVal As String

For i = 7 To endPointFlash
    cellVal = Cells(i, "G")

    If cellVal <> "" Then
      RawData.Activate

      For j = 1 To endPointRaw
          If cellVal = Mid(Cells(j, "A"), 1, Len(cellVal)) Then
              val2 = Mid(Cells(j, "A"), 1, Len(cellVal))
              val3 = Cells(j, "D")
              Flash.Cells(i, "H").Value = val3
              Exit For
          Else
              Flash.Cells(i, "H").Value = 0
          End If
      Next j

      Flash.Activate

    End If 'Else cell is empty: do nothing
Next i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...