VBA将文件拖放到用户表单以获取文件名和路径

时间:2013-12-13 15:22:15

标签: excel vba drag-and-drop userform

我想学习一个新技巧,但我不是百分之百地对VBA有可能,但我想我会在这里与大师核对。

我想要做的是避免使用古老的getopenfilename或浏览器窗口(在我们的网络驱动器上设置起始目录非常困难)并且我想创建一个VBA用户表单,其中用户可以从桌面或窗体上的浏览器窗口拖放文件,VBA将加载文件名和路径。再一次,我不确定这是否可行,但如果是,或者有人在我欣赏指针之前已经完成了。我知道如何设置用户表单,但除此之外我没有任何真正的代码。如果我能提供一些东西,请告诉我。

感谢您的时间和考虑!

2 个答案:

答案 0 :(得分:14)

我找到了实现这一目标的方法。据我所知,它只能使用树视图控件来完成。您可能必须右键单击工具箱才能查找并添加它。它将在"其他控件"或类似的东西。除了控件之外,你还需要两件事。

UserForm_Initialize子广告中,您需要使用以下代码行来启用拖放功能:TreeView1.OLEDropMode = ccOLEDropManual

UserForm_Initialize()
    TreeView1.OLEDropMode = ccOLEDropManual
End Sub

然后您将需要Private Sub TreeView1_OLEDragDrop事件。我省略了所有参数以节省空间。他们应该很容易找到。在那个sub中只需声明一个字符串,可能是strPath或类似的东西来保存文件名和路径并设置strPath = Data.Files(1),这将获得用户拖动到的文件的文件名和路径TreeView控件。这假设用户一次只拖动一个文件,但据我所知,如果你试验它,可以拖动多个文件。

Private Sub TreeView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
    StrPath = Data.Files(1)
End Sub

修改:您还需要添加对Microsoft Windows Common Controls 6.0

的引用

我还添加了示例代码。

答案 1 :(得分:0)

我通过使用Application Event WorkbookOpen使它起作用。将文件拖到打开的Excel工作表时,它将尝试在Excel中作为单独的工作簿打开该文件,这将触发上述事件。有点痛苦,但是我使用了链接https://bettersolutions.com/vba/events/excel-application-level-events.htm作为参考。

唯一的问题是,如果该文件不是Excel文件,则它将弹出一个窗口,并且您无法运行VBScript来删除它,因为该事件将无法运行,因此无法解决该弹出窗口。我的部分代码如下:

Public WithEvents App As Application

Private Sub App_WorkbookOpen(ByVal Wb As Workbook)

Dim path, pathExt As String
path = Wb.Name
pathExt = Mid(path, InStrRev(path, "."))

If pathExt = ".pdf" Then
Application.DisplayAlerts = False
Workbooks(Wb.Name).Windows(1).Visible = False

Dim n As String
n = Wb.FullName

Wb.Close

Call DragnDrop.newSheet(n)

Application.DisplayAlerts = True

End If

End Sub

编辑: 忘记了需要通过在任何模块中发布以下代码来初始化应用程序事件

Option Explicit
'Variable to hold instance of class clsApp
Dim mcApp As clsApp

Public Sub Init()
    'Reset mcApp in case it is already loaded
    Set mcApp = Nothing
    'Create a new instance of clsApp
    Set mcApp = New clsApp 'Whatever you named your class module
    'Pass the Excel object to it so it knows what application
    'it needs to respond to
    Set mcApp.App = Application  'mcApp.Whatever you named this Public 
'WithEvents App As Application
End Sub

然后将此代码放在ThisWorkbook Workbook_Open()

'Initialize the Application Events
Application.OnTime Now, "'" & ThisWorkbook.FullName & "'!Init"