Каков хороший способ создания группы переменного размера для зацикливания в Excel 2003? - PullRequest
0 голосов
/ 08 декабря 2008

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

Что-то, что мой босс предположил, может быть эффективным, - это создание списка (как в «Данные» -> «Списки»), который содержит имена рассматриваемых элементов, и затем повторение списка. К сожалению, мой фу справочного файла, кажется, подводит меня - я не знаю, просто не знаю, что искать или что.

Запуск команды «Сгенерировать макрос» показывает, что VBA для создания списка, в первую очередь, соответствует ActiveSheet.ListObjects.Add (xlSrcRange, Range ("$ A $ 1"), xlYes) .Name = "List1"

К сожалению, я не могу понять, как тогда делать вещи с результирующим списком. Я стремлюсь сделать цикл по линии

For Each ListItem in List 
    Run the procedure on the text in ListItem.Value
Next ListItem

Есть предложения?

Ответы [ 3 ]

2 голосов
/ 08 декабря 2008

Возможно, что-то в этих строках:

Dim Counter 'module level '

Sub RunSomeProc()
    Counter = 0
    '1st test '
    SomeProc

    '2nd Test skipped items'
    For Each c In Range("c1:c" & Counter)
        SomeProc
    Next

End Sub

Sub SomeProc()
For Each c In Range("NamedRange1")
    If SomeTest=SomeVal Then
        'Write to 2nd test range '
        Range("C1").Offset(Counter, 0) = c 'Value of cell'
        Counter = Counter + 1
    End If
Next
End Sub
0 голосов
/ 03 июля 2009

Мое возможное решение состояло в том, чтобы импортировать список как запрос внешних данных, который я затем назвал красиво и назвал диапазоном. Итак:

For each item in Sheets("Sheet1").Range("Range1")
    Do stuff
Next item
0 голосов
/ 08 декабря 2008

Вы можете повторить это следующим образом:

set rgList = Range("name_of_range")    
For i = 1 To rgList.Rows.Count
  ' Do something using rgList.Cells(i, 1)
  RunProcedure(rgList.Cells(i, 1))
Next i

Я предположил, что диапазон находится в столбце; если бы это было подряд, вы должны были выполнить итерацию по второму индексу.
Конечно, могут быть лучшие способы итерации по диапазону; Я использую это на небольшом скрипте, и работает вполне нормально.

...