在用户窗体上放置文件后防止“文件格式无效消息”

问题描述 投票:0回答:3

我已经为 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 尝试打开文件并通过这样做来阻止错误消息。

excel vba userform
3个回答
1
投票

点击表单切换模式/无模式

' 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

1
投票

我明白你的描述,但我认为没有简单的解决方案。如果这有效,最简单的是 -

Call DragAcceptFiles(FindWindow("ThunderDFrame", Me.Caption), 0)

..但不幸的是它没有。尝试以相同的方式禁用 xlApp.Hwnd 也不会接受丢弃的文件。也许需要禁用其他一堆窗口中的一个(?),我只尝试了我提到的那些。

您可能会研究两种不同的方法 -

  1. 添加一个按钮,供用户在启用拖动文件操作之前切换无模式/模式。我手头没有代码,但绝对有可能,尽管不支持。

  2. 使用 CallWindowProc 设置回调而不是树视图的 OLE-DD 来捕获 WM_DROPFILES 消息,使用 DragQueryFile 获取文件,并防止 Excel 使用 DragFinish 接收消息。您需要一个窗口,这可能是表单的第一个也是唯一的直接子窗口。最好添加一个窗口控件,例如框架(尽管它不会直接公开其“hwnd”,因此需要相当多的 API 才能获取它)。那里有很多一般的例子,我已经使用了这种方法 - 但不幸的是有几个问题,我没有足够可靠的东西我想发布!

这不会是您正在寻找的答案,但它可能是您将要得到的最好的答案!虽然我很高兴是错误的:)


0
投票

找到另一个解决方案,拖放文件后使用用户窗体隐藏

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
© www.soinside.com 2019 - 2024. All rights reserved.