2009-03-02 5 views
0

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

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

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

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

+0

Где Joel Сполски когда ему нужно. –

+0

Кто сказал, что мы нуждаемся в нем? – Ikke

+0

Я единственный, кто заметил, что Q'er хочет итерации от 1 до 70, но пропустить 73, 75 и 76 ?? – paxdiablo

ответ

4

VBA версии C# ответ обучения в: -

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 
+0

Я нахожу массив, в котором вы ставите кол-во столбцов проще для поддержания и лучшего кодостиля. Кодекса, которая ничего не делает, на самом деле не очень хороша. – Ikke

+0

@Ikke: Вы всегда можете опубликовать свой собственный ответ. ;-) Изменение кода для включения, а не на основе исключения, тривиально. Кодовый путь, который * активно * ничего не делает, не плохо, ИМХО. Делать ничего неявно (например, предложение else else) хуже. – Tomalak

+0

Я думаю, что «активное ничего» в порядке; Я хотел бы увидеть комментарий, в котором говорится, почему, например «Пропустить эти случаи, поскольку эти ячейки будут пустыми», но даже «ничего не делать» подразумевает намерение (так что вы знаете, что пустой случай не является ошибкой). – paxdiablo

1

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

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

Вы действительно хотите рекомендовать GoTo? Конечно, это работает, но ... – Tomalak

+0

Я не рекомендую это, просто говорю, что это возможность. И GOTO часто оскорблен без уважительной причины. Это чрезмерное использование, которое приводит к коду спагетти, что является злом. Единственная цель goto, такая как второй пример, ничем не отличается от определения конца if if if. – paxdiablo

1

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

1
for i = 1 to 70 
    { 
    switch (i) 
    { 
     case 25, 36, 37, 44, 60, 63, 64, 67, 68, 73, 75 76 : break; 
     default : // process break; 
    } 
    } 
+0

Я считаю, что это не VBA. – Tomalak

+0

true ... я просто подумал о потоке и забыл язык :( – Learning

+0

Вы были не слишком далеко, хотя. ;-) – Tomalak

1

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

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

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

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

+0

+1 для массива. Самый простой способ поддерживать. – Ikke

+0

@ Renze de Waal: массивы - это боль, которую можно использовать в VBA. Ваше предложение (ваша петля может тогда петля ...) будет O (n²) без уважительной причины. Предварительная сборка массива с булевыми элементами потребует, чтобы вы знали все значения заранее, а не только те, которые вы хотите исключить, или создаете ситуацию с индексом вне пределов. – Tomalak

+0

Из интереса, как бы я мог легко настроить массив с номерами столбцов? Без наличия cols = Array (1,2,3,4 ... 23, 26, 27, ...) и т. Д., Очевидно. Есть ли способ заставить его принять Array (1:23, 26:35 ...) и т. Д.? –

0

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

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

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

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

'Создание объекта диапазона на основе Союза столбцов вы хотите Set Target = Union (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 

End Function

Смежные вопросы