2016-09-15 99 views
0

我是一名业余VBA用户,试图通过各种教程和试验错误到目前为止。Application.Run - 单元格参考中的工作簿名称-VBA

目前我遇到了Application.Run的障碍。我有的宏正在工作,我只需要根据包含特定日期的单元格引用来更新工作簿的名称(日期)。

Application.Run ("'09. September - Monthly Reconciliation.xlsm'!CombineTabs") 
or 
    Application.Run ("'03.09.2016 - Daily Reconciliation.xlsm'!CombineTabs") 

为了防止具有微距每日或每月(它将被用于更新:

为长宏的一部分,我可能有以下取决于工作簿的一个我在工作没有任何VBA知识的人),有没有办法将工作簿的名称链接到单元格?此单元格将包含工作簿的名称,并具有所需的日期和日期格式。

任何输入赞赏,

+0

不太清楚你的问题,但在一个单元格,可以用一个公式来获取工作簿的名称: '= MID(CELL(“文件名”,A1),FIND(“[”,CELL(“文件名”,A1))+ 1,FIND(“]”,CELL [“,CELL(”filename“,A1)) - 1)' - 在VBA中,你可以做同样的事情,然后解析出你不需要的东西。或者你问如何得到一个变量来更新,所以你可以说'Application.Run(myDate&“ - Daily Reconciliation.xlsm'!CombineTabs')'? – BruceWayne

+0

如果你没有捕获一个函数的返回值,或者你正在调用一个'Sub'过程,[不要在参数周围使用括号](http://stackoverflow.com/documentation/vba/1179/procedure-/3818/this-is-confusing-why-not-just-always-use-括号#t = 201609151902369636814) - 这将*最终在后端咬你。 –

+0

Application.Run工作表(“Sheet1”)。范围(“A1”)。值,将文件放到'Sheet1'上的'A1'单元格中。 – omegastripes

回答

1

是,宏是在同一工作簿作为代码

如果是这样的话,我理解正确的话,那么你可以简单地这样做:

Application.Run "CombineTabs" 

甚至:

CombineTabs 

我试图Application.Run工作表( “Sheet19”)范围( “AQ27”)值,CombineTabs - !它只是打开其他工作簿 [...]

如果CombineTabs宏观位于活动工作簿,这是必然包含调用代码的工作簿,然后你可以这样做:

Application.Run "'" & ActiveWorkbook.FullName & "'!CombineTabs" 

如果CombineTabs宏观位于未打开一些工作簿,文件名是在包含Application.Run指令相同工作簿...

首先,避免硬编码范围和单元格引用;将范围Sheet19!AQ27命名为工作簿范围Name - 将其称为有意义的,例如Filename。在Module1

Public Sub Test() 
    Debug.Print "yup" 
End Sub 

Application.Run "'" & ThisWorkbook.Range("Filename").Value & "'!CombineTabs" 

与此代码测试,这段代码在立即窗格:然后你就可以做到这一点

Application.Run "'" & Application.Workbooks(1).FullName & "'!Test" 
yup 

所以,这个假设Filename范围包含有效的路径+文件名到现有的工作簿。

您可以尝试Application.Run呼叫,通过打开目标之前验证工作簿自己:

Dim target As Workbook 
On Error Resume Next 
    Set target = Application.Workbooks.Open(ThisWorkbook.Range("Filename").Value) 
    Err.Clear 
    If target Is Nothing Then Exit Sub 
On Error GoTo 0 
Application.Run "'" & target.FullName & "'!CombineTabs" 
+0

第一:谢谢你的垫子!我试图做的是去我的每日或每月对帐工作簿,运行一个宏,它将在后台打开一个单独的工作簿,并运行位于每月对帐工作簿中最初打开的宏。在尝试实现建议的更改时,一切正常,直到第二个工作簿打开并创建“活动工作簿”。这是它停止的地方,因为我想要运行的宏不在本工作簿中,而是现在不活动的宏。 – kankuroo

+1

@ kankuroo好吧,你很混乱。如果'CombineTabs'位于包含'Application.Run'调用的相同工作簿中,那么请参阅本答案的顶部 - 您根本不需要'Application.Run'。我建议你让'CombineTabs'过程把一些'Workbook'对象作为一个参数(所以不要调用'Application.Run'你去'Application.Workbooks.Open'并把生成的工作簿对象传给你的宏) ,所以你可以处理一个对象引用,而不是依赖任何活动的东西。 –

+0

对不起,我有时候有点困惑。但你,你是一个天才!我的印象是,我必须说明哪些开放工作簿包含了我想在新打开的工作簿中运行的第二个宏,而且我对它过于复杂。你的第一个建议是摆脱整个Application.Run行,并用CombineTabs替换它,效果非常好。感谢您的帮助!! – kankuroo

相关问题