首页 > 解决方案 > 使用工作表中的输入值来引用不同的工作表 vba

问题描述

我正在尝试在 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

标签: excelvba

解决方案


蒂姆威廉姆斯给你答案

这里我再给你一些建议

代码 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

在哪里

  • 将数组调光移到循环之外,以免调暗lastrowInputs时间……</li>
  • 使用了一个For … Next循环来更多地处理你的情况(做你需要的,清楚地做,用更少的陈述)

但是这种表格列表容易出现一些缺点,例如列表中的名称不再实际。对于哪种情况你可以考虑

代码 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”中的工作表名称列表可能并不详尽……</p>

如您所见,保留和使用这样的列表可能比一开始看起来要困难得多:这是关注您真正需要的内容以及原因的问题


推荐阅读