用 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
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM