VBA: как создать al oop, который может ссылаться на одну указанную c ячейку на разных листах - PullRequest
0 голосов
/ 16 января 2020

У меня есть 5 листов, и каждый лист представляет команду, начиная с команды 1 до команды 5. Теперь я хочу отослать одну указанную ячейку c для каждого листа и суммировать их в виде строки в моем активном листе (например: ae)

     Team 1 Team#2  Team#3  Team#4  Team#5   
         a        b      c       d       e

Мой код работает, но он слишком утомителен. Интересно, как я могу использовать al oop для замены следующего кода? Я думаю, мне нужен subl oop, один l oop для разных листов, другой l oop для разных столбцов для активных листов.

Sub Macro1()
Range("B3").Value = Sheet2.Range("C2")
End Sub

1 Ответ

0 голосов
/ 17 января 2020

Если вы предпочитаете не использовать фокусы ячеек, for each l oop - это хорошая точка для начала итерации по листам в вашей книге, с оператором if для управляющих листов, который следует игнорировать.

Dim ws As Worksheet
Set sum_ws = ActiveWorkbook.Worksheets("summary")
For Each ws In ActiveWorkbook.Worksheets
    If ws.Name <> "summary" Then
        ' rest of your code
    End If
Next ws

Отслеживать, какую ячейку вы заполняете в сводной таблице, немного сложнее. Если листы в вашей рабочей книге всегда будут в правильном порядке, вы можете объявить целое число и увеличивать его после каждого l oop и использовать его для ссылки на индекс столбца:

Dim ws As Worksheet
Dim sum_ws As Worksheet 'summary worksheet
Dim i As Integer

i = 1
For Each ws In ActiveWorkbook.Worksheets
    If ws.Name <> "summary" Then
        sum_ws.Cells(3, i).Value = ws.Range("B3").Value
        i = i + 1
    End If
Next ws

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

Dim ws As Worksheet
Dim sum_ws As Worksheet
Dim coll As New Collection

Dim t1 As Range 'team 1 summary cell
Dim t2 As Range 'team 2 summary cell
Dim t3 As Range 'team 3 summary cell

Set sum_ws = ActiveWorkbook.Worksheets("summary")
Set t1 = sum_ws.Range("A2")
Set t2 = sum_ws.Range("B2")
Set t3 = sum_ws.Range("C2")

coll.Add Item:=t1, Key:="team1" 'key same as sheet name
coll.Add Item:=t2, Key:="team2"
coll.Add Item:=t3, Key:="team3"

For Each ws In ActiveWorkbook.Worksheets
    If ws.Name <> "summary" Then
        coll(ws.Name) = ws.Range("B3").Value
    End If
Next ws

Надеюсь, это поможет.

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