использование введенных значений в листе для ссылки на разные листы VBA - PullRequest
2 голосов
/ 01 апреля 2020

Я пытаюсь создать макрос в Excel, который берет значения ячеек из одной вкладки и создает ссылку на эти значения как рабочие таблицы в vba.

Пример списка рабочих таблиц может быть следующим (может быть длиннее или короче по длине):

sheet1
sheet2
sheet3
...

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

ws1= wb.Sheets("sheet1")
ws(i)= wb.Sheets("ws(i)")

Любая помощь для решения этой проблемы или рекомендации другого подхода будет принята с благодарностью!

Спасибо, М

Dim wb As Workbook: Set wb = ThisWorkbook
Dim wsInputsList As Worksheet
Set wsInputsList = wb.Sheets("InputsTab")

Dim lastrowInputs As Long
lastrowInputs = wsInputsList.Cells(Rows.Count, 1).End(xlUp).Row

Dim i As Integer
i = 1
Do While i < lastrowInputs
Dim ws(1 To 50) As Variant
ws(i) = wsInputsList.Cells(i + 1, 1).Value
i = i + 1
Loop

1 Ответ

1 голос
/ 01 апреля 2020

Тим Уильямс дал вам ответ

Здесь я дам вам еще несколько предложений

код 1

Option Explicit

Sub SetSheetList()

    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim wsInputsList As Worksheet: Set wsInputsList = wb.Sheets("InputsTab")

    Dim lastrowInputs As Long, i As Long
    lastrowInputs = wsInputsList.Cells(Rows.Count, 1).End(xlUp).Row
    ReDim ws(1 To lastrowInputs) As Worksheet 'dim your array only once
    For i = 1 To lastrowInputs
        Set ws(i) = wb.Sheets(wsInputsList.Cells(i, 1).Value)
    Next

End Sub

, куда

  • переехал затемнение массива за пределы l oop, чтобы не затемнять его lastrowInputs раз ...
  • использовал For … Next l oop, который в большей степени соответствует вашему делу (делает то, что вам нужно, делает это четко и в меньше заявлений)

, но листинг такого типа имеет некоторые недостатки, например, наличие в списке имени, которое более не актуально. В этом случае вы можете рассмотреть

Код 2

Option Explicit

Sub SetSheetList2()

    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim wsInputsList As Worksheet: Set wsInputsList = wb.Sheets("InputsTab")

    Dim shtName As String
    Dim lastrowInputs As Long, i As Long, nshts As Long

    lastrowInputs = wsInputsList.Cells(Rows.Count, 1).End(xlUp).Row
    ReDim ws(1 To lastrowInputs) As Worksheet 'dim your array only once

    For i = 1 To lastrowInputs
        shtName = wsInputsList.Cells(i, 1).Value ' store current "possible" sheet name
        If IsSheetThere(wb, shtName) Then  ' if current "possible" sheet name is an "actual" one
            nshts = nshts + 1 ' update sheet names found
            Set ws(nshts) = wb.Sheets(shtName) ' update sheets array
        End If
    Next
    If nshts < lastrowInputs Then ReDim Preserve ws(1 To nshts) As Worksheet 'redim your array to the actual number of items stored, if needed

End Sub

И все же есть шанс, что список имен ваших листов в "InputsTab" не является исчерпывающим ...

Как вы видите Хранить и использовать такой список может быть гораздо сложнее, чем может показаться вначале: нужно сосредоточиться на том, что вам действительно нужно и почему

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