Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检索当前打开的工作簿列表并让VBA将其放入多选项拨号框中?_Vba_Excel - Fatal编程技术网

如何检索当前打开的工作簿列表并让VBA将其放入多选项拨号框中?

如何检索当前打开的工作簿列表并让VBA将其放入多选项拨号框中?,vba,excel,Vba,Excel,早上好。所以本质上,我已经构建了一大堆宏,经过大量的工作,这些宏可以很好地工作。我遇到的问题是宏总是需要在其他工作簿上执行操作,即:“宏工作簿”包含对“2018年1月数据”执行操作的宏。原因是每月的数据表总是新的,所以我不能在上面存储宏 我个人很乐意打开一个单独的工作簿,按f11并运行正确的宏。但是,将来可能会有最终用户对此不满意,因此我想使用按钮。显然,通过在“宏工作簿”上实现一个按钮,它将宏功能应用于宏工作簿,而不是预期的工作簿 在理想情况下,我希望按下宏按钮,并显示当前打开的工作簿列表,用

早上好。所以本质上,我已经构建了一大堆宏,经过大量的工作,这些宏可以很好地工作。我遇到的问题是宏总是需要在其他工作簿上执行操作,即:“宏工作簿”包含对“2018年1月数据”执行操作的宏。原因是每月的数据表总是新的,所以我不能在上面存储宏

我个人很乐意打开一个单独的工作簿,按f11并运行正确的宏。但是,将来可能会有最终用户对此不满意,因此我想使用按钮。显然,通过在“宏工作簿”上实现一个按钮,它将宏功能应用于宏工作簿,而不是预期的工作簿

在理想情况下,我希望按下宏按钮,并显示当前打开的工作簿列表,用户可以通读并选择正确的工作簿。然后,它将选择此打开的工作簿,然后继续执行宏

这可能吗?我是VBA新手,但我以前从未遇到过这个问题。我能想到的最接近的修复方法是要求用户在对话框中输入文件目录和名称,然后使用该对话框选择工作簿以继续运行宏,例如:

亚宏观1()


我希望用户能够单击工作簿的名称,而不是必须输入它,以减少他们输入错误的机会。

有很多方法可以实现这一点。这里有一个非常简单的方法,它可能会给你至少一个想法。在包含“您的宏”的主工作簿中…创建带有组合框和按钮的UserForm…如下所示:

在UserForm中添加以下代码:

Option Explicit

Private Sub UserForm_Activate()
    Dim vWorkbook As Workbook
    ComboBox1.Clear
    For Each vWorkbook In Workbooks
        ComboBox1.AddItem vWorkbook.Name
    Next
End Sub

Private Sub CommandButton1_Click()
    If ComboBox1.ListIndex <> -1 Then
        Call YourMacro(ComboBox1)
    End If
End Sub

Private Sub YourMacro(vWorkbookName As String)
    MsgBox Workbooks(vWorkbookName).Name
End Sub
激活表单时,代码将当前打开的工作簿的名称加载到组合框中。您可以选择一个。单击按钮…检查工作簿是否已被选中后,它将运行一个模仿您自己的宏的示例宏(在本例中,该宏通过引用工作簿对象显示工作簿名称)。因为很明显,在“您的”宏中…它们应该引用选定的工作簿


再一次…显然这是非常基本的。这是一个可能的示例,可能会为您指明正确的方向。

欢迎使用堆栈溢出。你的问题非常广泛-看一看,然后也许你的帖子会显示你已经拥有的代码,你已经尝试了什么,以及你遇到的具体问题。是的,这是可能的,但你的问题到目前为止非常广泛(这与苏的规则相反)-建议阅读该部分-无论哪种方式,我建议查看function和collection对象,它返回我推荐的所有当前打开工作簿的集合(类似于数组),这样你就可以在任何
ActiveWorkbook
上使用它。稍加调整,这对我来说是完美的。非常感谢你
Option Explicit

Private Sub UserForm_Activate()
    Dim vWorkbook As Workbook
    ComboBox1.Clear
    For Each vWorkbook In Workbooks
        ComboBox1.AddItem vWorkbook.Name
    Next
End Sub

Private Sub CommandButton1_Click()
    If ComboBox1.ListIndex <> -1 Then
        Call YourMacro(ComboBox1)
    End If
End Sub

Private Sub YourMacro(vWorkbookName As String)
    MsgBox Workbooks(vWorkbookName).Name
End Sub
Option Explicit

Public Sub LoadForm()
    UserForm1.Show
End Sub