天道酬勤,学无止境

Trap delete key

My problem is fairly trivial: I need to apply logic to the delete button in Excel. In a related question I asked for means to clear cells in a pivot table, and realising now that this might not be the right approach, this is yet another alternative I'm considering. Unfortunately, I admittedly have little experience with Visual Basic, and this task is proving such a challenge (quite surprisingly).

Is it possible to trap (as in listen to) the delete-key in Excel and trigger a subroutine in VBA when pressed?

I'd appreciate all kind of input! Thanks!

标签

评论

Yes.

You case use Application.Onkey to assign code to keys

If you (1) add this code to a sheet module that contains your pivottable (right-click your sheet tab, View Code and past the code below)

This code activates and then de-activates the intercept when the user enters then leaves this particular sheet:

Private Sub Worksheet_Activate()
Application.OnKey "{DELETE}", "Intercept"
End Sub

Private Sub Worksheet_Deactivate()
Application.OnKey "{DELETE}"
End Sub

(2) add this code to a regular module

Sub Intercept()
MsgBox "user just pressed delete"
End Sub

then delete on that sheet will be trapped and the user given a message

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在 C# 中捕获 windows 键、alt+tab、ctrl+alt+delete?(How do I trap windows key, alt+tab, ctrl+alt+delete in C#?)
    问题 如何使用 C# 在 Windows 应用程序中捕获Windows键、 Alt + Tab和Ctrl + Alt + Delete ? 回答1 您可以捕获 Ctrl-Alt-Delete。 但是您需要实现自己的 GINA dll,它由 Winlogon 加载。 您需要使用 C 或 C++ 对其进行编码,因为它需要是本机 DLL。 回答2 正如 Jan 所说,如果不编写自己的 GINA,就无法捕获 CTRL-ALT-DEL。 对于 Windows 或 ALT-TAB 键,您可以查看这些以获取帮助: 在没有焦点的情况下捕获击键(几乎重复) 如何设置 Windows 挂钩 钩子(低级,但会解释你需要什么 P/Invoke) 回答3 几乎根据定义,您不能“捕获”ctrl-alt-delete。 回答4 AFAIK Ctrl + Alt + Delete无法使用应用程序捕获。 请参阅此问题以获得更多想法:How to trap the keyboard stroke on ac# win forms application (CTRl + alt +Del) 回答5 一些远程管理软件和虚拟机可以做到这一点。 如果您按 [CTRL]+[ALT]+[DEL],特定的 Windows 对话框仍会打开,但应用程序也会显示,您已按 [CTRL]+[ALT]+[DEL]
  • How do I trap windows key, alt+tab, ctrl+alt+delete in C#?
    How do I trap Windows key, Alt+Tab, and Ctrl+Alt+Delete in a Windows application using C#?
  • 如何使用jQuery捕获退格键? [复制](How to trap the backspace key using jQuery? [duplicate])
    问题 这个问题在这里已经有了答案: 如何在 onkeydown 事件中捕获退格5 个回答 5年前关闭。 当按下退格键时,不会触发 jQuery keyup、keydown 或 keypress 方法。 我将如何捕获按下退格键? 回答1 试试这个: $('html').keyup(function(e){if(e.keyCode == 8)alert('backspace trapped')}) 回答2 常规 javascript 可用于捕获退格键。 您可以使用 event.keyCode 方法。 键码是 8,所以代码看起来像这样: if (event.keyCode == 8) { // Do stuff... } 如果要同时检查 [delete] (46) 和 [backspace] (8) 键,请使用以下命令: if (event.keyCode == 8 || event.keyCode == 46) { // Do stuff... } 回答3 使用与上述相同的想法,但要概括一下。 由于退格键在输入元素上应该可以正常工作,但如果焦点是段落或其他内容则不应该工作,因为在那里页面往往会回到历史上的前一页。 $('html').on('keydown' , function(event) { if(! $(event.target).is('input')) { console
  • iBatis insert操作陷阱
    iBatis insert操作陷阱 在使用iBatis插入数据的时候,容易跌入陷阱。 一、保存insert方法 在保存数据方面,iBatis的insert方法返回的是新增记录的主键,类型为Object,但实为整数数字型,有时候会让人误解为实体类型,也并非任何表的insert操作都会返回主键----这是一个陷阱。 要返回这个新增记录的主键,前提是表的主键是自增型的,或者是Sequence的。否则获取新增记录主键的值为0或者null。 对于MySQL这样来写: <selectKey keyProperty="id" resultClass="long"> select LAST_INSERT_ID() </selectKey> 对比Hibernate返回的Serializable类型,实际上也是主键。 二、更新删除update/delete方法 返回影响的记录行数。 三、对DAO/Service设计时候的影响 1、对于自增主键类型表,DAO的save方法可以返回主键、或者实体对象(该对象的标识符域会填充上主键值)。 2、对于非自增主键类型表,DAO的save方法,在保存之前就指导整个实体对象的所有值(包括主键),因此返回什么都可以,也可以不返回值。 3、对于Service的,不管表如何,一般都返回保存的实体对象。 四、查询 1
  • SpringBoot 操作 Redis 数据
    SpringBoot 操作 Redis 数据 简介 Redis 是一个开源的NoSQL数据库,基于内存的键值存储,速度快。 Redis 支持数据结构,如字符串,散列,列表,集和带范围查询的有序集。 5种主要数据类型: 字符串类型 string散列类型 hash列表类型 list集合类型 set有序集合类型 zset Redis优缺点 直接基于内存读写,不用Redis直接用MySQL,先不说查询性能耗时,一个是直达一个是通过媒介,显而易见,Redis 速度很快 。 不过Redis ,仅适用于键值对,并不能替代MySQL,虽然其有持久化,但是也可能会崩溃,损失几秒的数据 项目环境 项目工具环境: IDE工具,这里是 Jetbrains IDEAMaven 3.5 +JDK1.8Redis 服务器 源码环境地址 https://github.com/Gleans/SpringBootLearn/tree/master/springboot-redis 后面的基于这个项目来操作 定义 RedisTemplate RedisConfig.java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org
  • 如何在AC#Win Forms应用程序(CTRl + alt + Del)中捕获键盘笔触(How to trap the keyboard strokes on a c# win forms application (CTRl + alt +Del))
    问题 有什么方法可以处理Ctrl + Alt + Del键组合。 以测验应用程序(Win Forms)为例,直到测试结束,用户才应该能够切换到其他窗口。 我可以使用c#标准属性分别捕获Ctrl和Alt按键。 但是一旦用户按下Del键。 该控件超出了我的应用程序,Windows对其进行了处理。 任何想法都会有所帮助。 谢谢。 回答1 根据其他答案,似乎可以做到这一点。 尽管我极力劝阻。 以您的程序由于某种原因应挂起为例(上帝禁止...)。 这样一来,用户唯一能做的就是用电源按钮关闭计算机(或拔下插头...)。 这样做有一个很好的理由,这是有充分的理由的,而且这些方法的文献记录也很少。 如果这是一台信息亭计算机之类的东西,唯一的方式就是来自Pierre-Alain Vigeant的评论。 那么这样做实际上是有道理的! 回答2 我认为这不是一个好方法。 您正在为用户开发应用程序,不应尝试阻碍其一般操作。 对于Alt + Ctrl + Del组合键,请阅读本文。 回答3 AFAIK,Ctrl + Alt + Del会生成硬件中断,无法通过软件应用程序进行处理。 可能可以通过系统级键盘挂钩来解决,但我也不确定。 回答4 在这里看看: http://www.thescarms.com/vbasic/StopReBoot.aspx 本质上,对于Win9x
  • Vue3都使用Proxy了,你更应该了解Proxy
    vue3.0的pre-alpha版代码已经开源了,就像作者之前放出的消息一样,其数据响应这一部分已经由ES6的Proxy来代替Object.defineProperty实现,感兴趣的同学可以看其实现源码。vue都开始使用Proxy来实现数据的响应式了,所以有必要抽点时间了解下Proxy。 Object.defineProperty的缺陷 说到Proxy,就不得不提Object.defineProperty,我们都知道,vue3.0之前的版本都是使用该方法来实现数据的响应式,具体是: 通过设定对象属性getter/setter方法来监听数据的变化,同时getter也用于依赖收集,而setter在数据变更时通知订阅者更新视图。 大概如下代码所示: function defineReactive(obj, key, value) { Object.defineProperty(obj, key, { enumerable: true, configurable: true, get() { collectDeps() // 收集依赖 return value }, set(newVal) { observe(newVal); // 若是对象需要递归子属性 if (newVal !== value) { notifyRender() // 通知订阅者更新 value = newVal; }
  • 命令由于信号失败:中止陷阱:6(Command failed due to signal: Abort trap: 6)
    问题 由于Xcode 7和Swift 2.0,我得到了上面的错误,如下面的屏幕快照所示: 我不知道这是从哪里来的,清理和删除派生数据是行不通的。 还有其他人遇到这个问题吗? 项目设置: 目标设置: 回答1 转到项目构建settings -> Swift Compiler - code generation -> Optimization Level ->对于调试和发布,选择选项“快速,单文件优化[-O] 回答2 我在Xcode 7.0中打开的所有Xcode 6.3项目都存在相同的问题。 我创建了一个新项目,复制了我所有的源文件和资源,并且一切正常,没有出现此编译器错误。 我认为这与项目设置有关。 我将Swift编译优化设置为“ none”,然后Trap 6消失了。 也许还有其他设置,这些设置也会产生麻烦,但对我来说确实如此。 回答3 就我而言 错误 override func observeValueForKeyPath(keyPath: (String!)?, ofObject object: (AnyObject!)?, change: ([NSObject : AnyObject]!)?, context: UnsafeMutablePointer<Void>) 好的 override func observeValueForKeyPath(keyPath: String
  • 使用 Win32 应用程序在 Windows 7 中禁用 CONTROL + ALT + DELETE 和 Windows(win) Key [重复](Disable CONTROL + ALT + DELETE and Windows(win) Key in Windows 7 using Win32 application [duplicate])
    问题 这个问题在这里已经有了答案: 在 Windows 7 上禁用 Ctrl+Alt+Del (3 个回答) 4年前关闭。 我正在编写一个像kiosk一样运行的应用程序,应该允许用户离开应用程序。 在Windows 7 ,当他按下Win键或CTRL + ALT + DELETE 时,它会退出程序。 我需要以编程方式禁用Windows 7的Ctrl + ALT + DELETE组合键和Win键。 回答1 按Alt + Tab也将退出应用程序。 Ctrl + Esc是打开“开始”菜单的替代快捷方式。 Alt + Esc在正在运行的应用程序之间切换。 有许多不同的键序列可以做到这一点; Windows 是一个多任务操作系统的自然结果。 要解决此问题,您将不得不安装一个可以捕获这些任务键的低级键盘挂钩。 该钩子将监视用于切换任务的任何常用键序列。 每当它检测到这些序列之一时,它就会通过不将其传递到钩子链来忽略输入。 Paul DiLascia 在 2002 年 9 月版的 MSDN 杂志中写了一篇文章来解决这个问题。 你关心的部分从页面的一半开始,但为了方便和获得语法高亮的乐趣,我在这里重印了它: 任务KeyHook.h: //////////////////////////////////////////////////////////////// // MSDN Magazine —
  • 使用 Indy 组件实现 SNMP SendTrap(Implementing SNMP SendTrap using Indy components)
    问题 我需要通过 SNMP 从我在 C++Builder 上的应用程序报告错误。 我开始使用 Indy 组件实现 SNMP SendTrap。 void __fastcall TMainForm::btSendTrapClick(TObject *Sender) { UnicodeString myEnterprise = "1.5.5.5.5.5.5.5"; UnicodeString eventType = "1.5.5.5.5.5.5.5.1"; UnicodeString eventDistance = "1.5.5.5.5.5.5.5.2"; TIdSNMP * idSnmp = 0; TSNMPInfo * infoSnmp = 0; idSnmp = new TIdSNMP(NULL); infoSnmp = new TSNMPInfo(idSnmp); idSnmp->Host = edHost->Text; idSnmp->Community = "public"; infoSnmp->Host = edHost->Text; infoSnmp->Community = "public"; infoSnmp->Enterprise = myEnterprise; infoSnmp->GenTrap = 6; // I've met such values
  • C# SendKeys.Send(C# SendKeys.Send)
    问题 我正在使用 C# SendKeys.Send 方法解决一个问题。 我正在尝试用其他键替换键盘键,例如,当我在键盘中按“a”时,我希望该键为“s”,例如,当我在代码中执行此操作时: if ((Keys)keyCode== Keys.A) { SendKeys.Send("s"); } 现在我只在记事本中打印“sa”字符,但在这种情况下我只需要打印“s”字符而不是打印“sa”字符,因为当我在键盘上按“a”时,必须替换“a”用“s”。 我尝试通过添加以下行来删除最后一个字符: SendKeys.Send("{BS}"); 但我得到的只是删除了“s”字符,而“a”字符在那里。 我怎样才能防止这种情况发生? 回答1 我会撤回我的电话: SendKeys.Send("{BS}"); SendKeys.Send("S"); 编辑(问题更新后): 如果您正在使用字符串(对于您的特殊字符),您是否不能只捕获按键(“a”)生成的字符串并通过将字符串设置为您尝试的字符的 unicode 值来修改它代表? 如果人们提到的其他解决方案不起作用,那么我接下来会尝试... 回答2 另一种选择是使用低级键盘挂钩来捕获旧字符,然后发送新字符。 它需要一些 P/Invoke,但它使您能够完全捕获原始密钥,因此应用程序甚至看不到它。 回答3 我可能做出了错误的假设,但是如果您将它与文本框一起使用,您可以:
  • 无法使套接字接受非阻塞 ruby​​ 2.2(Unable to make socket Accept Non Blocking ruby 2.2)
    问题 我一整天都在寻找套接字接受非阻塞。 我发现 recv 非阻塞,但无论如何这对我没有好处。 我的脚本首先启动一个新的套接字类。 它绑定到具有 IP 127.0.0.1 和端口 6112 的客户端。然后它开始多线程。 多线程需要@sock.accept。 << 那就是阻塞。 然后我使用了accept_nonblock。 虽然,这会给我带来以下错误: IO::EWOULDBLOCKWaitReadable : A non-blocking socket operation could not be completed immediately. - accept(2) would block 我正在使用 Ruby 2.2。 注意:我不打算使用 Rails 来解决我的问题,或者给我一个捷径。 我坚持使用纯 Ruby 2.2。 这是我的脚本: require 'socket' include Socket::Constants @sock = Socket.new(AF_INET, SOCK_STREAM, 0) @sockaddr = Socket.sockaddr_in(6112, '127.0.0.1') @sock.bind(@sockaddr) @sock.listen(5) Thread.new(@sock.accept_nonblock) do |connection|
  • 我想在Windows XP中以ANSI-C代码禁用CTRL + ALT + DEL吗?(I want to disable CTRL+ALT+DEL in Windows XP in my ANSI-C code?)
    问题 我想在ANSI-C代码中的Windows XP中禁用CTRL + ALT + DEL。 有可能做到吗? 回答1 首先,陷阱Ctrl-Alt-Del(安全注意序列)和禁用它是两件事。 尽管有许多误解,但可以禁用SAS。 这是3种方法: 设置HKCU /软件/ Microsoft / Windows / CurrentVersion / Policies / System / DisableTaskMgr = 1 用自己的替换msgina.dll或编写键盘驱动程序。 转到“开始”菜单,选择“运行”,然后键入“ gpedit.msc”以运行组策略编辑器。 查找用户配置| 管理模板| 系统,您将找到一个名为Ctrl + Alt + Del Options的部分-“删除任务管理器” 为了捕获SAS,您可以编写GINA存根,创建键盘驱动程序或替换TaskMgr.exe。 这些要求主要针对嵌入式系统,因此您可以控制WinXP映像的制作方式。 参考:MSDN Mag 2002年9月 回答2 是的。 CTRL + ALT + DEL被称为安全注意序列(SAS),但是不能通过通用的“全局Windows挂钩”机制来拦截。 不管情况如何,您必须拦截我所知道的SAS的选项仅仅是一个:驱动程序。 但这并不一定是功能强大的设备驱动程序,它可以是一种更简单的过滤器驱动程序。 您将需要学习如何进行内核开发
  • 使用 ES6 代理捕获 Object.hasOwnProperty(Use ES6 proxy to trap Object.hasOwnProperty)
    问题 我想使用 ES6 代理来捕获以下常见代码: for (let key in trapped) { if (!Object.prototype.hasOwnProperty.call(obj, key)) continue; let value = trapped[key]; //various code } 但是看了proxy文档后,不知道怎么弄,主要是has trap trap是针对in操作符的,上面代码中好像没有用到,而且hasOwnProperty操作没有trap。 回答1 您可以使用 getOwnPropertyDescriptor 处理程序来捕获hasOwnProperty()调用。 例子: const p = new Proxy({}, { getOwnPropertyDescriptor(target, property) { if (property === 'a') { return {configurable: true, enumerable: true}; } } }); const hasOwn = Object.prototype.hasOwnProperty; console.log(hasOwn.call(p, 'a')); console.log(hasOwn.call(p, 'b')); 这是指定的行为,而不是特定实现的怪癖: Object
  • 将图像存储在 mysql 数据库中(Storing Images in a mysql database)
    问题 假设两个人具有相同的图像名称,或者同一用户两次上传相同的图像,那么在数据库中唯一存储和图像名称的最佳方法是什么。 我如何管理这样的场景,以便当我想要执行更新、删除等操作时,我最终不会删除两个图像或全部。 我的数据库是 MySQL。 编辑 - 好的,现在出于某种原因,我为所有在本地主机上工作的所有图像生成了一个唯一的时间戳,但是当我将它联机时它不起作用,我无法删除它,但它可以很好地脱机工作。 谢谢@cybeormin 回答1 在任何表中,我都会推荐一个 ID 列,它是 Auto Increment 并设置为 Primary Field。 这样,尽管用户有两个同名的图像,但所有行都是唯一的。 回答2 对图像进行引用计数。 当您想删除图像时,只需减少引用计数即可。 当引用计数达到 0 时,您将真正删除该行(或让 cron 作业删除它)。 回答3 我会丢弃原始图像名称,给每个图像一个唯一的 id 并将原始名称存储在数据库中。 回答4 在您的 mySQL DB 中,为图像上传创建一个表,创建一个 ID 列设置为AUTO_INCREMENT 、 INT (整数)并将其PKEY (主键)。 这意味着您的 ID 总是在添加新内容时自动创建和生成,并且无论是否多次添加相同的图像,您的 ID 始终是唯一的。 然后,其他字段可以捕获其他图像信息(文件名、“给定”名称、文件大小、文件类型和图像本身的
  • 如何创建临时目录?(How to create a temporary directory?)
    问题 我用来创建一个tempfile ,删除它并将其重新创建为目录: temp=`tempfile` rm -f $temp # <breakpoint> mkdir $temp 问题是,当它运行到<breakpoint> 时,恰好有另一个程序想做同样的事情,其中mkdir -ed 一个同名的临时目录,将导致该程序失败。 回答1 使用 mktemp -d。 它使用随机名称创建一个临时目录,并确保该文件不存在。 但是,您需要记住在使用后删除该目录。 回答2 对于更强大的解决方案,我使用如下内容。 这样,脚本退出后,临时目录将始终被删除。 清除功能在EXIT信号上执行。 这保证了清除函数总是被调用,即使脚本在某处中止。 #!/bin/bash # the directory of the script DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # the temp directory used, within $DIR # omit the -p parameter to create a temporal directory in the default location WORK_DIR=`mktemp -d -p "$DIR"` # check if tmp dir was created if [[ ! "
  • 在 shell 中写 try catch finally(Writing try catch finally in shell)
    问题 最后有没有像 java try catch 这样的 linux bash 命令? 还是 linux shell 一直在运行? try { `executeCommandWhichCanFail` mv output } catch { mv log } finally { rm tmp } 回答1 嗯,有点: { # your 'try' block executeCommandWhichCanFail && mv output } || { # your 'catch' block mv log } rm tmp # finally: this will always happen 回答2 根据您的示例,无论脚本如何退出,您似乎都在尝试执行类似于始终删除临时文件的操作。 在 Bash 中,尝试使用trap内置命令来捕获EXIT信号。 #!/bin/bash trap 'rm tmp' EXIT if executeCommandWhichCanFail; then mv output else mv log exit 1 #Exit with failure fi exit 0 #Exit with success trap的rm tmp语句总是在脚本退出时执行,因此文件“tmp”总是会试图被删除。 安装的陷阱也可以重置; 仅使用信号名称调用 trap 将重置信号处理程序。
  • JavaScript中的多个继承/原型(Multiple inheritance/prototypes in JavaScript)
    问题 我已经到了需要在JavaScript中进行一些基本的多重继承的地步。 (我不是在这里讨论这是否是一个好主意,所以请您保留那些评论。) 我只想知道是否有人尝试过成功(或没有成功),以及他们是如何做到的。 归根结底,我真正需要的是能够拥有一个对象,该对象能够从一个以上的原型链中继承属性(即每个原型可以具有自己的适当链),但是要以给定的优先顺序(它将搜索链以获取第一个定义)。 为了说明从理论上讲这是怎么可能的,可以通过将辅助链连接到主链的末端来实现,但这会影响那些以前的原型的所有实例,这不是我想要的。 有什么想法吗? 回答1 通过使用代理对象,可以在ECMAScript 6中实现多重继承。 执行 function getDesc (obj, prop) { var desc = Object.getOwnPropertyDescriptor(obj, prop); return desc || (obj=Object.getPrototypeOf(obj) ? getDesc(obj, prop) : void 0); } function multiInherit (...protos) { return Object.create(new Proxy(Object.create(null), { has: (target, prop) => protos.some(obj =>
  • 如何在JavaScript中捕获双键按下?(How to trap double key press in javascript?)
    问题 我希望能够捕获双键按键(例如Char T)以进行一些特殊处理。我希望按键动作足够快地发生而不会被解释为两个单独的按键,就像双击。 任何想法,我怎么能做到这一点? 回答1 按下键后,记下时间。 然后将其与您上次按下键时记下的时间进行比较。 如果差异在阈值之内,则将其视为两倍。 否则,请不要。 粗略的例子: var delta = 500; var lastKeypressTime = 0; function KeyHandler(event) { if ( String.fromCharCode(event.charCode).toUpperCase()) == 'T' ) { var thisKeypressTime = new Date(); if ( thisKeypressTime - lastKeypressTime <= delta ) { doDoubleKeypress(); // optional - if we'd rather not detect a triple-press // as a second double-press, reset the timestamp thisKeypressTime = 0; } lastKeypressTime = thisKeypressTime; } } 回答2 拥有一个在按键事件发生时设置为true的变量
  • Linux下trap信号的捕获
    trap是一个shell内建命令,它用来在脚本中指定信号如何处理。信号处理在shell编程中非常重要,一般我们会使用信号进行进程间的通信工作。 我们可以使用kill命令发送信号,然后使用trap命令捕获并处理信号。kill命令很多人理解就是杀死进程,殊不知kill除了可以杀死进程还可以做别的。 kill命令本质 kill本质上是在给进程发送特定信号,这个信号可以是告诉进程终止运行、继续运行、暂停运行等等。而进程在收不到这些信号就会执行具体的动作。 说明: 只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。 下面是常用的信号: HUP 1 终端断线 INT 2 中断(同 Ctrl + C) QUIT 3 退出(同 Ctrl + \) TERM 15 终止 KILL 9 强制终止 CONT 18 继续(与STOP相反, fg/bg命令) STOP 19 暂停(同 Ctrl + Z) 上面的信息输入kill -l就显示所有信号的列表。这些信号可以使用数字、英文全称、或者简称表示。但是不同的系统环境对这些表示方式的支持是不一样的,这个具体使用时需要提前测试。推荐使用英文名称,这样兼容性会更好一些。 信号 信号是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序活终端发送的命令(即信号)。 使用kill命令不指定信号时