excel拷贝相对应的sheet

拷贝对应的sheet之前做的是一次拷贝一张sheet,显然太低级,这次做了一个升级,一次可以拷贝n张sheet,并且根据名字自动匹配,将拷贝的报表名字显示在相应的单元格里。不过之前测试的选择性粘贴只拷贝数值而不拷贝链接并没有成功。

Option Explicit

'作者: 黄立
'邮箱: ekinasm@ gmail.com
'一次拷贝多张报表,自动匹配sheet名字

Const c_numOfWorkBook As Integer = 76       'workbook的数量
Const c_reportName As String = "xSAPtemp"
Const c_listRow As Long = 2              '显示报表拷贝清单的行号
Const c_listCol As Long = 7              '显示报表拷贝清单的列号
Dim AppObject As New appClass

Sub Init()
'   Called by Workbook_Open
    Set AppObject.AppEvents = Application
End Sub

Sub ProtectMySheet(myWorkbook As Workbook)
    Dim tempSheet As Worksheet
    For Each tempSheet In myWorkbook.Worksheets
        tempSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _
        False, AllowUsingPivotTables:=True
    Next
End Sub

Sub UnProtectMySheet(myWorkbook As Workbook)
    Dim tempSheet As Worksheet
    For Each tempSheet In myWorkbook.Worksheets
        tempSheet.Unprotect
    Next
End Sub
Sub GetRunningObject()
    Dim appExcel As Application
    Dim CopyWorkbook As Workbook                         '72报表的工作簿
    Dim allQuery(c_numOfWorkBook) As Workbook            '所有打开的报表
'    Dim isRunning As Boolean            '报表运行的标志
    Dim count As Integer                '打开报表的数量
    Dim i As Integer
    '解除保护
    Application.ScreenUpdating = False
    UnProtectMySheet ThisWorkbook
    Application.ScreenUpdating = True
    '清除拷贝报表清单
    ClearList c_listRow, c_listCol
    Set appExcel = GetObject(, "excel.application")
    '找到打开的报表,找到后IsRunning置为true,否则为false
    '同时统计打开的报表,如果没有打开的报表则退出程序
    count = 0
    For Each CopyWorkbook In appExcel.Workbooks
        If Left(CopyWorkbook.Name, 8) = c_reportName Then
            '查找所有的打开报表
            Set allQuery(count) = CopyWorkbook
            count = count + 1
        End If
    Next
    '执行拷贝并将拷贝的报表显示在本次拷贝报表清单中
    For i = 0 To count - 1
        CopyReportWorkSheet ThisWorkbook, allQuery(i), c_listRow + i, c_listCol
    Next i
    '写保护
    ProtectMySheet ThisWorkbook
    '给出拷贝成功信息
    MsgBox "拷贝了" & i & "张报表!"
End Sub

'将检测到的workbook全部拷贝到target中
'source: 即打开的报表
'target: 即含有勾稽关系的workbook
'p_row: 写进本次拷贝清单的行号
'p_col: 写进本次拷贝的列号
Sub CopyReportWorkSheet(target As Workbook, source As Workbook, p_row As Long, p_col As Long)
    Dim sheetIndex As Integer       '拷贝sheet的位置
    Dim targetSheet As Worksheet    'target的sheet
    Dim sourceSheet As Worksheet    'source的sheet
    Dim toBeCopy As Worksheet       '将要被拷贝的worksheet
    Dim isError As Boolean          '错误标识
    '遍历source和target为了得到相同名字的sheet
    isError = True
    For Each sourceSheet In source.Worksheets
        For Each targetSheet In target.Worksheets
            If targetSheet.Name = sourceSheet.Name Then
                isError = False
                Set toBeCopy = sourceSheet
                '得到sheet的序号
                sheetIndex = targetSheet.Index
                '一旦找到便可退出
                Exit For
            End If
        Next
    Next
    '未找到相对应的报表则报错
    If isError Then
        MsgBox "未找到相对应的报表,请注意报表名字是否改动过"
        Exit Sub
    Else
        'NULL
    End If
    '开始拷贝
    toBeCopy.Range("A1:AZ500").Copy Destination:=target.Worksheets(sheetIndex).Range("B2")
'    toBeCopy.Range("A1:AZ500").Copy
'    target.Worksheets(sheetIndex).Select
'    target.Worksheets(sheetIndex).Range("B2").Select
'
'    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
'        :=False, Transpose:=False
    '列出清单
    ThisWorkbook.Worksheets("工作表目录").Cells(p_row, p_col).Value = toBeCopy.Name
End Sub

'将上次拷贝的清单删除
'p_col: 为将要清楚的行号
'p_row: 为将要清楚的列号
Sub ClearList(p_row As Long, p_col As Long)
    While ThisWorkbook.Worksheets("工作表目录").Cells(p_row, p_col).Value <> ""
        ThisWorkbook.Worksheets("工作表目录").Cells(p_row, p_col).Clear
        p_row = p_row + 1
    Wend
End Sub

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值