从表格读取数据的自动化模板

在编写自动化办公脚本时,经常需要从Excel表格中读取每行数据,再到网页或程序中进行处理。 这个模板可以后台读取Excel数据,及时写入执行结果,并统计成功的数量显示在屏幕顶部,有助于自动化编程。

在编写自动化办公脚本时,经常需要从Excel表格中读取每行数据,再到网页或程序中进行处理。
这个模板可以后台读取Excel数据,及时写入执行结果,并统计成功的数量显示在屏幕顶部,有助于自动化编程。

;------------------------------
;  从表格读取数据的自动化模板  By FeiYue
;
;  1、读取的是当前表格的当前分表,所以任务栏别有两个表格和中途切换分表
;  2、在表格第一列插入一列空列用于写入结果,即结果只会写入第一列
;  3、每次写入结果都会保存表格,文件很大时会比较耗时,所以要尽量小
;------------------------------

读取数据:
CoordMode, ToolTip
ToolTip, % "已经完成:" . 统计结果("ok"), A_ScreenWidth//2-150, 0

arr:=读取当前行()
结果:=arr.1
序号:=arr.2
姓名:=arr.3
身份证:=arr.4
电话:=arr.5

if (结果="ok")
{
  转到下一行()
  Goto, 读取数据
}
if (姓名="")
{
  MsgBox, 4096,, 已运行完毕!
  Exit
}
return

F1::
Gosub, 读取数据
if StrLen(身份证)!=18
{
  ok值:="身份证错误"
  ; Goto, 下一个
}
;------------------------
MsgBox, 4096,, % "正在处理:" 序号 "`t" 姓名 "`t" 身份证 "`t" 电话
;------------------------
ok值:="ok"
下一个:
转到下一行(ok值)
Goto, F1
return

Esc:: ExitApp


;======== 下面是函数 ========


读取当前行(读取列数="") {
  objExcel:=Excel_Get()
  y:=objExcel.ActiveCell.Row
  sh:=objExcel.ActiveSheet
  if (读取列数="")
    读取列数:=sh.UsedRange.Column+sh.UsedRange.Columns.Count-1
  arr:=[]
  SetBatchLines, % (bak:=A_BatchLines)?"-1":"-1"
  Loop, % 读取列数
    Try arr[A_Index]:=sh.Cells(y,A_Index).Text
  SetBatchLines, %bak%
  return arr
}

转到下一行(写入结果="") {
  objExcel:=Excel_Get()
  y:=objExcel.ActiveCell.Row
  if (写入结果 != "")
  {
    objExcel.Cells(y,1).Value := 写入结果
    objExcel.ActiveWorkBook.Save
  }
  objExcel.Cells(y+1,1).Select
}

统计结果(结果="ok") {
  objExcel:=Excel_Get()
  sh:=objExcel.ActiveSheet
  y:=sh.UsedRange.Row
  h:=sh.UsedRange.Rows.Count
  ; 多单元格的Value返回二维数组,数字的Value值可能与带显示格式的不一样
  arr:=sh.Range(sh.Cells(y,1), sh.Cells(y+h-1,1)).Value
  h:=arr.MaxIndex(1), w:=arr.MaxIndex(2)
  sum:=0
  SetBatchLines, % (bak:=A_BatchLines)?"-1":"-1"
  Loop, % h
    Loop, % w+0*(y:=A_Index)  ; 这里其实只有一列(w=1),只为了示范
      if (arr[y, A_Index] = 结果)
        sum++
  SetBatchLines, %bak%
  return sum
}

;-- 获取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}}人
人已捐赠
其他教程案例

AHK统一鼠标中键或触摸板中键关闭标签页(浏览器,资源管理器)

2022-2-27 12:23:14

其他

定时按键(GUI版)

2022-2-28 15:48:02

2 条回复 A文章作者 M管理员
  1. 五分钟

    ???

  2. AHK中文社区
    1河许人给您打赏了¥25
个人中心
购物车
优惠劵
有新私信 私信列表
搜索