用 AutoHotkey 批量从 Excel 取值和赋值
不太爽的一点:从Excel取值,整数后面会加上 .0
,一直没好的处理方法!只能用 delete0 函数进行二次加工
直接上 AutoHotkey v2-beta 的示例代码
xl := ox()
st := xl.ActiveSheet
;赋值
rs := 3 ;行数
cs := 2 ;列数
;要用 ComObjArray 创建二维数组
arrA := ComObjArray(12, rs, cs)
arrA[0, 0] := 1 ;NOTE 下标从0开始
arrA[0, 1] := 2
arrA[1, 0] := 3
arrA[1, 1] := 4
arrA[2, 0] := 5
arrA[2, 1] := 6
;值写到同大小区域的单元格中
st.range("A1:B3").value := arrA
;取值(TODO 由于vba机制,这种取值,整数后面会有 .0,所以要专门用 delete0 函数数理)
arrV := st.range("A1:B3").value ;NOTE 下标从1开始
vA2 := delete0(arrV[1,1])
vB4 := delete0(arrV[3,2])
msgbox(vA2 . "`n" . vB4)
ox(winTitle:="ahk_class XLMAIN") {
if WinExist(winTitle)
ctlID := ControlGetHwnd("EXCEL71")
else
return ComObject("Excel.application")
numput('Int64',0x20400, 'Int64',0x46000000000000C0, IID_IDispatch:=buffer(16))
dllcall("oleacc\AccessibleObjectFromWindow", "ptr",ctlID, "uint",0xFFFFFFF0, "ptr",IID_IDispatch, "ptr*",win:=ComValue(9,0), 'HRESULT')
loop {
try
return win.application
catch
ControlSend("{escape}", "EXCEL71")
}
}
delete0(num) {
if (num ~= "^-?\d+\.\d+$") {
if (num ~= "\.\d{8,}$") ;小数位太多的异常
num := round(num+0.00000001, 6)
return rtrim(RegExReplace(num, "\.\d*?\K0+$"), ".")
} else
return num
}