Excel中禁用鼠标--宏
在使用报表工具包时,我想在数据写入Excel文档的时候,鼠标被禁用,即鼠标位于Excel文档的区域时被完全禁用,或者被置于"忙"的状态.背景:
1,我知道可以设置Excel不可见,但我想在写的时候可以同时可以进行别的Excel文档工作,此时禁用目标Excel文档的鼠标功能就很有必要;
2,写完之后,不再禁用鼠标.
宏可以实现我的要求,但我不会,哪位可以帮忙处理一下??
谢谢.
Labc
[ 本帖最后由 labc 于 2008-1-28 19:40 编辑 ] setbusy.vi unset busy.vi 这个只能禁用LV application的鼠标,当用鼠标点击Excel文档的标题时,鼠标仍然可以单击或右击Excel文档内部的单元格.
Labc :( ,这样的啊。。。还以为只要检测下,鼠标是不是移动到excel档的区域,然后set busy就可以了。。。。那还真有点困难了。。。我去看下宏怎么实现 我不会操作宏,在网上搜索了一下,也没有找到现成的.
下面是个链接,可以便于搜索相关的资料:
http://labviewsearch.com/
Labc 禁用是一个麻烦的事,不过设定它只能在一个区域还是可以的
如图,用这个API可以使指针限制到指定区域
通过这个方式,也可以实现鼠标只能在我们的程序窗口中使用
[ 本帖最后由 lgh269 于 2008-1-29 22:27 编辑 ] 这种方法会影响其它程序的运行或者是说影响工作.我的本意就是在使用报表工具包时不影响正常的office文档编辑工作.
变通一下思路:
模板文件不能用鼠标进行编辑,但可以使用程序写入数据,即在写入数据的过程中,用鼠标点击任何一个单元格都不会有反应;数据写入完毕后另存为其它名字的文件并去掉这项限制.
这样不就可以了吗?
问题是我不知道怎么增加和去除这种限制.
Labc 理解错了,
你用宏吧
Sub Subli()
Range("A1:A1").Locked = False
'将A1设为可编辑主要是防止出现提示框
ActiveSheet.EnableSelection = xlUnlockedCells
ActiveSheet.Protect UserInterfaceOnly:=False
End Sub
上面这段代码主要是通过EXCEL的工作表保护功能实现 你提供的这段代码将工作表锁死了,程序不能向表格中写入数据,会报错的.
错误-2146827284发生于 Excel_Insert_Table.vi->Append Text Table to Report.vi->Excel Easy Table (str).vi:1->insert data into Excel(add sheet).vi中的Exception occured in Microsoft Office Excel: 您试图更改的单元格或图表受保护,因而是只读的。
若要修改受保护单元格或图表,请先使用“撤消工作表保护”命令(在“审阅”选项卡的“更改”组中)来取消保护。可能会提示您输入密码。Help Path is C:\Program Files\Microsoft Office\Office12\2052\XLMAIN11.CHM and context 0
该错误代码未定义。没有对该代码的说明,或者连线输入的数值并非对应于错误输入的错误代码。
能否禁用鼠标?请再仔细看一下我的要求,谢谢.
Labc
[ 本帖最后由 labc 于 2008-1-30 20:58 编辑 ] 其实我还是不是很理解你的应用。下面是我的理解:
你的lv程序和excel文档是一起打开的 ,然后在lv中用报表工具包往你打开的excel文档写数据?
你希望用户在这个数据写入过程中,不能操作目标excel文档(即接受数据的excel文档),但可以操作其它的excel文档是不是?
如果上述是正确的,那么,你是不是可以打开两个excel的application对象呢?其中一个的visible设置为false,接受数据输入,另外一个为true,供你自己操作? 飞雨天说的不错,
实在不明白你的应用,EXCEL不是数据库,同一时间只能有一个用户操作
见意你还是想想其它方法吧
还有一个,禁用鼠标须要挂钩子,实现不太方便,
设鼠标为忙,只是显示出来,实际中还是能应用的
系统中的一些忙是底层控制机制,还有一些程序中实现是同时禁用了窗口
设置鼠标等侍图标代码
Private Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As Long) As Long
Private Declare Function SetCursor Lib "user32" (ByVal hCursor As Long) As Long
Sub subli()
SetCursor (LoadCursor(0, 32514))
End Sub
[ 本帖最后由 lgh269 于 2008-1-31 11:38 编辑 ]
回复 10# 的帖子
LV只打开一个Excel对象.说具体一点,
第一种情况,现在正在编辑 A.xls, 某个时刻LV打开了 template.xls开始自动向里面写入数据, 此时你可能会看到template.xls不停的刷新(或晃动),如果你感到好奇或者是不小心, 鼠标在 template.xls的某个单元格点了一下,不管是单击或者是右击, 不管是EXE程序或者是调试状态,程序都不会报错.但是,当你将template.xls另存为 B.xls,程序一般都会报错或者是丢失了很多数据.
第二种情况,即LV先自行打开一个Excel(template.xls), 然后用户打开了别的Excel A.xls开始操作,此时......(与第一种情况相同).
如何完全避免用户自发的Excel文档编辑和LV对Excel文档进行编辑(写数据可以理解为"编辑"吧)之间的矛盾?
这就是我发本贴的原因.我想做实现LV在操作template.xls时,用户自发的对template.xls的任何鼠标动作template.xls都视而不见.
Labc
[ 本帖最后由 labc 于 2008-1-31 13:42 编辑 ] 关注中,大家一起来想想办法~嘿。。。。 有人告诉我:
SubMouseWait()
Application.Cursor = xlWait
End Sub
经测试,仍然无法满足我的要求,只是将鼠标设置成等待的样子.
附上解除Wait的宏:
SubMouseDefault()
Application.Cursor = xlDefault
End Sub
Labc
[ 本帖最后由 labc 于 2008-1-31 15:15 编辑 ] 我查看了一下Excel VBA编程指南,里面对鼠标的Available只能读,不能写,所以不能通过更改其属性的方法来禁用.
那可以这样处理,忽略鼠标单击,双击,右击template.xls的事件不就行了??
附件是Application.SheetBeforeDoubleClick 事件和Application.SheetBeforeRightClick 事件在Excel2007中的帮助文件.可以通过创建一个新的子vi来完成这个功能.
我觉得离成功不远了.
页:
[1]
2