;-----------------------------------------------
; 清理Excel单元格中不可见的垃圾字符 By FeiYue
;
; 说明:可能是为了防止拷贝泄密,看上去正常的数据
; 中加入了随机的垃圾字符,白色最小字体,需要清除
;-----------------------------------------------
; 热键左Win键启动
LWin::
Try {
; 获取Excel的COM对象
objExcel:=Excel_Get()
; 让Excel不要刷新
objExcel.ScreenUpdating := 0
; 获取选择范围的单元格总对象
Selection:=objExcel.Selection
; 获取选择范围的行列数
h:=Selection.Rows.Count
w:=Selection.Columns.Count
; 提示百分比进度的变量
tip_index:=0, tip_all:=w*h, tip_old:=""
Loop, % h
{
y:=A_Index
Loop, % w
{
; 提示百分比进度,ToolTip比较耗时,但显示进度很重要
if (++tip_index*100//tip_all)!=tip_old
ToolTip, % (tip_old:=tip_index*100//tip_all) "/100"
x:=A_Index, clear:=0, s:="'"
; 获取每一个单元格对象,获取单元格的值
k:=Selection.Cells(y,x), v:=k.Value
Loop, Parse, v
{
; 获取单元格对象每个字符的颜色值,看是否黑色
if (k.Characters(A_Index,1).Font.Color = 0)
s.=A_LoopField ; 收集所有黑色字符到变量
else clear:=1
}
; 如果有其他颜色的字符,就要替换本单元格内容
if (clear=1)
{
; 调整单元格的字体颜色、字号与正常的一致
k.Font.Color := 0
k.Font.Size := 9
k.Value:=s
}
}
}
; 让Excel刷新
objExcel.ScreenUpdating := 1
MsgBox, 4096,, 执行完毕!, 1
ToolTip
}
return
;-- 获取Excel窗口的COM对象
Excel_Get(WinTitle="ahk_class XLMAIN")
{
static obj
Try
if (obj.Version)
return obj
return obj:=Office_Get(WinTitle)
}
;-- 获取所有Office窗口的COM对象 By FeiYue
Office_Get(WinTitle="")
{
static h:=DllCall("LoadLibrary", "Str","oleacc", "Ptr")
WinGet, list, ControlListHwnd, % WinTitle ? WinTitle : "A"
For i,hWnd in StrSplit(list, "`n")
{
ControlGetPos, x, y, w, h,, ahk_id %hWnd%
if (w<100 or h<100)
Continue
if DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd
, "UInt", 0xFFFFFFF0, "Ptr", 0*(VarSetCapacity(IID,16)
+NumPut(0x0000000000020400,IID,"Int64")
+NumPut(0x46000000000000C0,IID,8,"Int64"))+&IID, "Ptr*", pacc)=0
{
Acc:=ComObject(9, pacc, 1)
Try
if (Acc.Application.Version)
return Acc.Application
}
}
MsgBox, 4096,, Error: Can't Get Object From ACC !
Exit
}
学习了
学习了
学习了
学习了
感谢分享!学习了!
学习了
学习了