VBA 宏 (Excel) 中出现错误“过程太大”

2024-03-08

我正进入(状态Procedure too Large Error在 VBA 宏中。

我使用的是 MS-Excel 2003。


如果您的程序超过 64kb,您将收到该错误。这些是您可以压缩代码的一些事情

1)摆脱重复的代码。看这个例子

Sub Sample()
    Range("A1") = "Blah Blah"
    Range("A2") = "Blah Blah"
    Range("A3") = "Blah Blah"
    Range("A4") = "Blah Blah"
    Range("A5") = "Blah Blah"
    Range("A6") = "Blah Blah"
    Range("A7") = "Blah Blah"
End Sub

这段代码可以写成

Sub Sample()
    For i = 1 To 7
        Range("A" & i) = "Blah Blah"
    Next i
End Sub

另一个例子

Sub Sample()
    Range("A1") = (Range("A1") * 10) + (Range("A1") + 30) + (Range("A1") / 30)
    Range("A5") = (Range("A5") * 10) + (Range("A5") + 30) + (Range("A5") / 30)
    Range("A11") = (Range("A11") * 10) + (Range("A11") + 30) + (Range("A11") / 30)
    Range("A6") = (Range("A6") * 10) + (Range("A6") + 30) + (Range("A6") / 30)
    Range("A8") = (Range("A8") * 10) + (Range("A8") + 30) + (Range("A8") / 30)
    Range("A56") = (Range("A56") * 10) + (Range("A56") + 30) + (Range("A56") / 30)
End Sub

这段代码可以写成

Sub Sample()
    Range("A1") = GetVal(Range("A1"))
    Range("A5") = GetVal(Range("A5"))
    Range("A11") = GetVal(Range("A11"))
    Range("A6") = GetVal(Range("A6"))
    Range("A8") = GetVal(Range("A8"))
    Range("A56") = GetVal(Range("A56"))
End Sub

Function GetVal(rng As Range) As Variant
    GetVal = (rng.Value * 10) + (rng.Value + 30) + (rng.Value / 30)
End Function

这将确保您减少空间并且不会编写重复的代码。

2)如果您通过宏生成代码,那么您可能会得到类似的结果。摆脱无用的代码,例如ActiveWindow.ScrollRow = 8968

Option Explicit

'~~> This procedure fills Excel's 10000 cells with random values and then removes the duplicates
Sub FillExcelCells()
    Dim rowCount As Long

    '~~> Activate the necesary Sheet
    Sheets("Sheet1").Activate

    '~~> Loop through all the cells and store random numbers
    For rowCount = 1 To 10000
        Sheets("Sheet1").Range("A" & rowCount).Select
        Sheets("Sheet1").Range("A" & rowCount).Value = Int((10000 - 1) * Rnd() + 1)
    Next rowCount

    '~~> Sort the Range
    Sheets("Sheet1").Range("A1").Select
    Sheets("Sheet1").Range(Selection, Selection.End(xlDown)).Select
    Application.CutCopyMode = False

    Range(Selection, Selection.End(xlDown)).Select
    ActiveWindow.SmallScroll Down:=-39
    ActiveWindow.ScrollRow = 9838
    ActiveWindow.ScrollRow = 9709
    ActiveWindow.ScrollRow = 9449
    ActiveWindow.ScrollRow = 8968
    ActiveWindow.ScrollRow = 8319
    ActiveWindow.ScrollRow = 7245
    ActiveWindow.ScrollRow = 6003
    ActiveWindow.ScrollRow = 4818
    ActiveWindow.ScrollRow = 4040
    ActiveWindow.ScrollRow = 3317
    ActiveWindow.ScrollRow = 3076
    ActiveWindow.ScrollRow = 2521
    ActiveWindow.ScrollRow = 2298
    ActiveWindow.ScrollRow = 2113
    ActiveWindow.ScrollRow = 1724
    ActiveWindow.ScrollRow = 1372
    ActiveWindow.ScrollRow = 1038
    ActiveWindow.ScrollRow = 872
    ActiveWindow.ScrollRow = 668
    ActiveWindow.ScrollRow = 538
    ActiveWindow.ScrollRow = 464
    ActiveWindow.ScrollRow = 446
    ActiveWindow.ScrollRow = 427
    ActiveWindow.ScrollRow = 409
    ActiveWindow.ScrollRow = 390
    ActiveWindow.ScrollRow = 353
    ActiveWindow.ScrollRow = 334
    ActiveWindow.ScrollRow = 297
    ActiveWindow.ScrollRow = 279
    ActiveWindow.ScrollRow = 242
    ActiveWindow.ScrollRow = 223
    ActiveWindow.ScrollRow = 205
    ActiveWindow.ScrollRow = 168
    ActiveWindow.ScrollRow = 149
    ActiveWindow.ScrollRow = 112
    ActiveWindow.ScrollRow = 94
    ActiveWindow.ScrollRow = 57
    ActiveWindow.ScrollRow = 20
    ActiveWindow.ScrollRow = 1

    Selection.Sort Key1:=Sheets("Sheet1").Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal

    '~~> Delete duplicates
    For rowCount = 10000 To 2 Step -1
        Sheets("Sheet1").Range("A" & rowCount).Select
        If Range("A" & rowCount).Value = Range("A" & rowCount - 1).Value Then
            Sheets("Sheet1").Rows(rowCount).Delete shift:=xlUp
        End If
    Next rowCount
End Sub

上式可以写成

'~~> This procedure fills Excel's 10000 cells with random values and then removes the duplicates
Sub FillExcelCells()
    Dim rowCount As Long

    With Sheets("Sheet1")
        '~~> Loop through all the cells and store random numbers
        For rowCount = 1 To 10000
            .Range("A" & rowCount).Value = Int((10000 - 1) * Rnd() + 1)
        Next rowCount

        '~~> Sort Range
        .Range("A1:A10000").Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

        '~~> Delete duplicates
        For rowCount = 10000 To 2 Step -1
            If .Range("A" & rowCount).Value = .Range("A" & rowCount - 1).Value Then
                .Rows(rowCount).Delete shift:=xlUp
            End If
        Next rowCount
    End With
End Sub

3)声明你的对象,这样你就不必继续重复它们。看这个例子

Sub Sample()
    Range("A1").Select
    ActiveCell.FormulaR1C1 = "sdasds"
    Range("A1").Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    Selection.Font.Bold = True
    Selection.Font.Italic = True
    Selection.Font.Underline = xlUnderlineStyleSingle
    With Selection
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlBottom
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
End Sub

这可以写成

Sub Sample()
    Dim ws As Worksheet, rng As Range

    Set ws = Sheet1

    Set rng = ws.Range("A1")

    With rng
        .FormulaR1C1 = "sdasds"
        With .Interior
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .Color = 65535
            .TintAndShade = 0
            .PatternTintAndShade = 0
        End With
        .Font.Bold = True
        .Font.Italic = True
        .Font.Underline = xlUnderlineStyleSingle
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlBottom
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
End Sub

4)如果需要的话,分解你的程序。并从第一个过程调用第二个过程

5)避免使用.Select and .Activate它们不仅会使您的代码变慢,而且如果广泛使用,还会占用代码中的大量空间。如何避免在 Excel VBA 宏中使用 Select https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VBA 宏 (Excel) 中出现错误“过程太大” 的相关文章

  • 实体框架、dll、excel

    我用C 编写了Excel使用的dll 该dll是COM注册的 我与 Excel 的连接没有问题 该 dll 使用实体框架 5 从 SQL Server 数据库检索数据 如果我通过控制台应用程序运行该 dll 则该 dll 工作正常 但是当我
  • 运行时错误“1004”:对象“_Global”的方法“Range”失败

    我在使用 Excel 时遇到问题 有一个生成参考号的表单 但是当我尝试生成参考号时 它有一条错误消息 运行时错误 1004 对象 Global 的方法 Range 失败 当我点击 调试 按钮时 它显示的代码如下 它突出显示代码第 4 行的错
  • 如何将 HTML 表格导出为 .xlsx 文件

    我有一个关于导出的问题HTML表格 as an xlsx文件 我做了一些工作 现在我可以将其导出为xls 但我需要将其导出为xlsx 这是我的 jsFiddle https jsfiddle net 272406sv 1 https jsf
  • 即使 Excel 中存在多条记录,CopyFromRecordset 也仅复制并粘贴第一行

    我有一个包含表格数据的 Excel 工作表 strSQL SELECT S FIELD NAME1 S FIELD NAME2 S FIELD NAME3 from SourceData A1 IV6 S Dim cn as ADODB C
  • Excel 宏与 Javascript

    我希望使用 Javascript 中的宏而不是默认的 VBA 来操作 Excel 电子表格 我可以使用以下 VBA 代码执行 javascript 代码 javascript to execute Dim b As String b fun
  • 基于多个动态过滤条件过滤Excel范围

    我想过滤数据集 考虑几个可以根据可能值列表动态更改的过滤条件 我有过滤条件team其具有以下值 Team A Team B ALL 其中 ALL 是代表所有团队的通配符 对于第二个标准release 如果我想在过滤器中包含多个版本 则值之间
  • 在 VBA 中使用 getElementsByClassName

    我正在使用此代码从页面获取产品名称 页面代码是 div class product shop col sm 7 div class product name h1 Claro Glass 1 5 L Rectangular Air Tigh
  • MS Access 中的舍入

    VBA Access 中舍入的最佳方法是什么 我目前的方法是利用Excel方法 Excel WorksheetFunction Round 但我正在寻找一种不依赖Excel的方法 请注意 VBA Round 函数使用 Banker 舍入 将
  • java实现excel价格、收益率函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 VBA 中按键对字典进行排序

    我使用 VBA 创建了一个字典CreateObject Scripting Dictionary 将源单词映射到要在某些文本中替换的目标单词 这实际上是为了混淆 不幸的是 当我按照下面的代码进行实际替换时 它将按照源单词添加到字典中的顺序替
  • Excel VBA 导出到文本文件。需要删除空行

    我有一个工作簿 使用以下脚本将其导出到文本文件 它工作正常 但是当我打开文本文件时 末尾总是有一个空行 这导致我在生成此文本文件后运行的另一个脚本出现问题 有关如何从导出中删除空行的任何帮助 Code Sub Rectangle1 Clic
  • 查找并替换目录中所有 Excel 文件工作簿中的字符串

    我正在编写 VBA 代码来替换位于特定目录中的多个 Excel 文件 工作簿 中的特定字符串 我尝试在 Stack Overflow 上搜索 找到答案 但这与通过 Excel 中的宏替换文本文件中的字符串有关 相同的链接是查找并替换文件中的
  • MS Access 执行 POST Web 请求

    在我的 MS Access 应用程序中 我需要定期向我的网络服务器发送一批信息 我不需要任何花哨的东西 比如 SOAP XML RPC 或任何东西 只需一个简单的 POST 页面请求就足够了 我用谷歌搜索了一下 但找不到任何真正有用的东西
  • VBA根据单元格的值是否为零显示/隐藏行

    我有一个 Excel 工作表 我想根据另一个单元格中的值隐藏或取消隐藏某些行 简而言之 整个事情应该取决于单元格中的值C2 D2 E2 If C2 is blank我想rows 31 to 40被隐藏 如果是的话不为空 他们需要是visib
  • laravel中过滤后如何导出excel?

    我想仅导出视图刀片中过滤的数据 我正在使用 Laravel 7 和 maatwebsite excel 3 1 和 PHP 7 4 2 我浏览了文档并应用了这个 View a href class btn btn success i cla
  • 无法将 Excel 值的类型“double”转换为“string”

    我正在加载 Excel 文件 如网络上许多地方所示 OpenFileDialog chooseFile new OpenFileDialog chooseFile Filter Excel files xls xlsl xls xlsx i
  • MS Access - 粘贴确认事件后

    当用户将记录直接粘贴到数据表子报表中时 是否可以在显示粘贴确认消息后捕获事件 我需要它能够在审计表中创建新记录时进行记录 通过捕获更新前 更新后和插入事件 我可以轻松创建已添加的记录集合 准备将详细信息插入审核日志 但是在所有这些事件触发后
  • 使用 pythoncom 在 Python 进程之间编组 COM 对象

    我希望有人可以帮助我从 Python 进行编组跨进程调用到 Excel 我有一个通过 Python 启动的 Excel 会话 我知道当需要从单独的 Python 进程访问它时 该会话将会启动并运行 我已经使用编组让一切按预期工作CoMars
  • 使用 Apache POI Excel 写入特定单元格位置

    如果我有一个未排序的参数 x y z 列表 是否有一种简单的方法将它们写入使用 POI 创建的 Excel 文档中的特定单元格 就好像前两个参数是 X 和Y 坐标 例如 我有如下行 10 4 100 是否可以在第 10 行第 4 列的单元格
  • 如何使用VBA根据条件删除Excel中的行?

    我目前正在构建一个宏来格式化数据表并删除不适用的数据行 具体来说 我希望删除列 L ABC 的行以及删除列 AA DEF 的行 到目前为止 我已经实现了第一个目标 但还没有实现第二个目标 现有代码是 Dim LastRow As Integ

随机推荐

  • 用例之间的 UML 关系(扩展/包含)

    我不太理解以下主题 因为它与我读到的内容有点含糊 Inlcude就像对下一部分的引用一样 没有它 用例就不完整 这部分应该从更多地方引用 否则它的使用没有意义 但我见过一个例子 其中 include 仅在某些 IF 语句中为真 例如 添加新
  • 从 pandas dataframe 列更新 sqlalchemy orm 列的正确方法是什么

    我已经加载了一些数据并修改了数据框中的一列 并且想要更新数据库以反映更改 I tried db session query sqlTableName update sqlTableName sql col name pdDataframe
  • 使用 Android Native、Android Studio 和改造在本地网络中信任我自己的自签名证书

    我正在创建一个简单的 Android 应用程序 将在封闭的本地网络中使用 在此本地网络中 正在运行 Flask 服务器 该服务器配置为通过 nginx 代理使用自签名证书 服务器的后端应用程序使用自签名证书可以正常工作 我已经使用浏览器和邮
  • Rails 三种开发模式的区别

    Rails 中的三种模式有什么区别 In development mode Rails reloads models each time a browser sends in a request so the model will alwa
  • 从python文件中提取函数并将其写入其他文件

    我已经编写了一个包含很多函数的 python 文件 我决定将它们全部拆分到不同的文件中 并使用它们的名称和相同的导入 代码看起来像这样 import class TestExtractors unittest TestCase def te
  • 元素隐式具有“any”类型,因为类型“Window”没有索引签名?

    我试图在 Typescript 中创建一个 Factory 类 但遇到以下错误 src ts classes Factory ts 8 10 错误 TS7017 元素隐式具有 any 类型 因为类型 Window 没有索引签名 我尝试搜索此
  • 有没有办法从java调用imagej宏(.ijm)(即将宏存储为字符串并使用imagej的java控件执行它)?

    将问题反转为 如何从 ImageJ 宏调用 执行 java 程序 每当我写 imagej 时 我都会提到斐济 当然 一个简单的解决方案是从 java 字符串创建 ijm 并使用以 ijm 作为参数的系统调用来调用 imagej 但我正在寻找
  • Supervisord celery 的用户不正确

    我有一些使用 celery 运行的定期任务 由supervisord 守护 但是在尝试为我为supervisord 进程设置的用户的主目录中创建一个目录后 我收到了 权限被拒绝 错误 看完之后os environ在运行芹菜任务中的字典我注意
  • 打开 PDF:WPF

    我想通过单击按钮打开 PDF 文件 我会将 PDF 文件保留在项目的解决方案 命名空间中 谁能给我解决这个问题吗 要启动标准 PDF 查看器 您只需启动一个外部进程即可 Process proc new Process proc Start
  • 控制ipython历史长度

    标题几乎说出了我想要的 我想在我的 ipython history 中有超过 1000 行的输入 这意味着将显示较旧的按向上箭头命令 这可能吗 可能在 ipython config 的某个地方 Thanks In http 2sn org
  • 返回私有项目的私有内部模块给出“公共接口中的私有类型”错误

    在下面的示例中 模块outer有一个私有类型Private和一个私有内部模块inner inner能够访问Private 因为子模块可以访问其父模块的私有项目 即使它们不是公共停车 inner定义一个函数not really public
  • ASP.NET MVC 每个View的静态内容的路由策略

    我希望系统中的每个视图都有一些静态帮助内容 我考虑的方法是为静态内容设置一个并行结构 并创建一个路由来重写该结构的 URL 例如 Controllers Help Account Login htm Create htm Models Vi
  • PHP中重定向头之后的所有代码都会被执行吗?

    所以我知道一般的经验法则是在 PHP 中进行标头重定向后 您应该调用 exit 以避免运行额外的代码 但我想知道您是否将代码放在重定向标头之后 如果它会always run 我正在对 Google Analytics 中跟踪推荐的各种方法进
  • Android:以编程方式调用 nDrawDisplayList

    我的应用程序相当复杂 有两到三个大约 500 毫秒的延迟 TraceView 显示在GLES20Canvas nDrawDisplayList 这些腿只在执行某些步骤时出现一次 之后一切都会顺利进行 有没有办法在活动创建 恢复时调用此调用
  • 无法使用 Mobility 按 Rails 中翻译的列进行排序

    这个问题是基于一个issue https github com shioyama mobility issues 169发布到 Mobility GitHub 项目 Context Rails 5 0 6 Mobility 0 4 2 带表
  • 有没有办法让后台任务通知终端打印新的提示?

    我想写一个程序can作为后台任务运行 即my thing 这将在必要时完美地提供相关输出 然而 对于打印到终端的后台任务 总是存在这种令人讨厌的小进展 bash 3 2 my thing bash 3 2 my thing bash 3 2
  • Javascript正则表达式删除空格

    所以我正在为 JQuery 编写一个小插件来删除字符串中的空格 see here http jsfiddle net rlemon ge59E function stripSpaces function str var reg new Re
  • 在 grep/ack 中转义括号

    我想查找字符串 methodname 但我无法转义 我怎样才能得到 grep methodname or ack grep methodname to work 有两件事可以解释 外壳 以及ack grep 您可以使用 or 为了逃避 来自
  • python信号,中断系统调用

    我正在用 python 编写一个程序 我希望从 stdin 读取并处理 sigchld 我想在输入时处理任一输入 而不旋转 推测性地对输入进行采样 我无法在每次调用时捕捉到被信号中断的系统调用 我是否以错误的方式处理这个问题 我可以在不尝试
  • VBA 宏 (Excel) 中出现错误“过程太大”

    我正进入 状态Procedure too Large Error在 VBA 宏中 我使用的是 MS Excel 2003 如果您的程序超过 64kb 您将收到该错误 这些是您可以压缩代码的一些事情 1 摆脱重复的代码 看这个例子 Sub S