Excel 将一个范围从一个工作簿中的工作表复制到另一个工作簿中的工作表

Excel 将一个范围从一个工作簿中的工作表复制到另一个工作簿中的工作表,excel,vba,copy,paste,Excel,Vba,Copy,Paste,我想从模板工作簿开始,运行宏从另一个工作簿中的特定工作表复制一系列数据(A11:AD400从工作簿2,工作表“Jan”复制到A11:AD400工作簿1,工作表“Jan”)。除其他工作表外,每个工作簿有12张工作表(每月一张)。此代码仅适用于月报表,不适用于其他任何情况。我有这段代码,它大部分时间都能工作,但崩溃的次数很多。我觉得有一种更有效的方法来完成这项任务。感谢您的帮助 Option Explicit Option Compare Text Dim i As Long, j As Long

我想从模板工作簿开始,运行宏从另一个工作簿中的特定工作表复制一系列数据(A11:AD400从工作簿2,工作表“Jan”复制到A11:AD400工作簿1,工作表“Jan”)。除其他工作表外,每个工作簿有12张工作表(每月一张)。此代码仅适用于月报表,不适用于其他任何情况。我有这段代码,它大部分时间都能工作,但崩溃的次数很多。我觉得有一种更有效的方法来完成这项任务。感谢您的帮助

Option Explicit
Option Compare Text

Dim i As Long, j As Long
Dim wB As Workbook, wBK As Worksheet
Dim myPath As String
Dim myFile As String
Dim myExtension As String
Dim FldrPicker As FileDialog
Dim curSht As String

Sub MoveDataOldtoNew()

'Optimize Macro Speed
Application.ScreenUpdating = False: Application.EnableEvents = False:         Application.Calculation = xlCalculationManual
'Warning message
If MsgBox("AE VERSION - These changes cannot be undone. It is advised to save a copy before proceeding. Do you wish to proceed?", vbYesNo + vbQuestion) = vbNo Then
    Exit Sub
  End If
If MsgBox("ONLY for Version G Trackers - No other Excel sheets should be open. This can take up to one minute to complete. Continue?", vbYesNo + vbQuestion) = vbNo Then
    Exit Sub
  End If
'Retrieve Target File From User
Set FldrPicker = Application.FileDialog(msoFileDialogFilePicker)
With FldrPicker
    .Title = "Select A Previous Tracker"
    .AllowMultiSelect = False
    If .Show = -1 Then
    myFile = .SelectedItems(1)

    If myFile <> ThisWorkbook.FullName Then
      Set wB = Workbooks.Open(Filename:=myFile)

        For Each wBK In wB.Worksheets
            SelectCase
        Next wBK

      wB.Close savechanges:=False
    End If

ResetSettings:
Application.EnableEvents = True: Application.ScreenUpdating = True: Application.Calculation = xlCalculationAutomatic

MsgBox "Import Complete!"
End If
End With
End Sub

Sub SelectCase()

    Select Case Trim(wBK.Name)
    Case "Jan"
        Consolidate
    Case "Feb"
        Consolidate
    Case "Mar"
        Consolidate
    Case "Apr"
        Consolidate
    Case "May"
        Consolidate
    Case "Jun"
        Consolidate
    Case "Jul"
        Consolidate
    Case "Aug"
        Consolidate
    Case "Sep"
        Consolidate
    Case "Oct"
        Consolidate
    Case "Nov"
        Consolidate
    Case "Dec"
        Consolidate
    Case Else
        Debug.Print wBK.Name
    End Select

End Sub


Sub Consolidate()

Dim fM As Long, wMas As Worksheet
Set wMas = ThisWorkbook.Sheets(Trim(wBK.Name))
'wMas.Unprotect

With wMas
.Unprotect

    wBK.Range("A11:AD400").Copy
    wMas.Range("A11:AD400").PasteSpecial xlPasteValues
    Application.Goto wMas.Range("A11"), True
    Application.CutCopyMode = False
.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True
End With
'wMas.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True

End Sub
选项显式
选项比较文本
我和我一样长,我和我一样长
将wB设置为工作簿,将wBK设置为工作表
将myPath设置为字符串
将myFile设置为字符串
Dim myExtension作为字符串
Dim FldrPicker As FILE对话框
像线一样暗的线
Sub-MoveDataOldtoNew()
'优化宏速度
Application.ScreenUpdate=False:Application.EnableEvents=False:Application.Calculation=xlCalculationManual
“警告信息
如果MsgBox(“AE版本-这些更改无法撤消。建议在继续之前保存一份副本。是否继续?”,vbYesNo+vbQuestion)=vbNo,则
出口接头
如果结束
如果MsgBox(“仅适用于版本G跟踪器-不应打开其他Excel工作表。这可能需要一分钟才能完成。是否继续?”,vbYesNo+vbQuestion)=vbNo,则
出口接头
如果结束
'从用户检索目标文件
设置FldrPicker=Application.FileDialog(msoFileDialogFilePicker)
用FldrPicker
.Title=“选择上一个跟踪器”
.AllowMultiSelect=False
如果.Show=-1,则
myFile=.SelectedItems(1)
如果myFile ThisWorkbook.FullName,则
设置wB=Workbooks.Open(文件名:=myFile)
对于wB.工作表中的每个wBK
选择案例
下一个wBK
wB.Close savechanges:=False
如果结束
重置设置:
Application.EnableEvents=True:Application.ScreenUpdate=True:Application.Calculation=xlCalculationAutomatic
MsgBox“导入完成!”
如果结束
以
端接头
子选择框()
选择案例修剪(wBK.Name)
案例“Jan”
巩固
案件“2月”
巩固
“Mar”案
巩固
案例“Apr”
巩固
“May”案
巩固
“君”案
巩固
案件“七月”
巩固
案件“8月”
巩固
案例“Sep”
巩固
案例“十月”
巩固
案件“11月”
巩固
案例“Dec”
巩固
其他情况
Debug.Print wBK.Name
结束选择
端接头
子合并()
将fM设置为长,wMas设置为工作表
设置wMas=ThisWorkbook.Sheets(Trim(wBK.Name))
'wMas.Unprotect
使用wMas
.解除保护
wBK.范围(“A11:AD400”).副本
wMas.Range(“A11:AD400”).Paste特殊XLPaste值
Application.Goto wMas.Range(“A11”),真
Application.CutCopyMode=False
.Protect DrawingObject:=真,Content:=真,Scenarios:=真,AllowFiltering:=真
以
'wMas.Protect DrawingObjects:=True,Content:=True,Scenarios:=True,AllowFiltering:=True
端接头

我将使用

Dim found As Integer
Dim wsNames()
wsNames = Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", _
    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")

For Each wBK In wB.Worksheets
    On Error Resume Next
    found = WorksheetFunction.Match(Trim(wBK.Name), wsNames, 0)
    If Err.Number <> 0 Then
        Consolitate
    Else
        Err.Clear
        Debug.Print wBK.Name
    End If
    On Error GoTo 0
Next wBK


它应该会变得更好

Sub-SelectCase()的目的是什么?就个人而言,我觉得
dim wBK As worker
很容易让人困惑。你能说说崩溃的例子吗?您是否知道或怀疑是什么原因造成的,或是您的代码中的哪一行导致了崩溃?@dwirony Sub SelectCase()-是我定义工作簿中哪些工作表需要复制的方式。@Jeeped-我同意,我的错误:-)谢谢!我现在收到一个错误“无法为wsNames=array(“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”)分配数组这很有帮助!-->wMas.Range(“A11:AD400”)。Value=wBK.Range(“A11:AD400”).value抱歉,我进行了编辑。我在将数组分配给固定大小的数组时忘记了数组是动态的。只需将变量声明为动态数组:Dim wsNames()
wBK.Range("A11:AD400").Copy
wMas.Range("A11:AD400").PasteSpecial xlPasteValues
wMas.Range("A11:AD400").Value = wBK.Range("A11:AD400").Value