Цикл только по первым ячейкам выбранных объединенных диапазонов - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь дать пользователю возможность выполнять простые арифметические операции с выбранными ячейками. Дело в том, что большинство ячеек являются объединенными диапазонами.

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

Sub test()
    Application.ScreenUpdating = False
    Dim cel As Range
    Dim selectedRange As Range
    myValue = InputBox("Enter")
    Set selectedRange = Application.Selection

    For Each cel In selectedRange.Cells
        On Error Resume Next
        cel.Value = Evaluate(cel.Value & myValue)
    Next cel
End Sub

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Хотя VBasic2008 ответ работает, он не совсем корректен. Проблема в том, что каждая ячейка в объединенном диапазоне всегда возвращает True для MergedCells свойства. Это означает, что чрезмерная обработка выполняется в цикле (то есть увеличивается значение) для ячеек, отличных от верхней левой ячейки. Чтобы исправить эту ситуацию, вы должны проверить каждую ячейку на необходимость обработки. Вы можете сделать это несколькими способами:

  1. Вы можете сравнить адрес ячейки с верхним левым адресом ячейки (Option 1 в коде).

  2. Вы можете проверить длину значения ячейки. Если это ноль, то это не верхняя левая ячейка, поэтому вы пропускаете ее (Option 2 в коде).

Код:

Sub IncrValues()

    Dim rng As Range, myValue%

    myValue = InputBox("Enter")

    For Each cell In Selection
        If cell.MergeCells Then
            '// Option 1:
            If cell.Address = cell.MergeArea(1).Address Then
                cell.Value = cell.Value + myValue
            End If
            '// Option 2:
            'If Len(cell) > 0 Then
            '    cell.Value = cell.Value + myValue
            'End If
        Else
            cell.Value = cell.Value + myValue
        End If
    Next

End Sub
0 голосов
/ 05 января 2019

Собственность MergeCells

Используя свойство MergeCells в операторе Если , вы проверяете, не объединена ли ячейка, затем выполняет следующие операторы, в противном случае оператор (ы) после остальное .

В следующем примере выбран диапазон I3: M12 , а 5 вводится как myValue . Первая таблица - это состояние второй таблицы до.

enter image description here

Код

Sub test()

    Dim cel As Range
    Dim selectedRange As Range
    Dim myValue As Double

    Application.ScreenUpdating = False

    myValue = InputBox("Enter")

    Set selectedRange = Application.Selection

    For Each cel In selectedRange.Cells
        If Not cel.MergeCells Then
            ' If not merged cell.
            cel.Value = Evaluate(cel.Value & myValue)
          Else
            ' if merged cell.
            cel.Value = Evaluate(cel.Value + myValue)
        End If
    Next cel

    Application.ScreenUpdating = True

End Sub

Count

Мы можем расширить предыдущие таблицы, добавив столбец COUNT ,

enter image description here

, где более очевидно, как объединенные ячейки «игнорируются» в Excel, т. Е. Все ячейки, кроме первой ячейки объединенной области, не будут учитываться (или суммироваться, или ...).

Ниже показано различие между подсчетом ячеек в VBA и в Excel.

Sub MergeTest()
    With Range("J3:J12")
        Debug.Print .Cells.Count
        Debug.Print WorksheetFunction.Count(.Cells)
    End With
    With Range("J3:N12")
        Debug.Print .Cells.Count
        Debug.Print WorksheetFunction.Count(.Cells)
    End With
End Sub

Результаты в окне Immediate:

10 , 9 * * тысяча пятьдесят-одина, 50 , 46

показывает, как VBA будет считать каждую ячейку, но Excel исключит все ячейки объединенной области, кроме первой.

В справке VBA найдите свойство MergeArea для получения дополнительной информации.

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