Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 您知道在Excel VBA中直接选择阵列中已有的多个工作表的方法吗?_Arrays_Excel_Vba_Select_Worksheet - Fatal编程技术网

Arrays 您知道在Excel VBA中直接选择阵列中已有的多个工作表的方法吗?

Arrays 您知道在Excel VBA中直接选择阵列中已有的多个工作表的方法吗?,arrays,excel,vba,select,worksheet,Arrays,Excel,Vba,Select,Worksheet,我有一段代码,可以从工作表中创建数量可变的副本。 每个新副本都被设置为数组中的下一个工作表类型变量: Dim wsv() as Worksheet Dim ddf as Integer, i as Integer 'After some processing, ddf will define the number of copies required, 'therefore the size of the array. 'ws is the original worksheet from w

我有一段代码,可以从工作表中创建数量可变的副本。 每个新副本都被设置为数组中的下一个工作表类型变量:

Dim wsv() as Worksheet
Dim ddf as Integer, i as Integer

'After some processing, ddf will define the number of copies required,
'therefore the size of the array.

'ws is the original worksheet from which the copies will be made

If ddf > 0 then

    ReDim wsv(0 to ddf) as Worksheet
    
    For i = 0 to ddf
        ws.Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
        Set wsv(i) = ThisWorkbook.ActiveSheet
    Next i

End if
我需要在最后选择所有这些新工作表,以便将它们导出为单个PDF

我曾经使用过
ThisWorkbook.Sheets(数组(“Sheet1”、“Sheet2”、“Sheet3”))。在要选择的工作表的数量/名称已知的情况下选择
,我希望
ThisWorkbook.Sheets(wsv)。选择
ThisWorkbook.Sheets(数组(wsv))。选择
在这个特定的工作表中有效,但它们不起作用

您知道如何利用阵列中已存在的所有需要选择的图纸来实现这一点吗

更新:

我需要改为使用字符串数组,因为这就是
thiswoolk.Sheets(数组(“Sheet1”、“Sheet2”、“Sheet3”)。选择
。
感谢@BigBen和@vbasic208的帮助

工作表数组
  • 函数
    createWorksheetsArray
    是一种混合函数。它创建新的工作表,就像
    那样,并返回新创建工作表的工作表名称数组,就像
    函数
    那样

  • 过程
    testCreateWorksheetsArray
    将三个工作表添加到包含此代码的工作簿(
    thiswoolk
    ),返回数组中的三个名称,其内容将打印到
    即时窗口
    CTRL+G,然后“一次性”删除所有三个工作表

  • 与其删除,不如执行以下操作:

    wb.Worksheets(wsv).Select
    ActiveSheet.ExportAsFixedFormat...
    
新版本

Option Explicit

Sub addWorksheetCopies(Sheet As Worksheet, _
                       Optional ByVal NumberOfCopies As Long = 1)
    
    If Sheet Is Nothing Then
        GoTo ProcExit
    End If
    
    If NumberOfCopies < 1 Then
        GoTo ProcExit
    End If
    
    With Sheet
        Dim n As Long
        For n = 1 To NumberOfCopies
            .Copy After:=.Parent.Sheets(.Parent.Sheets.Count)
        Next n
    End With

ProcExit:

End Sub

Function getLastWorkSheetNames(Book As Workbook, _
                               Optional ByVal NumberOfWorksheets As Long) _
         As Variant
    
    Dim wsCounter As Long
    wsCounter = NumberOfWorksheets
    Dim Data As Variant
    ReDim Data(1 To wsCounter)
    Dim shCounter As Long
    shCounter = Book.Sheets.Count
    
    Dim sh As Object
    Do
        Set sh = Book.Sheets(shCounter)
        If sh.Type = xlWorksheet Then
            Data(wsCounter) = sh.Name
            wsCounter = wsCounter - 1
            shCounter = shCounter - 1
        End If
    Loop Until wsCounter = 0
    getLastWorkSheetNames = Data

ProcExit:

End Function

Sub testBoth()
    
    Const NumberOfCopies As Long = 3
    
    ' Define workbook.
    Dim wb As Workbook
    Set wb = ThisWorkbook
    
    ' Define Source Worksheet ('ws').
    Dim ws As Worksheet
    Set ws = wb.Worksheets("Sheet1")
    
    ' Create copies of Source Worksheet.
    addWorksheetCopies ws, NumberOfCopies
    
    ' Write the names of the copies to Worksheets Array ('wsv').
    Dim wsv As Variant
    wsv = getLastWorkSheetNames(wb, NumberOfCopies)
    If IsEmpty(wsv) Then
        GoTo ProcExit
    End If
    
    ' Status:
    ' You have created your copies of worksheet ws,
    ' and the array wsv contains the names of the copied worksheets.
    ' Continue...
    
    ' e.g.
    Dim n As Long
    For n = LBound(wsv) To UBound(wsv)
        Debug.Print wsv(n)
    Next n
    
    Application.DisplayAlerts = False
    wb.Worksheets(wsv).Delete
    Application.DisplayAlerts = True
    
ProcExit:
    
End Sub
选项显式
子添加工作表副本(作为工作表的工作表_
可选ByVal NumberOfCopy(长度=1)
如果床单什么都不是
转到出口
如果结束
如果NumberOfCopies<1,则
转到出口
如果结束
用床单
长
对于n=1至份数
.Copy After:=.Parent.Sheets(.Parent.Sheets.Count)
下一个
以
程序出口:
端接头
函数getLastWorkSheetNames(作为工作簿的书本_
可选ByVal NumberOfWorksheets(尽可能长)_
作为变体
把计数器调暗一样长
wsCounter=工作表的数量
作为变量的Dim数据
重拨数据(1到wsCounter)
暗色和暗色一样长
shCounter=Book.Sheets.Count
将sh作为对象
做
设置sh=书本页(shCounter)
如果sh.Type=xl,则
数据(wsCounter)=sh.名称
wsCounter=wsCounter-1
shCounter=shCounter-1
如果结束
循环直到wsCounter=0
getLastWorkSheetNames=数据
程序出口:
端函数
子测试二者()
常数NumberOfCopies,长度=3
'定义工作簿。
将wb设置为工作簿
设置wb=ThisWorkbook
'定义源工作表('ws')。
将ws设置为工作表
设置ws=wb.工作表(“表1”)
'创建源工作表的副本。
添加工作表副本ws,份数
'将副本的名称写入工作表数组('wsv')。
变光wsv
wsv=getLastWorkSheetNames(wb,份数)
如果我是空的(wsv),那么
转到出口
如果结束
“地位:
'您已经创建了工作表ws的副本,
'并且数组wsv包含复制的工作表的名称。
“继续。。。
”“例如。
长
对于n=LBound(wsv)到UBound(wsv)
调试.打印wsv(n)
下一个
Application.DisplayAlerts=False
wb.工作表(wsv).删除
Application.DisplayAlerts=True
程序出口:
端接头
代码气味版本(不推荐)

函数createWorksheetsArray(SourceWorksheet作为工作表_
可选ByVal NumberOfCopy(长度=1)_
作为变体
如果SourceWorksheet什么都不是,那么
转到出口
如果结束
如果NumberOfCopies<1,则
转到出口
如果结束
作为变量的Dim数据
重拨数据(1到份数)
使用SourceWorksheet
长
对于n=1至份数
.Copy After:=.Parent.Sheets(.Parent.Sheets.Count)
数据(n)=.Parent.ActiveSheet.Name
下一个
以
createWorksheetsArray=数据
程序出口:
端函数
子测试创建工作表阵列()
将wb设置为工作簿
设置wb=ThisWorkbook
将ws设置为工作表
设置ws=wb.工作表(“表1”)
变光wsv
wsv=创建工作表阵列(ws,3)
如果我是空的(wsv),那么
转到出口
如果结束
长
对于n=LBound(wsv)到UBound(wsv)
调试.打印wsv(n)
下一个
Application.DisplayAlerts=False
wb.工作表(wsv).删除
Application.DisplayAlerts=True
程序出口:
端接头
工作表数组
  • 函数
    createWorksheetsArray
    是一种混合函数。它创建新的工作表,就像
    那样,并返回新创建工作表的工作表名称数组,就像
    函数
    那样

  • 过程
    testCreateWorksheetsArray
    将三个工作表添加到包含此代码的工作簿(
    thiswoolk
    ),返回数组中的三个名称,其内容将打印到
    即时窗口
    CTRL+G,然后“一次性”删除所有三个工作表

  • 与其删除,不如执行以下操作:

    wb.Worksheets(wsv).Select
    ActiveSheet.ExportAsFixedFormat...
    
新版本

Option Explicit

Sub addWorksheetCopies(Sheet As Worksheet, _
                       Optional ByVal NumberOfCopies As Long = 1)
    
    If Sheet Is Nothing Then
        GoTo ProcExit
    End If
    
    If NumberOfCopies < 1 Then
        GoTo ProcExit
    End If
    
    With Sheet
        Dim n As Long
        For n = 1 To NumberOfCopies
            .Copy After:=.Parent.Sheets(.Parent.Sheets.Count)
        Next n
    End With

ProcExit:

End Sub

Function getLastWorkSheetNames(Book As Workbook, _
                               Optional ByVal NumberOfWorksheets As Long) _
         As Variant
    
    Dim wsCounter As Long
    wsCounter = NumberOfWorksheets
    Dim Data As Variant
    ReDim Data(1 To wsCounter)
    Dim shCounter As Long
    shCounter = Book.Sheets.Count
    
    Dim sh As Object
    Do
        Set sh = Book.Sheets(shCounter)
        If sh.Type = xlWorksheet Then
            Data(wsCounter) = sh.Name
            wsCounter = wsCounter - 1
            shCounter = shCounter - 1
        End If
    Loop Until wsCounter = 0
    getLastWorkSheetNames = Data

ProcExit:

End Function

Sub testBoth()
    
    Const NumberOfCopies As Long = 3
    
    ' Define workbook.
    Dim wb As Workbook
    Set wb = ThisWorkbook
    
    ' Define Source Worksheet ('ws').
    Dim ws As Worksheet
    Set ws = wb.Worksheets("Sheet1")
    
    ' Create copies of Source Worksheet.
    addWorksheetCopies ws, NumberOfCopies
    
    ' Write the names of the copies to Worksheets Array ('wsv').
    Dim wsv As Variant
    wsv = getLastWorkSheetNames(wb, NumberOfCopies)
    If IsEmpty(wsv) Then
        GoTo ProcExit
    End If
    
    ' Status:
    ' You have created your copies of worksheet ws,
    ' and the array wsv contains the names of the copied worksheets.
    ' Continue...
    
    ' e.g.
    Dim n As Long
    For n = LBound(wsv) To UBound(wsv)
        Debug.Print wsv(n)
    Next n
    
    Application.DisplayAlerts = False
    wb.Worksheets(wsv).Delete
    Application.DisplayAlerts = True
    
ProcExit:
    
End Sub
选项显式
子添加工作表副本(作为工作表的工作表_
可选ByVal NumberOfCopy(长度=1)
如果床单什么都不是
转到出口
如果结束
如果号码
    Sub SelectViaCodeNames()
    Dim wsCodes: wsCodes = Array(Tabelle1, Tabelle2): If UBound(wsCodes) = -1 Then Exit Sub
    'a) select first sheet thus removing any prior selection
        Dim i As Long: i = LBound(wsCodes)
        wsCodes(i).Select
    'b) select next items
        For i = i + 1 To UBound(wsCodes)
            With wsCodes(i)
                'add to existing  selection
                .Select (False)
            
                'do further stuff
                '...
            End With
        Next i
    End Sub