首页 > 解决方案 > 拖放 VBA 警报

问题描述

当我从浏览器拖放到 Excel 电子表格中时,我试图收到警报。当我从 excel 中的一个单元格拖动到另一个单元格时,单元格中有数据会被询问,但其他时候不会。我正在尝试将它添加到电子表格工作表更改子中的现有代码中,但由于它不是复制和粘贴,所以它不在我的剪贴板上。我尝试在执行此操作时录制一个宏,但它只显示“ActiveSheet.Paste”,如果我的剪贴板上有东西,它会粘贴它而不是我想要的拖放值。

我找到了一种我想要的代码,但不希望它从另一个单元格复制,只有我拖放的值。

If Range("D1") <> "" Then
    Response = MsgBox("Do you want to overwrite the existing data", vbYesNo)
End If
If Response = vbYes Then
    Range("A1").Copy Range("D1")
End If

我想也许有可能做到这一点?在我的电子表格中,我只在更改列 J 时激活代码。

标签: excelvba

解决方案


我不相信你可以用 Excel 附带的开箱即用事件等来做你想做的事情。您可能需要探索自定义事件(如果适用)或自定义编写的加载项,它们可能使您能够捕获此类事件。


考虑一下我刚刚在一个新工作表上完成的以下测试,以基于将一个单元格“拖放”到另一个单元格来确定哪些事件以何种顺序触发。

两个潜艇都在Sheet1代码模块内。

Private Sub Worksheet_Change(ByVal Target As Range)
    Debug.Print "Change " & Target.Address
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Debug.Print "Selection Change " & Target.Address
End Sub

如果我在 Cell 中有一个值,A1然后单击并拖动该单元格C5,则结果输出如下:

Change $A$1
Change $C$5
Selection Change $C$5

这显示了事件按此顺序触发并针对这些单元格:

  1. Worksheet_Change事件在单元格上触发。
  2. Worksheet_Change事件在目标单元格上触发。
  3. Worksheet_SelectionChange事件在目标单元格上触发。

这为我们提供了以下考虑:

  • Worksheet_Change事件触发两次,一次是单击并拖动源单元格的初始化,然后是在您拖放到目标单元格时再次触发。
  • 这使得一个干净的解决方案变得困难,因为它很容易编写一个无限循环。
  • SelectionChange只触发一次,因此使用起来会更容易一些,但是您需要在拖放的源范围内进行馈送。

我试图解决一些问题,但我总是以无限循环的change/selectionchange事件触发或在应用程序警报触发之前捕获事件等问题结束。


推荐阅读