在特定工作簿中运行宏

时间:2016-02-29 02:09:15

标签: excel vba excel-vba macros

这似乎是一个如此简单的请求,但我似乎无法在网上找到任何答案。 我有两个打开的工作簿(比如说 A B )。我想要做的就是运行我在工作簿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 中运行。

如果我能伸出援手,我将不胜感激。

4 个答案:

答案 0 :(得分:1)

尝试声明工作簿对象?

Dim wkbkA as workbook
set wkbkA = 'directory here

然后在With... End With

中运行您的代码
With wkbkA
    .range('etc.........

End With

答案 1 :(得分:1)

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

e.g。 Worksheets("A").Activate

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

其中Worksheet保存工作表名称。

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

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

答案 2 :(得分: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

答案 3 :(得分:1)

您需要做的就是重写HistoricalDataShift来自行运行。它应该工作得很好。

class Person(models.Model):
    address = models.CharField(max_length500)
    name = models.CharField(max_length=200)
    name_pinyin = models.CharField(pinyin(name),max_length = 200)

    def save(self, *args, **kwargs):
        self.name_pinyin = Pinyin(self.name)
        super(Person, self).save()

为了使您的代码更好地工作,您可以这样做:

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