在用户窗体上删除文件后阻止 "File format is not valid message"

Prevent "File format is not valid message" after dropping file on userform

我已经为 Excel 创建了拖放表单,以便使用树视图控件(代码如下)将 link 捕获到文件位置。它按预期工作,但是问题是在我制作表格 ShowModal = False 之后(因为用户可能想移动 Excel window 以到达要拖动的文件)在它运行之后例程,弹出错误消息通知“文件格式无效”(下方屏幕)或通知文件可能已损坏或不安全(下方第二个屏幕)。

根据我的理解,发生这种情况是因为 Excel 认为文件被放置在 sheet 上并尝试打开它(它很可能是 .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 尝试打开文件并通过这样做来阻止错误消息。

我理解您的描述,但我认为没有简单的解决方案。如果这可行,最简单的方法是 -

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

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

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

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

  2. 而不是树视图的 OLE-DD 设置回调与 CallWindowProc 来捕获 WM_DROPFILES 消息,使用 DragQueryFile 获取文件,并防止 Excel 接收消息拖动完成。您需要一个 window,这可能是表单的第一个也是唯一一个直接子 window。最好添加一个 window 控制的控件,例如框架(虽然它不会直接公开它的 'hwnd',所以相当多的 API 工作来获得它)。那里有很多一般示例,我已经使用了这种方法 - 但不幸的是有几个问题,我没有足够可靠的东西我想要 post!

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

点击表格切换modal/modeless

' 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