在编写自动化办公脚本时,经常需要从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
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
???