我想学习一个新技巧,但我不是百分之百地对VBA有可能,但我想我会在这里与大师核对。
我想要做的是避免使用古老的getopenfilename或浏览器窗口(在我们的网络驱动器上设置起始目录非常困难)并且我想创建一个VBA用户表单,其中用户可以从桌面或窗体上的浏览器窗口拖放文件,VBA将加载文件名和路径。再一次,我不确定这是否可行,但如果是,或者有人在我欣赏指针之前已经完成了。我知道如何设置用户表单,但除此之外我没有任何真正的代码。如果我能提供一些东西,请告诉我。
感谢您的时间和考虑!
答案 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"