我已经为 Excel 创建了拖放表单,以便使用树视图控件(代码如下)捕获到文件位置的链接。它按预期工作,但是问题是在我制作表格
ShowModal = False
(因为用户可能想移动Excel窗口以到达要拖动的文件)之后它运行它是例行程序,弹出错误消息通知“文件格式无效”(下方屏幕)或文件可能已损坏或不安全的通知(下方第二个屏幕)。
据我所知,发生这种情况是因为 Excel 认为文件已放在工作表上并尝试打开它(很可能是 .pdf 文件)。
除了制作表格
Modal
之外,还有什么方法可以防止这种情况发生吗?据我了解,应该以某种方式阻止错误消息,或者 Excel 根本不应该尝试打开文件,并通过这样做完全避免消息(最好的情况)。
拖放功能代码:
Private Sub TreeView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
'for capturing draged file path
'VBA does not have normal native functionality to do that so it is solved by using treeview widget unconventionaly
Dim LinkToPass As String
LinkToPass = Data.Files(1)
MsgBox "Thank you! Link captured.", vbInformation, "Link captured"
'Pass information to another form, where user enters all other data required
If formLoaded("NewEntry_agreement") Then
NewEntry_agreement.LinkToFile.Caption = LinkToPass
End If
CloseBtt_Click 'just call close button Sub with Unload Me inside
End Sub
编辑:关于替代消息的附加信息和屏幕截图。还使目标更加明确 - 阻止消息或阻止 Excel 尝试打开文件并通过这样做来阻止错误消息。
点击表单切换模式/无模式
' Adapted from Stephen Bullen's ModelessForm.xls 1998 example
Private Declare PtrSafe Function EnableWindow Lib "user32" (ByVal hwnd As LongPtr, ByVal fEnable As Long) As Long
' click the form to toggle modal/modeless
Private Sub UserForm_Click()
Static lMode As Long
lMode = IIf(lMode = 0, 1, 0)
EnableWindow Application.hwnd, lMode
Me.Caption = IIf(lMode, "Modeless", "Modal")
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
' ensure the app window is reset (maybe trap the state and reset if/as necessary)
EnableWindow Application.hwnd, 1
End Sub
我明白你的描述,但我认为没有简单的解决方案。如果这有效,最简单的是 -
Call DragAcceptFiles(FindWindow("ThunderDFrame", Me.Caption), 0)
..但不幸的是它没有。尝试以相同的方式禁用 xlApp.Hwnd 也不会接受丢弃的文件。也许需要禁用其他一堆窗口中的一个(?),我只尝试了我提到的那些。
您可能会研究两种不同的方法 -
添加一个按钮,供用户在启用拖动文件操作之前切换无模式/模式。我手头没有代码,但绝对有可能,尽管不支持。
使用 CallWindowProc 设置回调而不是树视图的 OLE-DD 来捕获 WM_DROPFILES 消息,使用 DragQueryFile 获取文件,并防止 Excel 使用 DragFinish 接收消息。您需要一个窗口,这可能是表单的第一个也是唯一的直接子窗口。最好添加一个窗口控件,例如框架(尽管它不会直接公开其“hwnd”,因此需要相当多的 API 才能获取它)。那里有很多一般的例子,我已经使用了这种方法 - 但不幸的是有几个问题,我没有足够可靠的东西我想发布!
这不会是您正在寻找的答案,但它可能是您将要得到的最好的答案!虽然我很高兴是错误的:)
找到另一个解决方案,拖放文件后使用用户窗体隐藏
Private Sub TreeView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
filePath = Data.Files(1)
UserForm1.Hide
End Sub