有些 Excel 或工程量软件里的数据并不是连续区域,没法直接用 Excel 公式一次求和。素材里的“累计求和”工具提供了一个很实用的思路:每次复制当前选中内容,把数字追加到一个悬浮计算框里,并自动计算总和。

这种工具适合处理零散数据、间断行、跨软件复制出来的数值。它不是替代 Excel 公式,而是补足“人工挑选多个位置再汇总”的场景。

一、最小思路:复制选中内容并累加

#Requires AutoHotkey v1.1
#NoEnv
#SingleInstance Force
SendMode, Input

sum := 0

F1::
    Clipboard := ""
    SendInput, ^c
    ClipWait, 1
    if ErrorLevel
        return

    value := RegExReplace(Clipboard, "[^0-9.\-]")
    if (value = "")
        return

    sum += value
    ToolTip, 当前累计:%sum%
return

F2::
    sum := 0
    ToolTip, 已清零
return

这是最小版本:复制、提取数字、累加、显示结果。实际使用时,还需要处理多行多列、公式表达式、中文括号、备注文本等情况。

二、为什么要备份剪贴板

前台工具经常会用 Ctrl+C,但直接覆盖剪贴板会影响用户。更稳的写法是先备份,再复制,处理完恢复。

ClipSaved := ClipboardAll
Clipboard := ""
SendInput, ^c
ClipWait, 1
if ErrorLevel
{
    Clipboard := ClipSaved
    ClipSaved := ""
    return
}

text := Clipboard
Clipboard := ClipSaved
ClipSaved := ""

如果工具使用频率很高,这个细节会明显改善体验。

三、多个数字可以拼成表达式

素材脚本的高级点在于:它不是简单累加一个数,而是把复制到的多行数据拼成表达式,再计算。这样可以保留用户看到的计算过程。

expr := ""
items := StrSplit(text, [A_Tab, Chr(10), Chr(13)])
for index, raw in items
{
    v := Trim(raw)
    if (v = "")
        continue

    v := RegExReplace(v, "[^0-9.+\-*/()]")
    if (v != "")
        expr .= expr ? "+" v : v
}

MsgBox, % "表达式:" expr

如果要允许乘除、括号和小数,就要比单纯提取数字更谨慎。中文括号、中文句号、备注里的数字都可能干扰计算。

四、悬浮窗口比 MsgBox 更适合长期使用

累计求和工具通常会在 Excel 或其他软件前台反复使用,MsgBox 会打断操作。更好的体验是做一个置顶小 GUI,显示表达式和结果。

Gui, +AlwaysOnTop +ToolWindow
Gui, Font, s11
Gui, Add, Edit, w260 h180 vExpr
Gui, Show, NA, 累计求和
return

UpdateExpr(text) {
    GuiControl,, Expr, %text%
}

长期工具尽量不要频繁弹窗,用 ToolTip、GUI、状态栏会更顺手。

五、实战注意事项

  • 复制前清空剪贴板,并使用 ClipWait
  • 处理完成后恢复用户剪贴板。
  • 对中文括号、中文句号、备注内容做清洗。
  • 不要直接执行来源不明的表达式,至少限制允许字符。
  • 针对特定软件可以用 #IfWinActive 限制热键范围。

结语

累计求和工具的价值在于贴近前台工作流:用户看到哪里,就复制哪里;脚本负责把零散数据汇总起来。它特别适合工程量、报价、清单核算等场景,也能帮助新手理解 AHK 如何把剪贴板、GUI 和数据处理结合起来。

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