Для цикла с несмежным диапазоном - PullRequest
0 голосов
/ 02 марта 2009

У меня есть цикл, который проходит через каждый столбец и устанавливает значение в R1C1 сумму нескольких строк над ним. Я использую цикл for, но я хочу пропустить несколько столбцов, поскольку они содержат формулы уже в ячейке. Как я могу настроить цикл, который только циклически перебирает несмежные наборы или числа?

Для справки, я хочу, чтобы он просматривал столбцы 1–80, но пропускал столбцы 25, 36, 37, 44, 60, 63, 64, 67, 68, 73, 75 и 76.

Редактировать: спасибо, ребята, но у меня это уже работает, как вы описали; Я искал более короткий и более элегантный метод.

Редактировать 2: Это даже VBA?!

Ответы [ 6 ]

4 голосов
/ 02 марта 2009

VBA-версия Learning's C # answer: -

Dim col As Integer: For col = 1 To 70

    Select Case col

    Case 25, 36, 37, 44, 60, 63, 64, 67, 68, 73, 75, 76
        'do nothing'

    Case Else
        'do something'

    End Select

Next col
1 голос
/ 02 марта 2009

Вы можете установить массив, содержащий номера столбцов, которые нужно обработать.

Ваш цикл может затем перебирать значения массива.

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

Еще одно решение состоит в том, если вы можете определить в цикле, является ли столбец столбцом, который нужно пропустить (обнаружив формулу, которая там есть).

1 голос
/ 02 марта 2009
  for i = 1 to 70
  {
    switch (i)
    {
      case 25, 36, 37, 44, 60, 63, 64, 67, 68, 73, 75 76 : break;
      default : // process break;
    }
  }
1 голос
/ 02 марта 2009

вы можете поместить if в начало вашего цикла и пропустить столбцы, которые вы не хотите перебирать

1 голос
/ 02 марта 2009

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

for i = 1 to 70
    skipIt = false
    skipIt = skipIt or (i = 25)
    : : :
    skipIt = skipIt or (i = 76)
    if not skipIt then
        ' Put your body here. '
    end if
next

Или вы можете сразу перейти к следующему:

for i = 1 to 70
    if i = 25 goto nextIter
    : : :
    if i = 76 goto nextIter

    ' Put your body here. '
nextIter:
next
0 голосов
/ 09 марта 2009

Этот подход использует функциональность объекта диапазона Excel.

Определите диапазон, используя метод UNION в Excel, чтобы он был диапазоном несмежных столбцов.

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

Функция LoopColumns () Dim Target As Range Dim Cell As Range

'Создание объекта диапазона на основе объединения нужных вам столбцов. Установить цель = объединение (диапазон («A: D»), диапазон («F: G»), диапазон («J: L»), диапазон («P: Q»))

'Если вы хотите обрабатывать только формулы, снова уменьшите диапазон, но Excel определяет диапазон как только те ячейки, которые содержат формулу Set Target = Target.SpecialCells (xlCellTypeFormulas, 1)

For Each Cell In Target.Cells
    'process cells here...
Next Cell

Функция завершения

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