2016-02-29 88 views
2

这似乎是这样一个简单的请求,但我似乎无法找到任何答案在线。 我有两个打开的工作簿(可以说AB)。我想要做的就是运行我在工作簿B中创建的一个宏,并通过工作簿A运行它(通过单击一个我已经分配了宏的形状),但运行在宏的工作簿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 

然后创建在工作簿乙具有第二宏...

Sub ApplicationRun() 
    Application.Run ("WorkbookB.xlsm!HistoricalDataShift") 
End Sub 

但是,每次我尝试宏一直运行在工作簿A

如果我能得到一个援助之手,将不胜感激。

+0

[从另一个工作簿上运行Excel宏(可能的重复http://stackoverflow.com/questions/2806065/运行excel宏从另一个工作簿) – Ralph

+0

我相信这是一个重复的问题如下:http:// stackoverflow。com/questions/2806065/running-excel-macro-from-another-workbook请注意,您编写的宏不适用于其他工作簿,因为它缺少复制和粘贴时要使用的工作簿的明确引用。 – Ralph

+0

@Ralph这不是重复的,因为Application.Run对OP来说工作得很好。 OP的问题在于工作簿B中的代码没有明确说明它应该在哪个工作簿上运行。 –

回答

1

所有您需要做的是重写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 
+0

谢谢@D_Bester !!!这很有魅力。所以Simlpe。 –

+0

嗨@D_Bester,我知道这是第二个问题,但我如何更改上面的公式,以便将第15行作为仅在A18中的值进行粘贴(我一直在使用“PasteSpecial”进行操作,但无法正确地进行操作。 –

1

尝试声明您的工作簿对象?

Dim wkbkA as workbook 
set wkbkA = 'directory here 

然后运行你的代码在With... End With

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

End With 
+0

声明工作簿对象是必需的,因为HistoricalDataShift需要引用自身。但是你没有解释这种联系。 –

+0

好点,我有你的答案在脑海里,3分钟,以输入一个切实的响应 –

1

您可以使用Worksheets("<worksheetname>")

例如Worksheets("A").Activate

cv = Worksheets(Worksheet).Cells(DataSeriesEnd, rc_index)

其中工作表保持片材名称。

这个片段将通过工作表的整个集合,其中w是当前工作表名称: -

For Each w In Worksheets 
    ....... 
Next w 
+0

激活工作簿,然后激活工作表将工作,但你没有真正解释如何做到这一点。 –

+0

问题包括使用ws.activate,因此我觉得几乎没有必要重新发明谚语轮。而不是基于给定的代码提供示例。因此,使用激活的示例以及使用单元格引用的示例。 – MikeT

1

在这个简单的例子,我们假设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 
+0

这实际上不适用于OP的框架,因为工作簿A正在调用工作簿B.因此,您不希望工作簿B打开工作簿A. –

相关问题