AutoHotkey 函数对象的 Bind 方法绑定参数的应用
近期在写Excel数据批处理函数,想提取某列的每个数据是否匹配某某条件的所有单元格。
这种需求比较多,比如判断的值有:单元格值,字体颜色,单元格颜色等等,
判断条件有:相同,不同,正则,或在某多行字符串内等。
如果都写出来,可能会有N个函数,所以想统一用一个函数来循环,判断条件则用传入的函数来区分。
本文主要判断的是:判断某列数据是否和在多行字符串内。
比如我把产品的货号存到记事本文件(记事本文件相对固定,如果复制到当前Excel表的某列也可以),
然后判断单元格的货号是否和记事本内容匹配,这样就能提取出所有的单元格并存到arr供后面环节使用
rng := ComObjActive("Excel.Application").ActiveSheet.Range("A1:A20") fun := Func("getLine").Bind(strFromTxt) ;核心,把函数getLine的第一个参数固定(strFromTxt用FileRead获取) arrRes := loopCheckValueByFunc(rng, fun) Msgbox(arrRes.Length() . "`n" . arrRes[1].Address . "`n" . arrRes[arrRes.Length()].Address)
Return
getLine(str1, str2) ;被判断的str1放第一个参数,可被Bind固定 { Loop Parse, str1, "`n", "`r" { If (A_LoopField = str2) Return A_Index } } ;遍历rng,找到符合函数条件的单元格 loopCheckValueByFunc(rng, funcObj, condition:=True) { xl := rng.Application xl.ScreenUpdating := False arr := [] For cellLoop In rng { ;核心语句,每次循环,只需要传入当前单元格的值即可判断 ;这句进行相应修改就能判断其他条件。 If (funcObj.Call(cellLoop.Value) = condition) arr.Push(cellLoop) } xl.ScreenUpdating := True Return arr }