ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 12146|回复: 5

单元格进入编辑模式(输入模式)时如何使我的自定义菜单禁用(变灰)?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-2-22 10:14 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
单元格进入编辑模式(输入模式)时如何使我的自定义菜单禁用(变灰)?

找了很多历史贴,从未真正解决。

-----------------------------------------------------
http://club.excelhome.net/thread-297542-1-374.html
思路:用 API 钩子。
未解决:不是事件触发,无法在一进入编辑状态就禁用某些自定义菜单。
-----------------------------------------------------
--------------------------------------------------------------------------------
思路:用订阅Excel.Application.CommandBars的OnUpdate事件的方法,一旦菜单更改,就判断某个菜单,确定它是否更改,然后作相应处理。
未解决:但实际上,当按F2或者双击或者单击编辑栏进入“编辑状态”“输入模式”“输入状态”时,根本没有触发 OnUpdate事件,只有退出来进行其他处理时才会触发上述事件,而且任何一个菜单更改都会触发一遍,因此触发的次数太频繁,如果在其中进行编程会耗用大量资源导致假死。
http://club.excelhome.net/thread-392-1-1.html

--------------------------------------------------------------------------------
思路:单元格一旦进入编辑状态后,不管单元格的数据有没有改变都会触发Worksheet_Change事件,可在该事件中写入你的代码.
未解决:实际上,如果进入编辑状态后再按 ESC 键退出,不会触发 CHANGE 事件。
http://club.excelhome.net/thread-226645-1-996.html
----------------------------------------------------------------------------------

--------------------------------------------------------------------
http://www.xue5.com/itedu/200802/106140_2.html

思路:是在做某项操作时主动去判断EXCEL本身的工具栏上的某个按钮,然后再进行操作。
问题:还是存在问题,没有对应的事件触发,只能被动的去处理。


Excel中,如何在cell处于编辑状态时,对其用代码赋值

当我们用Winform程序去自动化Excel的时候,常常要实现这样的功能,给一个cell赋值,貌似很简单,得到range以后,设置它的Value2属性就可以了。但是还是会存在一个小问题,当你要赋值的cell正处于编辑状态的时候,针对该cell的所有代码将被忽略,赋值失败。(如当A1格处于编辑状态时,用代码对A1赋值将没有任何效果)

所以如何判断Excel是否处于编辑状态,成为解决这个问题的关键。很多人都曾试图找一个事件能在Excel进入编辑状态的时候触发,让程序能够得到通知。但是Excel至少可以通过四种方法进入编辑状态:

·         双击一个cell

·         按F2

·         选中一个cell,直接输入

·         选中一个cell,单击激活公式栏的输入框

Excel只提供了一个Worksheet. BeforeDoubleClick能够帮助我们检测到第一个事件,对于另外三个,我们无能为力。怎么办?

           当时困惑了很久,但是后来突然发现,当Excel处于编辑状态的时候,工具栏上很多很多的按钮都会被禁用。这下问题就简单了,选取一个按钮,获取它的句柄,在我们给cell赋值之前,测试这个按钮的Enabled状态,如果为false,表明Excel正处于编辑状态,调用API将Excel窗口激活,再给程序发送一个ESC键以退出编辑状态,然后实行赋值。整个代码如下:(我选择了Format Painter按钮来测试它的Enable状态。关于如何获得一个按钮的句柄,本blog上有文章详细解释,见 :“无敌的CommandBar和它的Control”)

        private Excel.Application app = null;

        private object missing = Type.Missing;



        public Form1()

        {

            InitializeComponent();

        }



        private void Form1_Load(object sender, EventArgs e)

        {

            app = Marshal.GetActiveObject("Excel.Application") as Excel.Application;

        }



        [DllImport("User32.Dll")]

        public static extern void SetForegroundWindow(int h);



private void button1_Click(object sender, EventArgs e)

        {

            try

            {               

                if (!app.CommandBars["Standard"].Controls["&Format Painter"].Enabled)

                {

                    SetForegroundWindow(app.Hwnd);

                    app.SendKeys("{ESC}", missing);

                }

                app.get_Range("A1", missing).Value2 = "Test";

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

测试以上Demo:关闭电脑中所有Excel的实例,新打开一个Excel,运行本程序。切换回Excel,使A1格处于编辑状态。切换到本程序,点击button1,会看到Excel的窗口被激活,并且A1的值变为“Test”。




资料来源:学网(www.xue5.com),原文地址资:http://www.xue5.com/itedu/200802/106140_2.html

--------------------------------------------------------------------------------

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-2-24 11:47 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-9-8 09:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个方法不错,学习了。请教一下,如果想在编辑状态的时候用vba输入单元格内容该怎么办?能办到吗?

TA的精华主题

TA的得分主题

发表于 2011-3-17 14:07 | 显示全部楼层
最后一种方法我使用时遇到了超出值预期范围的情况..求解..

TA的精华主题

TA的得分主题

发表于 2011-11-1 13:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
玉清 发表于 2011-3-17 14:07
最后一种方法我使用时遇到了超出值预期范围的情况..求解..

最后一种方法 是 vb.net 的代码,你照猫画虎??

TA的精华主题

TA的得分主题

发表于 2015-5-3 14:32 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-2 06:11 , Processed in 0.043940 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表