【问题标题】:How do I expedite this Excel VBA macro?如何加速这个 Excel VBA 宏?
【发布时间】:2011-07-26 22:53:54
【问题描述】:

我知道一点 VBA,但我一直在寻找更聪明的方法(你们工作的方式!!)。

这就是我想要做的。我必须处理一些具有

的数据

年份 |月 |天 |小时 |分钟 |数据1 |数据2.... |数据N

每个都在一个单独的列中,并且有数千行。 “数据”列的数量由用户在运行时定义(至少 1 和最大 100)。数据可以具有任何时间步长,例如每分钟、5分钟、10分钟、每小时、每天等等。然后用户指定输出数据间隔,该间隔总是大于输入数据间隔。

所以,这个宏应该在用户指定的时间间隔内写入数据。必须将输出时间步之间的每一列中的数据加在一起。见以下两张表:

输入:

Yr     Mth  Day Hr  Min Data_1  Data_2

2010    2   7   8   0   1.01    2.01

2010    2   7   8   5   1.02    2.02

2010    2   7   8   10  1.03    2.03

2010    2   7   8   15  1.04    2.04

2010    2   7   8   20  1.05    2.05

2010    2   7   8   25  1.06    2.06

2010    2   7   8   30  1.07    2.07

2010    2   7   8   35  1.08    2.08

2010    2   7   8   40  1.09    2.09

2010    2   7   8   45  1.10    2.10

2010    2   7   8   50  1.11    2.11

2010    2   7   8   55  1.12    2.12

2010    2   7   9   0   1.13    2.13

2010    2   7   9   5   1.14    2.14

输出:

Yr     Mth  Day Hr  Min Data_1  Data_2

2010    2   7   8   0   1.01    2.01

2010    2   7   8   15  3.09    6.09

2010    2   7   8   30  3.18    6.18

2010    2   7   8   45  3.27    6.27

2010    2   7   9   0   3.36    6.36

因此,输入数据是每 5 分钟一次,输出数据必须是每 15 分钟一次。连续 15 分钟间隔之间的每一行数据必须相加。

我使用两个循环水平和垂直遍历并在每一步将值写入电子表格,所以我让这个东西工作。但是真的很慢。

我们将不胜感激任何加快此过程的帮助。

提前致谢

-MP

** 我用来将处理后的数据写入文本文件的代码:

Open FName For Output Access Write As #FNum
For RowNdx = StartRow To endrow
done = Int((RowNdx / endrow) * 100)
Application.StatusBar = "Exporting *.gag file... (" & done & " % done )"
    WholeLine = ""
    For colNdx = StartCol To Endcol
        If Sheets("Output").Cells(RowNdx, colNdx).Text = "" Then
            CellValue = ""
        Else
           CellValue = Sheets("Output").Cells(RowNdx, colNdx).Text
        End If
        WholeLine = WholeLine & CellValue & sep
    Next colNdx
    WholeLine = Left(WholeLine, Len(WholeLine) - Len(sep))
    Print #FNum, WholeLine
Next RowNdx
Close #FNum

有没有办法一次将范围写入文本文件。我试图避免循环。

感谢您的帮助

MPD

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    你试过设置吗

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    

    在你的循环之前?

    记得设置

    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    

    循环完成后。

    您还可以将所有数据保存到循环中的数组中,然后将整个数组作为范围写入输出电子表格,而不是逐个单元格地写入值,这看起来就是这样现在做。

    【讨论】:

    • 您好 PaulR,感谢您的回复。我关闭了屏幕更新,但我没有尝试过 Application.Calculation = xlCalculationManual 我会试一试。是的,现在我正在逐个单元地编写。我想将所有数据存储到数组并在最后写入,但问题是直到运行时我才会知道有多少数据列,所以我不知道要启动多少个数组。有什么想法吗?
    • 如果数据按列排列,您可以使用 Worksheets("YourWorksheetName").UsedRange.Columns.Count 获取列数,然后将数组大小设置为该长度。它也适用于行,只需使用 Worksheets("YourWorksheetName").UsedRange.Rows.Count.
    • 感谢 PaulR。我最终使用范围而不是循环遍历每个单元格。这大大加快了进程。使用我的旧代码处理数据大约需要 4 分钟,现在大约需要 40 秒。我需要将处理后的数据导出到文本文件中,这花费了最长时间。有没有办法直接将范围导出到文本文件(而不是写每一行)?我试图在这里发布我的代码,但它的代码格式很糟糕。因此,我在原始帖子的末尾插入了用于写入文本文件的代码。感谢您的帮助
    • 如果您想以不同的格式将范围保存到文件中,您可以将该范围复制到“临时”工作表,然后将该“临时”工作表保存为文本文件。请参阅此处:msdn.microsoft.com/en-us/library/…,此处:msdn.microsoft.com/en-us/library/… 和此处mrexcel.com/archive/Controls/19982.html,以获取有关如何执行此操作的提示。希望对您有所帮助!
    • PaulR,非常感谢您的快速回复!我实际上尝试过这样做。但问题是当我将工作表保存到 .txt 文件时,我的工作簿名称更改为 *.txt。我可以在最后将工作簿重新保存为 *.xls,但它会提示我是否要替换现有文件。我想知道是否有办法 - 防止我的​​工作簿被重命名为 *.txt 并将草稿表导出为 *.txt 或 - 在将书保存回 *.xls 时禁用“替换现有文件”提示跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多