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

本文介绍了一个自动化模板,用于从Excel表格读取数据并实时处理,成功次数统计及错误检查。通过实例展示了如何读取数据、验证信息并更新结果,提高办公效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在编写自动化办公脚本时,经常需要从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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值