;by 小熊
;游戏名(大耳朵丷气功)
;QQ2323484117
;~ MsgBox % Ceil("2.5")
;~ MsgBox % 运算括号内公式("向上取整((3/0.3))-1")
;~ return
SetWorkingDir %A_ScriptDir%
gosub,菜单
CoordMode,Mouse,Client
读写=-1
筛选结果=全部
变量名可用字符= [^\Q+-*/^√=()()“”"",\E\s]
正则选项:="iS)"

if !FileExist(A_ScriptDir "\套公式设置.ini") {
  _=
  (
[示例]
设置页=示例
定位点x=0.387346
定位点y=0.508911
文本框1=/n/金额=18310/n//n/*不含税金额=金额/(1+税率)/n//n/*税额=不含税单价*税率/n//n/数量=10/n//n/*不含税单价=不含税金额/数量/n//n/税率=0.13
文本框2=
  ) ; */
  FileAppend, %_%, % A_ScriptDir "\套公式设置.ini"
}

IniRead,设置页,%A_ScriptDir%\套公式设置.ini,示例,设置页
IniRead,定位点x,%A_ScriptDir%\套公式设置.ini,示例,定位点x,0.3
IniRead,定位点y,%A_ScriptDir%\套公式设置.ini,示例,定位点y,0.5
if (定位点x<0 or 定位点x>0.97)
  定位点x=0.3
if (定位点y<0.01 or 定位点y>0.929)
  定位点y=0.5
gosub,读设置
界面:
Gui, Destroy
gui, font, s10
IniRead, 设置页表,%A_ScriptDir%\套公式设置.ini
StringReplace, 设置页表, 设置页表,`n,|,all
Loop, Parse,设置页表,|
{
  if (设置页= A_LoopField)
    设置页n:=A_Index
}
Gui, Add, ComboBox, x0 y0 w300 h18 r20 v设置页  Choose%设置页n% g切换设置2,%设置页表%
Gui, Add, ComboBox, x500 y0 w180 h18 r20 v筛选结果 g切换筛选,全部
Gui, Add, Button, x193 y275 w20 h20 g移动窗口 v按钮,+
Gui, Add, Button, x320 y0 w150 h19 w40 h20 g保存设置,保存
Gui, Add, Button, x370 y0 w150 h19 w40 h20 g新建,新建
Gui, Add, Checkbox, x420 y0 w150 h19 w80 h19 v显示总量 Checked1 g显示结果,显示总量
Gui, Add, Button, x800 y0 w150 h19 w40 h20 g删除,删除
Gui, Add, Edit, x203 y285 w490 h264 v文本框2 g文字更改2 WantTab,%文本框2%
Gui, Add, Edit, x2 y19 w200 h530 v文本框1 g文字更改2 WantTab,%文本框1%
Gui, Add, Edit, x203 y19 w490 h265 v显示文本 WantTab , 显示套出来的公式
Gui, Add, Edit, x203 y285 w490 h264 v文本框2筛选 g文字更改2 WantTab,%文本框2筛选%
Gui, Add, Edit, x2 y19 w200 h530 v文本框1筛选 g文字更改2 WantTab,%文本框1筛选%
GuiControl, Hide,文本框1筛选
GuiControl, Hide,文本框2筛选
窗口宽=704
窗口高=584
x:=定位点x*窗口宽
y:=定位点y*窗口高
Gui, Show , w698 h555,自定义公式/参数/显示
Gui, +0x40000 +MaximizeBox
gosub, 调整窗口
gosub 文字更改
gosub 切换设置
OnMessage(0x05, "调整控件大小")
return
切换设置时切换筛选:
切换筛选:
if(筛选结果!="全部"){
gosub,更新筛选修改
}
GuiControl,,文本框1筛选,
GuiControl,,文本框2筛选,
文本框1筛选=
文本框2筛选=
Gui,Submit ,NoHide
if(筛选结果=""){
筛选结果=全部
GuiControl,,筛选结果,|全部||%筛选列表%
}
含关键字的一行:=筛选结果
if(筛选结果="全部"){
GuiControl, Show,文本框1
GuiControl, Show,文本框2
GuiControl, Hide,文本框1筛选
GuiControl, Hide,文本框2筛选
}else{
GuiControl, Hide,文本框1
GuiControl, Hide,文本框2
GuiControl, Show,文本框1筛选
GuiControl, Show,文本框2筛选
gosub,保留关键字行
}
if (A_ThisLabel="切换筛选")
gosub 文字更改
return
更新筛选修改:
Loop,parse,文本框1筛选,`n
{
  RegExMatch(A_LoopField,"O" 正则选项 "(?<name>" 变量名可用字符 "+)(?==)(?<val>.*)",变量)
  if 变量.value("name"){
  文本框1:=RegExReplace(文本框1,"m" 正则选项 "(*ANYCRLF)" "(?<!" 变量名可用字符 ")" 变量.value("name") "=.*"  "|^" 变量.value("name") "=.*", 变量.value("name") . 变量.value("val"))
  }
}
Loop,parse,文本框2筛选,`n
{
  RegExMatch(A_LoopField,"O" 正则选项 "(?<name>" 变量名可用字符 "+)(?==)(?<val>.*)",变量)
  if 变量.value("name"){
  文本框2:=RegExReplace(文本框2,"m" 正则选项 "(*ANYCRLF)" "(?<!" 变量名可用字符 ")" 变量.value("name") "=.*"  "|^" 变量.value("name") "=.*", 变量.value("name") . 变量.value("val"))
  }
}
GuiControl,,文本框1,%文本框1%
GuiControl,,文本框2,%文本框2%
return
保留关键字行:
文本框1h:= StrSplit(文本框1,"`n",A_Space . A_Tab)
文本框2h:= StrSplit(文本框2,"`n",A_Space . A_Tab)
当前搜索位置:=RegExMatch(含关键字的一行,"" 正则选项 "" 变量名可用字符 "+", Match)
第一个关键字位置:=当前搜索位置
关键字:=Match "`n"
Loop,{
  当前搜索位置:=RegExMatch(含关键字的一行,"" 正则选项 "" 变量名可用字符 "+", Match,当前搜索位置+strlen(Match))
  if((InStr(含关键字的一行,match)=第一个关键字位置) or !当前搜索位置){
    break
  }
  关键字.=Match "`n"
}
文本框1筛选数组:=""
文本框2筛选数组:=""
文本框1筛选数组:=[]
文本框2筛选数组:=[]

Loop,10{
  关键字长度:=StrLen(关键字)
  Loop,parse,关键字,`n
  {
    if (A_LoopField="")
    continue
    k:=文本框1h.Length()+1
    Loop % k
    {
      k--
      RegExMatch(文本框1h[k],"" 正则选项 "" 变量名可用字符 "+", Match)
      if (Match=A_LoopField){
        if(文本框1筛选数组[k]){
          continue
        }else{
          文本框1筛选数组[k]:=1
        }
        MatchPos2=0
        Loop,{
          RegExMatch(文本框1h[k],"O" 正则选项 "(?<!" 变量名可用字符 ")(" 变量名可用字符 "+)(?!" 变量名可用字符 ")", Match,MatchPos2+1)
          if(MatchPos2>=Match.Pos(1))
          break
          关键字.=Match.Value(1) "`n"
          MatchPos2:=Match.Pos(1)
        }
      }
    }
    k:=文本框2h.Length()+1
    Loop % k
    {
      k--
      RegExMatch(文本框2h[k],"" 正则选项 "" 变量名可用字符 "+", Match)
      if (Match=A_LoopField){
        if(文本框2筛选数组[k]){
          continue
        }else{
          文本框2筛选数组[k]:=1
        }
        MatchPos2=0
        Loop,{
          RegExMatch(文本框2h[k],"O" 正则选项 "(?<!" 变量名可用字符 ")(" 变量名可用字符 "+)(?!" 变量名可用字符 ")", Match,MatchPos2+1)
          if(MatchPos2>=Match.Pos(1))
          break
          关键字.=Match.Value(1) "`n"
          MatchPos2:=Match.Pos(1)
        }
      }
    }
  }

}until (关键字长度=StrLen(关键字))
文本框1筛选=
文本框2筛选=
Loop % 文本框1h.Length()
{
  if(StrLen(文本框1h[A_Index])<2 or 文本框1筛选数组[A_Index])
  文本框1筛选.=文本框1h[A_Index] "`n"
}
Loop % 文本框2h.Length()
{
  if(StrLen(文本框2h[A_Index])<2 or 文本框2筛选数组[A_Index])
  文本框2筛选.=文本框2h[A_Index] "`n"
}
GuiControl,,文本框1筛选,%文本框1筛选%
GuiControl,,文本框2筛选,%文本框2筛选%
return
删除:
Gui,Submit ,NoHide
MsgBox,4,,是否删除"%设置页%"所有公式!
IfMsgBox Yes
{
IniDelete,%A_ScriptDir%\套公式设置.ini,%设置页%
设置页表:=RegExReplace(设置页表,"" 正则选项 "^" 设置页 "[|]|(?<=[|])" 设置页 "[|]|[|]" 设置页 "$")
GuiControl,,设置页,|%设置页表%||
gosub 切换设置
}
return
新建:
Gui,Submit ,NoHide
if (!RegExMatch( "|" 设置页表 "|","" 正则选项 "\|" 设置页 "\|") and RegExMatch( 设置页,"" 正则选项 "\.+")){
设置页表.= "|" 设置页
GuiControl,,设置页,%设置页%
IniWrite,`n文本框1=空,%A_ScriptDir%\套公式设置.ini,%设置页%
}
return
调整控件大小()
{
  global 定位点x像素
  global 定位点y像素
  WinGetPos,,,窗口宽,窗口高,自定义公式/参数/显示
  x:=定位点x像素
  y:=定位点y像素
  GuiControl, Move, 文本框1, % "h" 窗口高-60
  GuiControl, Move, 文本框2, % "x" x "y" y "w" 窗口宽-15-x "h" 窗口高-35-y-6
  GuiControl, Move, 显示文本, % "x" x  "w" 窗口宽-15-x "h" y-19
  GuiControl, Move, 文本框1筛选, % "h" 窗口高-60
  GuiControl, Move, 文本框2筛选, % "x" x "y" y "w" 窗口宽-15-x "h" 窗口高-35-y-6
  Sleep 20
}
return
return
移动窗口:
if(i=1){
i=0
return
}
i=1
WinGetPos,,,窗口宽,窗口高,自定义公式/参数/显示
Loop,{
  MouseGetPos,x,y
  gosub, 调整窗口
  Sleep 20
}until getkeystate("Lbutton","P")
定位点x:=(x)/(窗口宽)
定位点y:=(y)/(窗口高)
return
调整窗口:
  GuiControl, Move, 按钮, % "x" x-10 "y" y-10
  GuiControl, Move, 文本框1, % "w" x-2  "h" 窗口高-60
  GuiControl, Move, 文本框2, % "x" x "y" y "w" 窗口宽-15-x "h" 窗口高-35-y-6
  GuiControl, Move, 显示文本, % "x" x  "w" 窗口宽-15-x "h" y-19
  GuiControl, Move, 文本框1筛选, % "w" x-2  "h" 窗口高-60
  GuiControl, Move, 文本框2筛选, % "x" x "y" y "w" 窗口宽-15-x "h" 窗口高-35-y-6
  定位点x像素:=x
  定位点y像素:=y
return
切换设置2:
if(文本2修改过=1){
  文本2修改过=0
MsgBox,4,,是否保存公式修改
IfMsgBox Yes
  选择了保存=1
else
  选择了保存=0
}
切换设置:
GuiControl,,筛选结果,|全部||
筛选结果=
gosub 切换设置时切换筛选
if(选择了保存){
gosub,保存设置
}
选择了保存=0
Gui,Submit ,NoHide
gosub,读设置
GuiControl,,文本框1,%文本框1%
GuiControl,,文本框2,%文本框2%
gosub 文字更改
return

GuiClose:
if(文本2修改过=1){
  MsgBox,4,,是否保存公式修改
  IfMsgBox Yes
  {
  gosub,保存设置
  }
}
ExitApp
return


文字更改2:
文本2修改过=1
文字更改:
中断=0
正在计算=1
Gui,Submit ,NoHide
if(筛选结果!="全部"){
文本框1f:=文本框1筛选
文本框2f:=文本框2筛选
文本框1长度:=StrLen(文本框1f)
文本框2长度:=StrLen(文本框2f)
;~ StringReplace,文本框1筛选,文本框1筛选,%A_Tab%,,All
;~ StringReplace,文本框2筛选,文本框2筛选,%A_Space%,,All
文本框1s:= StrSplit(文本框1筛选,"`n",A_Space . A_Tab)
文本框2s:= StrSplit(文本框2筛选,"`n",A_Space . A_Tab)
}else{
文本框1f:=文本框1
文本框2f:=文本框2
文本框1长度:=StrLen(文本框1f)
文本框2长度:=StrLen(文本框2f)
;~ StringReplace,文本框1,文本框1,%A_Tab%,,All
;~ StringReplace,文本框2,文本框2,%A_Space%,,All
文本框1s:= StrSplit(文本框1,"`n",A_Space . A_Tab)
文本框2s:= StrSplit(文本框2,"`n",A_Space . A_Tab)
}

文本1无变量=""
文本1无变量:=[]
文本2无变量=""
文本2无变量:=[]
正确数量=0
Loop,{
  上一个正确数量:=正确数量
  正确数量=0
  正在修改文本1:=1
  Loop % 文本框1s.Length()
  {
    内容:=文本框1s[A_Index]
     gosub,修改文本
     文本框1s[A_Index]:=内容
    if (中断){
      gosub,文字更改
      return
    }
  }
  正在修改文本1:=0
  Loop % 文本框2s.Length()
  {
    内容:=文本框2s[A_Index]
     gosub,修改文本
     文本框2s[A_Index]:=内容
    if (中断){
      gosub,文字更改
      return
    }
  }
}until (正确数量=上一个正确数量)
显示结果:
显示文本f=
筛选列表=
Loop % 文本框1s.Length()
{
  内容=
  内容:=文本框1s[A_Index]
  gosub,添加显示文本
  if (中断){
    gosub,文字更改
    return
  }
}
Loop % 文本框2s.Length()
{
  内容=
  内容:=文本框2s[A_Index]
  gosub,添加显示文本
  if (中断){
    gosub,文字更改
    return
  }
}

GuiControl,,显示文本,%显示文本f%
if(筛选结果="全部"){
GuiControl,,筛选结果,|全部|%筛选列表%
}
正在计算=0
return
修改文本:
Gui,Submit ,NoHide
if(筛选结果="全部" and (文本框1长度!=StrLen(文本框1) or 文本框2长度!=StrLen(文本框2)))
or (筛选结果!="全部" and (文本框1长度!=StrLen(文本框1筛选) or 文本框2长度!=StrLen(文本框2筛选))){
  中断=1
  return
}
RegExMatch(内容,"O" 正则选项 "(?<flag>\*?)(?<var>.*)=(?<value>.*)", Match)
Loop % 文本框1s.Length()
{
  if(文本1无变量[A_Index] or !RegExMatch(文本框1s[A_Index],"S)=.*[^0-9\Q+-*/^√=()()“”"",\E\s]")){
  正确数量++
  文本1无变量[A_Index]:=1
  continue
  }
  内容2:=文本框1s[A_Index]
   gosub,修改文本2
   文本框1s[A_Index]:=内容2
}
Loop % 文本框2s.Length()
{
  if(文本2无变量[A_Index] or !RegExMatch(文本框2s[A_Index],"S)=.*[^0-9\Q+-*/^√=()()“”"",\E\s]")){
  正确数量++
  文本2无变量[A_Index]:=1
  continue
  }
  内容2:=文本框2s[A_Index]
   gosub,修改文本2
   文本框2s[A_Index]:=内容2
}
return
修改文本2:
RegExMatch(内容2,"(?<==).*",等号右边)
RegExMatch(内容2,".*(?==)",等号左边)
去括号后:=Round(无括号四则运算(运算括号内公式(Match.Value("value"))),4)
if (RegExMatch(等号右边,"" 正则选项 "[""""“”]" Match.Value("var") "[""""“”]")){
  if (RegExMatch(运算括号内公式(Match.Value("value")),"[+-]")
  or RegExMatch(等号右边,"" 正则选项 "√[""""“”]" Match.Value("var") "[""""“”]")
  or RegExMatch(等号右边,"" 正则选项 "\^[""""“”]" Match.Value("var") "[""""“”]")
  or RegExMatch(等号右边,"" 正则选项 "[""""“”]" Match.Value("var") "[""""“”]\^")){
  等号右边f:=RegExReplace(等号右边,"" 正则选项 "[""""“”]" Match.Value("var") "[“”""""]","(" Match.Value("value") ")")
  }else{
  等号右边f:=RegExReplace(等号右边,"" 正则选项 "[""""“”]" Match.Value("var") "[“”""""]",Match.Value("value"))
  }
}else{
  等号右边f:=等号右边
}
  if (RegExMatch(Match.Value("value"),"^[0-9\Q.+-*/^√=()()“”"",\E\s]*(ceiling|向上取整)*[0-9\Q.+-*/^√=()()“”"",\E\s]*$")){ ;公式无变量时替换为结果
  等号右边f:=RegExReplace(等号右边f,"" 正则选项 "(?<!" 变量名可用字符 ")" Match.Value("var") "(?!" 变量名可用字符 ")",(InStr(去括号后,".")?RTrim(RTrim(去括号后,"0"),"`."):去括号后))
  }
  if not Match.Value("var")
  return
StringReplace,内容2,内容2,=%等号右边%,=%等号右边f%,All
return
添加显示文本:
Gui,Submit ,NoHide
if(筛选结果="全部" and (文本框1长度!=StrLen(文本框1) or 文本框2长度!=StrLen(文本框2)))
or (筛选结果!="全部" and (文本框1长度!=StrLen(文本框1筛选) or 文本框2长度!=StrLen(文本框2筛选))){
  中断=1
  return
}
RegExMatch(内容,"O" 正则选项 "(?<flag>\*)(?<shai>.*)=", Match)
if (Match.Value("flag")){
  筛选列表.="|" Match.Value("shai")
  StringTrimLeft,内容,内容,1
  RegExMatch(内容,"(?<==).*",等号右边)
  if (显示总量){
  去0结果:=Round(无括号四则运算(运算括号内公式(等号右边)),4)
  if(instr(去0结果,".")){
  去0结果:=RTrim(去0结果,"0")
  去0结果:=RTrim(去0结果,"`.")
  }
  StringReplace,内容,内容,=, % A_Space . A_Space . A_Space . A_Space . 去0结果 "`n",All
  }else{
  StringReplace,内容,内容,=,`n,All
  }
  显示文本f.=内容 "`n`n"
}
return
保存设置:
读写++
文本2修改过=0
Gui,Submit ,NoHide
if(设置页="")
  return
IniWrite,%设置页%,%A_ScriptDir%\套公式设置.ini,示例,设置页
IniWrite,%定位点x%,%A_ScriptDir%\套公式设置.ini,示例,定位点x
IniWrite,%定位点y%,%A_ScriptDir%\套公式设置.ini,示例,定位点y
读设置:
读写++
if (读写=1){
设置页:=当前设置页
}
读写设置("文本框1",读写)
读写设置("文本框2",读写)
当前设置页:=设置页
读写=-1
return
读写设置(变量名,写或读,默认值:=""){ ;变量名是字符串
  global
  if(写或读=1){
  变量的值:=%变量名%
  StringReplace,变量的值,变量的值,`n,/n/,All
  StringReplace,变量的值,变量的值,%A_Space%,A_Space,All
  IniWrite,%变量的值%,%A_ScriptDir%\套公式设置.ini,%设置页%,%变量名%
  }else{
  IniRead,变量的值,%A_ScriptDir%\套公式设置.ini,%设置页%,%变量名%,%默认值%
  StringReplace,变量的值,变量的值,/n/,`n,All
  StringReplace,变量的值,变量的值,A_Space,%A_Space%,All
  if not(变量的值="Error"){
  %变量名%:=变量的值
  }else{
  %变量名%:=
  }
  return 变量的值
  }
}
return
菜单:
Menu,Tray,NoStandard
Menu,Tray,DeleteAll
Menu,Tray,Add ,&无效的选项,无效标签
Menu,Tray,Add ,&退出,GuiClose,p4
return
无效标签:
return
tc:
ExitApp
return
;~ 无括号四则运算(字符串){
;~ return SM_Solve(字符串)
;~ }
;~ 运算括号内公式(字符串){
  ;~ return 字符串
;~ }



; #Include ahk函数.ahk
; ====================== 以下是函数库 ======================

处理合并单元格1格(变量名,文件名,工作表名,行数,列数){
  global
  i:=列数
  列数:=转字母(列数)
  ;~ ToolTip,%工作表名%z%列数%z%行数%
  if(%变量名%.值[行数,i]="" and objExcel.Workbooks(文件名).WorkSheets(工作表名).Range(列数 . 行数).MergeArea.Address){
  结果:=StrSplit(objExcel.Workbooks(文件名).WorkSheets(工作表名).Range(列数 . 行数).MergeArea.Address,"$",":")
  %变量名%.值[行数,i]:=%变量名%.值[结果[3],x(结果[2])]
  return %变量名%.值[行数,i]
}else{
  return %变量名%.值[行数,i]
}
}
处理合并单元格(工作表名,最大行数,列数){
  global
  j=0
  i:=x(列数)
  loop,%最大行数%{
    j++
    ;~ MsgBox % %工作表名%[j,i]
    if(%工作表名%[j,i]="" and objExcel.WorkSheets(工作表名).Range(列数 . j).MergeCells){
    ;~ if(%工作表名%[j,i]=""){
    结果:=StrSplit(objExcel.WorkSheets(工作表名).Range(列数 . j).MergeArea.Address,"$",":")
    %工作表名%[j,i]:=%工作表名%[结果[3],x(结果[2])]
    ;~ k:=j-1
    ;~ %工作表名%[j,i]=%工作表名%[k,i]
  }
}
}
return
return
搜索或(内容,关键字){
  StringSplit,关键字,关键字,或 ;拆分关键字
  loop,%关键字0%{
    if(InStr(内容,关键字%A_Index%)){
    正确数量++
  }
}
return 正确数量
}
return
搜索表名(表名){
  global
  loop,{
    Excel文本:=objExcel.Sheets(A_Index).Name
    if(InStr(表名,Excel文本) and StrLen(表名)=StrLen(Excel文本)){
    return Excel文本
  }
} until (A_Index>=objExcel.Sheets.Count)
return 0
}
return
搜索表名返回全名(表名){
  global
  loop,{
    Excel文本:=objExcel.Sheets(A_Index).Name
    if(InStr(Excel文本,表名)){
    return Excel文本
  }
} until (A_Index>=objExcel.Sheets.Count)
return 0
}
return
;~ Step1.[取余] 用指定自然数n除以26,得到一个余数m。如果m = 0,置m←26。
;~ Step2.[转换为字符] 将m映射为字符c,映射规则是{1-26}->{A-Z}。然后将c拼接到26进制值s的左边,也就是置s←c + s。
;~ Step3.[去余降幂] 置n←(n–m)/26。如果n > 0,则回到Step1继续执行,否则进入Step4。
;~ Step4.[结束] 返回s。

运算括号内公式(字符串){
  loop,30{
    右括号:=RegExMatch(字符串,"\)",结果)
    左括号:=InStr(字符串,"(",,右括号-StrLen(字符串))
    if(左括号=0 or 右括号=0){
    break
  }
  括号和字符串:=SubStr(字符串,左括号,右括号-左括号+1)
  函数名=
  RegExMatch(字符串,"([^\Q+-*/^√=()()“”"",\E\s]+)(?=\Q" 括号和字符串 "\E)",函数名)
  括号内字符串:=SubStr(括号和字符串,2,StrLen(括号和字符串)-2)
  括号和字符串:=函数名 . 括号和字符串
  ;~ MsgBox % 字符串 "`n" 右括号 "`n" 左括号 "`n" 括号内字符串 "`n" 函数名
  if (函数名="ceiling" or 函数名="向上取整"){
    StringReplace,字符串,字符串,%括号和字符串%, %  Ceil(无括号四则运算(括号内字符串))
  }else if (函数名="INT" or 函数名="向下取整"){
    StringReplace,字符串,字符串,%括号和字符串%, %  Floor(无括号四则运算(括号内字符串))
  }else if (函数名="Max"){
    最大数=0
    StringSplit,数字,括号内字符串,`,
    loop,%数字0%{
      当前数字:=无括号四则运算(数字%A_Index%)
      if (当前数字>最大数){
        最大数:=当前数字
      }
    }
    StringReplace,字符串,字符串,%括号和字符串%, % 最大数
    最大数:=""
  }else if (函数名="取整" or 函数名="Round" ){
    数字1=
    数字2=
    StringSplit,数字,括号内字符串,`,
    StringReplace,字符串,字符串,%括号和字符串%, % Round(无括号四则运算(数字1),数字2)
  }else{
    StringReplace,字符串,字符串,%括号和字符串%, % 无括号四则运算(括号内字符串)
  }
}
return 字符串
}
无括号四则运算(字符串){
  loop,30{
    当前位置 := 0
    上一个数字=
    运算符=
    loop,Parse,字符串,+-*×/^√ ;,%Tab%%A_Space%
    {
      当前位置 += StrLen(A_LoopField) + 1
      上个位置:=当前位置-StrLen(上一个数字)-StrLen(A_LoopField) -1
      上一个运算符:=运算符
      运算符 := SubStr(字符串, 当前位置, 1)
      if(上一个运算符="^"){
      乘法字符串:=SubStr(字符串, 上个位置,StrLen(上一个数字)+1+StrLen(A_LoopField))
      StringReplace,字符串,字符串,%乘法字符串%, % 次方(乘法字符串)
      break
    }
    if(上一个运算符="√"){
    除法字符串:=SubStr(字符串, 上个位置,StrLen(上一个数字)+1+StrLen(A_LoopField))
    StringReplace,字符串,字符串,%除法字符串%, % 开方(除法字符串)
    break
  }
  上一个数字:=A_LoopField
}
}until not(InStr(字符串,"√") or InStr(字符串,"^"))
loop,30{
  当前位置 := 0
  上一个数字=
  运算符=
  loop,Parse,字符串,+-*×/ ;,%Tab%%A_Space%
  {
    当前位置 += StrLen(A_LoopField) + 1
    上个位置:=当前位置-StrLen(上一个数字)-StrLen(A_LoopField) -1
    上一个运算符:=运算符
    运算符 := SubStr(字符串, 当前位置, 1)
    if(上一个运算符="*" or 上一个运算符="×" ){
    乘法字符串:=SubStr(字符串, 上个位置,StrLen(上一个数字)+1+StrLen(A_LoopField))
    StringReplace,字符串,字符串,%乘法字符串%, % 乘法(乘法字符串)
    break
  }
  if(上一个运算符="/"){
  除法字符串:=SubStr(字符串, 上个位置,StrLen(上一个数字)+1+StrLen(A_LoopField))
  StringReplace,字符串,字符串,%除法字符串%, % 除法(除法字符串)
  break
}
上一个数字:=A_LoopField
}
}until not(InStr(字符串,"*") or InStr(字符串,"/") or InStr(字符串,"×"))
loop,30{
  当前位置 := 0
  上一个数字=
  运算符=
  loop,Parse,字符串,+-*/ ;,%Tab%%A_Space%
  {
    当前位置 += StrLen(A_LoopField) + 1
    上个位置:=当前位置-StrLen(上一个数字)-StrLen(A_LoopField) -1
    上一个运算符:=运算符
    运算符 := SubStr(字符串, 当前位置, 1)
    if(上一个运算符="+"){
    加法字符串:=SubStr(字符串, 上个位置,StrLen(上一个数字)+1+StrLen(A_LoopField))
    StringReplace,字符串,字符串,%加法字符串%, % 加法(加法字符串)
    break
  }
  if(上一个运算符="-"){
  减法字符串:=SubStr(字符串, 上个位置,StrLen(上一个数字)+1+StrLen(A_LoopField))
  StringReplace,字符串,字符串,%减法字符串%, % 减法(减法字符串)
  break
}
上一个数字:=A_LoopField
}
}until (not(InStr(字符串,"+") or InStr(字符串,"-"))) or (A_Index>20)
return 字符串
}
减法(字符串){
  loop,Parse,字符串,-,%Tab%%A_Space%
  {
    if(A_Index=1)
    总数:=A_LoopField
    else
      总数-=A_LoopField
  }
  return 总数
}
加法(字符串){
  loop,Parse,字符串,+,%Tab%%A_Space%
  {
    总数+=A_LoopField
  }
  return 总数
}
乘法(字符串){
  总数=1
  loop,Parse,字符串,*×,%Tab%%A_Space%
  {
    总数*=A_LoopField
  }
  return 总数
}
除法(字符串){
  loop,Parse,字符串,/,%Tab%%A_Space%
  {
    if(A_Index=1)
    总数:=A_LoopField
    else
      总数:=总数/A_LoopField
  }
  return 总数
}
return
次方(字符串){
  loop,Parse,字符串,^,%Tab%%A_Space%
  {
    if(A_Index=1)
    总数:=A_LoopField
    else
      总数:=总数**A_LoopField
  }
  return 总数
}
开方(字符串){
  loop,Parse,字符串,√,%Tab%%A_Space%
  {
    总数:=Sqrt(A_LoopField)
  }
  return 总数
}
return
缓存Excel表(工作表名,文件名:=""){
  global objExcel
  Excel内容:=""
  Excel内容:=[]
  if not(文件名)
    文件名:=objExcel.ActiveWorkbook.name
  行数:=objExcel.Workbooks(文件名).WorkSheets(工作表名).UsedRange.Rows.Count
  列数:=objExcel.Workbooks(文件名).WorkSheets(工作表名).UsedRange.Columns.Count
  读取范围:="A1:" . 转字母(列数) . 行数
  Excel内容:=objExcel.Workbooks(文件名).WorkSheets(工作表名).Range[读取范围].value
  Excel公式:=objExcel.Workbooks(文件名).WorkSheets(工作表名).Range[读取范围].FormulaR1C1
  工作表参数:={值:Excel内容,公式:Excel公式,行数:行数,列数:列数,表名:工作表名}
  return 工作表参数
}
return
return
x(zz){
  loop,Parse,zz
  {
    字符值:=Asc(A_LoopField)
    返回值+= 字符值>90?字符值-96:字符值-64
    if(A_Index!=StrLen(zz)){
    返回值*=26
  }
}
return Round(返回值)
}
return
转字母(数值){
  loop,{
    if !(数值 > 0){
      break
    }
    m:=Mod(数值,26)
    if(m=0){
    m:= 26
  }
  字母:=转字母1位(m) . 字母
  数值:=(数值-m)/26
}
return 字母
}
return
转字母1位(数值){
  return Chr(Mod(数值,27)+64)
}
return
更新Excel表值(工作表对象,文件名:=""){
  global objExcel
  if not(文件名)
    文件名:=objExcel.ActiveWorkbook.name
  读取范围:="A1:" . 转字母(工作表对象.列数) . 工作表对象.行数
  objExcel.Workbooks(文件名).WorkSheets(工作表对象.表名).Range[读取范围].FormulaR1C1:=工作表对象.值
  objExcel.Workbooks(文件名).WorkSheets(工作表对象.表名).Range[读取范围].Font.Name := "Arial"
  return
}
return
return
;-- 获取Excel窗口的COM对象  By FeiYue
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 (y<10 or 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 !
MsgBox, 4096,, 请先打开Excel 如已打开Excel`n请检查 开发工具/COM加载项 是否勾选
ExitApp
}
;~ ————————————————
;~ 版权声明:本文为CSDN博主「飞跃-」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
;~ 原文链接:https://blog.csdn.net/xshlong1981/article/details/112337326

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。