2016-02-29 38 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. –

相關問題