Vba 使宏在特定工作簿中运行

Vba 使宏在特定工作簿中运行,vba,excel,macros,Vba,Excel,Macros,这似乎是一个简单的请求,但我似乎无法在网上找到任何答案。 我有两本打开的工作簿(比如A和B)。我所要做的就是运行我在工作簿B中创建的宏,并通过工作簿a运行它(通过单击我指定了宏的形状),但运行在工作簿B中的宏 我为工作簿B创建的宏是 Sub HistoricalDataShift() Dim ws As Worksheet For Each ws In Sheets ws.Activate' Rows("18:1000").Select

这似乎是一个简单的请求,但我似乎无法在网上找到任何答案。 我有两本打开的工作簿(比如AB)。我所要做的就是运行我在工作簿B中创建的宏,并通过工作簿a运行它(通过单击我指定了宏的形状),但运行在工作簿B中的宏

我为工作簿B创建的宏是

Sub HistoricalDataShift()
    Dim ws As Worksheet
    For Each ws In Sheets
        ws.Activate'
        Rows("18:1000").Select
        Selection.Copy
        Range("A19").Select
        ActiveSheet.Paste
        Rows("15:15").Select
        Selection.Copy
        Range("A18").Select
        ActiveSheet.Paste
    Next ws
End Sub
然后我在工作簿B中创建了第二个宏,它具有

Sub ApplicationRun()
    Application.Run ("WorkbookB.xlsm!HistoricalDataShift")
End Sub
但每次尝试时,宏都会在工作簿A中运行


如果我能得到帮助,我将不胜感激

是否尝试声明工作簿对象

Dim wkbkA as workbook
set wkbkA = 'directory here
然后在
中使用。。。以

With wkbkA
    .range('etc.........

End With

您可以使用
工作表(“”)

e、 g.
工作表(“A”)。激活

或者
cv=工作表(工作表).单元格(DataSeriesEnd,rc\u索引)

工作表保存工作表名称的位置

等等

此代码段将遍历整个工作表集合,其中w是当前工作表名称:-

For Each w In Worksheets
    .......
Next w

在这个简短的示例中,我们假设WorkbookB.xlsm最初是唯一打开的工作簿,并承载以下宏:

Sub HistoricalDataShift()
    Dim wkbB As Workbook
    Dim wkbA As Workbook

    Set wkbB = ThisWorkbook
    Workbooks.Open Filename:="WorkbookA"
    Set wkbA = ActiveWorkbook
    wkbA.Sheets(1).Range("B9").Value = "whatever"
End Sub

您所需要做的就是重写HistoricalDataShift,使其自行运行。到时候就可以了

Sub HistoricalDataShift()
    Dim wb As Workbook
    Set wb = ThisWorkbook
    Dim ws As Worksheet
    For Each ws In wb.Worksheets
        ws.Activate '
        ws.Rows("18:1000").Select
        Selection.Copy
        ws.Range("A19").Select
        ActiveSheet.Paste
        ws.Rows("15:15").Select
        Selection.Copy
        ws.Range("A18").Select
        ActiveSheet.Paste
    Next ws
End Sub
此外,为了使代码更好地工作,您可以执行以下操作:

Sub HistoricalDataShift()
    Dim wb As Workbook
    Set wb = ThisWorkbook
    wb.Activate
    Dim ws As Worksheet
    For Each ws In wb.Worksheets
        Call ws.Rows("18:1000").Copy(ws.Range("A19"))
        Call ws.Rows("15:15").Copy(ws.Range("A18"))
    Next ws
End Sub

可能的重复我相信这是一个重复的问题如下:注意,您编写的宏不是为从另一个工作簿使用而设计的,因为它缺少在复制和粘贴时要使用的工作簿的显式引用。@Ralph这不是这些宏的副本,因为
应用程序.Run
对OP工作正常。OP的问题是工作簿B中的代码没有显式引用说明应该在哪个工作簿上操作。声明工作簿对象是必需的,因为HistoricalDataShift需要引用自身。但你还没有解释这种联系。很好,我记住了你的答案,花了3分钟键入了一个有说服力的回答。这对OP的框架不起作用,因为工作簿a正在调用工作簿B。因此,你不希望工作簿B打开工作簿a。激活工作簿然后激活工作表会起作用,但你没有真正解释如何做。问题包括使用因此,我觉得没有必要重新发明众所周知的轮子。而是提供基于给定代码的示例。因此,使用activate的示例和使用单元格引用的示例。嘿@D_Bester,我知道这是第二个问题,但我如何更改上面的公式,使第15行仅粘贴为A18中的值(我一直在玩
PasteSpecial
,但就是无法正确粘贴)。