清理Excel单元格中不可见的垃圾字符


;-----------------------------------------------
; 清理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
}

给TA捐赠
共{{data.count}}人
人已捐赠
案例

输入法状态切换(简易板)

2021-5-20 10:28:18

其他案例

隐藏桌面图标

2021-7-14 8:29:10

8 条回复 A文章作者 M管理员
  1. user12121

    学习了

  2. jnndz

    学习了

  3. 略略略丷

    学习了

  4. ahk01

    学习了

  5. 啊牧

    感谢分享!学习了!

  6. Ghostjack

    学习了

  7. AHK中文社区
    1河许人给您打赏了¥2
  8. oeasy

    学习了

个人中心
购物车
优惠劵
有新私信 私信列表
搜索