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 }

  

posted @ 2019-04-10 09:02  火冷  阅读(585)  评论(0编辑  收藏  举报