与多个用户共享的宏不会复制/粘贴到工作簿中

Posted

技术标签:

【中文标题】与多个用户共享的宏不会复制/粘贴到工作簿中【英文标题】:Macro shared with multiple users will not copy/paste into workbook 【发布时间】:2019-11-27 12:15:10 【问题描述】:

我和几位同事每两周根据导出的数据格式化报告。我想创建一个可以分发给每个人的宏,他们所做的只是在导出到本地计算机的数据上以尽可能少的步骤运行宏。我创建了一个宏,但我无法让它工作,因为目标工作簿(ThisWorkbook.Activesheet)是我的“PERSONAL.XLSB”(位于“XLSTART”文件夹并托管宏)而不是它需要的工作簿到(每个人每周都会改变)。主要问题是每当我运行宏时,“END_OF_REPORT.xlsx”中的数据将不会复制和粘贴,因为它正在尝试粘贴到“PERSONAL.XLSB”。

例如,我在位置 2,sally 是位置 3。我们都需要运行 1 月 1 日至 1 月 7 日的报告,因此将运行的文件(工作簿)对于我来说将是“jan1-jan7_1.xlsx” location 和 "jan1-jan7_2.xlsx" 表示 sally 的位置,两者都将仅包含 "Sheet1"。

当我打开 Visual Basic 时,打开的项目是“VBAProject (JAN1-JAN7_2.xlsx)”和“VBAProject (PERSONAL.XLSB)”,下面是模块 1、模块 2、Sheet1、ThisWorkbook。模块 1 用于位置 1,模块 2 用于位置 2。每当我尝试运行适当的宏时,它会执行所有操作,但会从我在宏中打开和关闭的工作簿中复制和粘贴数据。

Sub LOCATION_ONE_TRANS()

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationAutomatic
    
    Workbooks.Open "\\FILEPATH\END_OF_REPORT.xlsx"
       
    Dim wsCopy As Worksheet
    Dim wsDest As Worksheet
    Dim CopyLastRow As Long
    Dim DestLastRow As Long
    
    'Replace 1 with appropriate location
    Set wsCopy = Workbooks("END_OF_REPORT.xlsx").Worksheets("1")
    Set wsDest = ThisWorkbook.ActiveSheet

    CopyLastRow = wsCopy.Cells(wsCopy.Rows.Count, "A").End(xlUp).Row
    DestLastRow = wsDest.Cells(wsDest.Rows.Count, "A").End(xlUp).Offset(1).Row

    wsCopy.Range("A1:E" & CopyLastRow).Copy _
        wsDest.Range("A" & DestLastRow)
    Workbooks("END_OF_REPORT.xlsx").Close SaveChanges:=False

    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range _
        ("A:A"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    Cells.Select
    
    With Selection.Font
        .Name = "Arial"
        .Size = 12
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
        .ThemeFont = xlThemeFontNone
    End With
...
...
    Dim rangeSelection As Range
    Dim cellCurrent As Range
 
    Set rangeSelection = Application.Selection.Columns(1).Cells
    ActiveSheet.ResetAllPageBreaks
 
    For Each cellCurrent In rangeSelection
        If (cellCurrent.Row > 1) Then
            If (cellCurrent.Value <> cellCurrent.Offset(-1, 0).Value) Then
                ActiveSheet.Rows(cellCurrent.Row).PageBreak = _
                    xlPageBreakManual
            End If
        End If
    Next cellCurrent
    Selection.RowHeight = 36.6
    Cells.EntireColumn.AutoFit
    Application.WindowState = xlMaximized
    ActiveWindow.Zoom = 50
    ActiveSheet.Range("A1").Select
    ActiveWorkbook.Save
    
End Sub

我应该与我的同事共享宏,这样他们只需要打开运行宏所需的工作簿,启用宏,因为他们将此宏保存到他们的“XLSTART”,然后运行宏.实际发生的情况是,当任何人运行宏时,工作表正在格式化,但复制/粘贴的数据没有进入正确的工作簿(即 JAN1-JAN7_2.xlsx)

【问题讨论】:

【参考方案1】:

ThisWorkbook 总是指代码所在的文件。这就是为什么Set wsDest = ThisWorkbook.ActiveSheet 行会将您的 Personal.xlsb 设置为目的地。

【讨论】:

以上是关于与多个用户共享的宏不会复制/粘贴到工作簿中的主要内容,如果未能解决你的问题,请参考以下文章

将数据从一个工作簿复制并粘贴到另一个工作簿,导致随机单元格获取数据/空行而不会粘贴数据

Excel VBA 宏将复制一系列单元格并粘贴到另一个工作簿中

对多个工作簿使用宏

VBA:如果工作簿中的工作表名称等于从用户窗体中选择的组合框值,则复制该工作表并将其粘贴到另一个工作簿中

更新所有工作表中的宏是相同的(或使代码更全局?)

将值从多个工作簿复制到主文件中的特定单元格