【问题标题】:Excel Macro recording "Too many line continuations" errorExcel 宏录制“续行过多”错误
【发布时间】:2020-01-28 17:52:57
【问题描述】:

我正在编写一个宏,除了做其他事情外,它还应该过滤一长列由正数和负数组成的数据。这些数字可以是任何值,不一定是介于 -4095 和 4095 之间的所有值,但整个列的长度会有所不同,最多超过 800,000 行。我想过滤掉列中的任何数字,即 -4095、1、2、3、4 或 4095。 手动执行此操作很容易使用过滤器选项并取消选中我想要遗漏的数字,但将其记录到宏会在大约 230 个数字后导致错误“行继续过多”。显然这是因为宏列出了它在列中留下的数字,而不是它删除的数字。我知道 25 条物理线路的限制,并且我应该在每行中添加更多数字,但是我怎样才能做到这一点而不必输入超过 8100 个不同的数字——大多数数字长,每个数字都用引号括起来,每个数字之间有一个逗号?这将带我永远! 我知道完成此过程的其他代码方法,但它们可能需要超过 45 分钟才能完成大文件。过滤过程要快得多,通常在大约 30 秒内完成,即使是大文件也是如此。我也尝试过其他过滤条件,但似乎没有其他方法。

Columns("C:C").Select
Selection.AutoFilter
ActiveSheet.Range("$C$4:$C$82784").AutoFilter Field := 1, Criteria1 := Array("0" _
    ,"-1","10","-10","100","-100","1000","-1000","1001","-1001","1002","-1002", _
    "1003","-1003","1004","-1004","1005","-1005","1006","-1006","1007","-1007", _
    "1008","-1008","1009","-1009","101","-101","1010","-1010","1011","-1011","1012" _
    ,"-1012","1013","-1013","1014","-1014","1015","-1015","1016","-1016","1017", _
    "-1017","1018","-1018","1019","-1019","102","-102","1020","-1020","1021", _
    "-1021","1022","-1022","1023","-1023","1024","-1024","1025","-1025","1026", _
    "-1026","1027","-1027","1028","-1028","1029","-1029","103","-103","1030", _
    "-1030","1031","-1031","1032","-1032","1033","-1033","1034","-1034","1035", _
    "-1035","1036","-1036","1037","-1037","1038","-1038","1039","-1039","104", _
    "-104","1040","-1040","1041","-1041","1042","-1042","1043","-1043","1044", _
    "-1044","1045","-1045","1046","-1046","1047","-1047","1048","-1048","1049", _
    "-1049","105","-105","1050","-1050","1051","-1051","1052","-1052","1053", _
    "-1053","1054","-1054","1055","-1055","1056","-1056","1057","-1057","1058", _
    "-1058","1059","-1059","106","-106","1060","-1060","1061","-1061","1062", _
    "-1062","1063","-1063","1064","-1064","1065","-1065","1066","-1066","1067", _
    "-1067","1068","-1068","1069","-1069","107","-107","1070","-1070","1071", _
    "-1071","1072","-1072","1073","-1073","1074","-1074","1075","-1075","1076", _
    "-1076","1077","-1077","1078","-1078","1079","-1079","108","-108","1080", _
    "-1080","1081","-1081","1082","-1082","1083","-1083","1084","-1084","1085", _
    "-1085","1086","-1086","1087","-1087","1088","-1088","1089","-1089","109", _
    "-109","1090","-1090","1091","-1091","1092","-1092","1093","-1093","1094", _
    "-1094","1095","-1095","1096","-1096","1097","-1097","1098","-1098","1099", _
    "-1099","11","-11","110","-110","1100","-1100","1101","-1101","1102","-1102", _

【问题讨论】:

  • 也许帮助栏可以解决这个问题?将数据与您要排除的值匹配,而不是根据真或假过滤该列。
  • 您的数字是否没有模式(除了使用相同的- 和+),您可能可以在公式/循环中生成?
  • 谢谢大家的建议。我尝试运行小循环公式和帮助列来解决这个问题。尽管它们取得了成功,但它们大大增加了处理时间。这些测试只是试图对 250 个数字而不是我需要的 8100 个数字进行排序。循环需要 45 多分钟才能完成,而过滤选项则在几秒钟内完成。我可能错了,但似乎任何通过逐个单元格向下逐列来解决问题的公式都会根据总行数产生巨大的时间延迟。
  • 一旦助手中的公式就位,您想要手动计算或将单元格更改为值而不是公式。否则,它对您的处理过于繁重,将涉及数组公式(我假设)

标签: excel vba filter limit


【解决方案1】:

唉,我发现我想做的事情是不可能的。

我打开了一个空白的 Excel 页面并创建了一行从 -4090 到 4095 的数字。然后我将其保存为 .csv 文件,用写字板打开它并使用查找/替换功能替换所有逗号 ( ,) 在引号 (", ") 中带有逗号和空格。这给了我根据需要格式化的所有 8,191 个数字。然后我复制了整个内容并将其粘贴到宏的 Autofilter 数组中。灾难接踵而至。显然,除了函数的 25 行限制之外,还有一个单独的行长度限制为 1024 个字符。复制的数字达到了 1024 的限制,然后绕到下一行。这种情况一直持续到所有数字都被粘贴进去。不幸的是,行长度限制远远超过了 - 加起来 66 行,远远超过了 25 行的限制。现在整个函数都是红色的,失效了。

除非有人有任何其他想法,否则看起来循环或辅助列可能是唯一可行的选项。

【讨论】:

  • 实际上,您应该将属于您的问题的所有信息都包含在您的原始帖子中。答案应该只包含原始问题的解决方案(根据How to Answer)。
【解决方案2】:

最简单的方法是辅助列。想象一下下图中的 A 列中的数据:

图 1:您要在工作表 DataSheet 中过滤的数据示例。

然后将您想要从该数据中排除的所有数字放入另一个工作表并将其命名为ExcludeList。

图 2:将所有要排除的数据放入 ExcludeList(这样您就可以轻松地对其进行编辑,而无需更改 VBA 代码)。

然后使用以下公式在数据工作表中添加辅助列

=IF(IFERROR(MATCH(A:A,ExcludeList!A:A,0),0)>0,TRUE,FALSE)

这样A:A 指向您要过滤的数据,ExcludeList!A:A 指向您要排除的数字列表。现在,在您要排除的数据值旁边有一个 TRUE,在您要显示的数据旁边有一个 FALSE。

图 3:为您的数据添加一个帮助列,可用于过滤。

现在您可以轻松过滤该帮助列

ThisWorkbook.Worksheets("DataSheet").Columns("A:B").AutoFilter Field:=2, Criteria1:="FALSE"

并且所有应该排除的数据都是不可见的:

图 4:过滤后的数据,没有排除列表中的值。

【讨论】:

    【解决方案3】:

    再次感谢大家的建议,但在沉睡之后,我找到了一个快速且更适合我的应用程序的解决方案。 我已经习惯了使用主页选项卡中的过滤器选项,并且完全忽略了数据选项卡上高级过滤器选项的存在!在对该功能的 VBA 代码进行了一些研究后,我想出了以下解决方案:

    'Copies Column headings from "A9:O9" to "G1:U1"
        Range("A9:O9").Select
        Selection.Copy
        Range("G1:U1").Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
    'Sets filter parameters for column "B" in Column "H"
        Range("H2").Value = "<-4095"
        Range("H3").Value = ">4095"
        Range("H4").Value = ">3"
        Range("H5").Value = "<1"
    'Advanced Filter of data based on above parameter values for "B" column
        Range("A9:O" & LastRow).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
        Range("G1:U5"), Unique:=False
    ' Clears the parameter contents from cells "G1" thru "U5"
        Range("G1:U5").Select
        Selection.ClearContents
    

    我的数据从 B9 开始,因此我能够将空白单元格 G1 到 U5 用于临时标准范围。 它就像一个魅力!

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 2017-11-01
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多