将多个工作表中的数据编译到单个工作簿中的主工作表 - VBA Excel宏

时间:2014-04-09 18:05:06

标签: excel vba excel-vba

问题:如何让这个宏运行得更快?

我将数据下载到一个工作簿中。数据由变量列表(列a中的字符串)及其值(字符串或列b中的数字)组成。所有“可能的”配置变量都存在于主工作表中。每个工作表共享一些变量,但不是全部,并且可能有一个需要添加到变量主列表的唯一变量。我使用这个宏在一个主工作表中编译数据:

Sub CompareVariableData()

Dim mainws As Worksheet *'establishes worksheet variable*
Set mainws = Worksheets(1) *'sets mainws as the master for comparison*
Dim wscount As Long *'counts total number of worksheets in the workbook*
Dim curwsnum As Long *'tracks the current worksheet being compared*
wscount = ActiveWorkbook.Worksheets.Count *'gives wscount a value equal to the number of     worksheets*

For curwsnum = 2 To wscount *'loop from the second worksheet to the last active worksheet*
Dim r As Long *'variable for row in the compared worksheet*
Dim mainwsrow As Long *'variable counter for rows in the master worksheet*


mainws.Cells(1, curwsnum) = Worksheets(curwsnum).Name *'adds the name of the compared worksheet to first row of the first worksheet*

 For r = 3 To Worksheets(curwsnum).Range("A" & Rows.Count).End(xlUp).Row *'loops from the third row of compared worksheet to the last used row*

    curstr = Worksheets(curwsnum).Cells(r, 1) *'creates a variable curstr that will capture the variable name from the first column*

    mainws.Activate *'activates the main ws for the next loop*

 If Not IsError(Application.Match(curstr, mainws.Columns("A:A"), 0)) Then *'if there is no error in a match between the compare variable and master variable list*
    *'found*
    mainws.Cells(Application.Match(curstr, mainws.Columns("A:A"), 0), curwsnum) = Worksheets(curwsnum).Cells(r, 2) *'adds the value of the variable from the compare worksheet to the master worksheet*
 Else
    *'Not found*
    Dim lastrow As Long *'makes a variable lastrow to add a 'notfound' variable to the end of the master list*
    lastrow = mainws.Range("A" & Rows.Count).End(xlUp).Row + 1 *'finds the last row*

    mainws.Cells(lastrow, 1) = curstr *'adds the variable to the master list*
    mainws.Cells(lastrow, curwsnum) = Worksheets(curwsnum).Cells(r, 2) *'adds the value from the compared worksheet*
    mainws.Cells(lastrow, 1).Interior.Color = vbYellow *'highlights the row*
 End If
 Next

Next

End Sub

2 个答案:

答案 0 :(得分:1)

欢迎使用StackOverflow。

对于将来的问题,你应该提供一些关于这个问题的更多信息:例如,对于这个问题,你可能已经包含了你所拥有的症状(运行需要多长时间?),你是什么&# 39;已经尝试过已经解决了这个问题(你做了什么研究,并且做了什么帮助?),以及其他相关细节(比如你的数据集有多大?)。

以下所有内容均未使用您的代码进行测试,但考虑到您没有重写使用字典,所有这些都应该是安全的,如Tim所暗示的那样:

  1. 正如蒂姆·威廉姆斯上面所建议的那样,在代码的开头使用Application.ScreenUpdating = FalseApplication.Calculation = xlCalculationManual。务必在最后重新打开它们。
  2. dimrmainwsrow的{​​{1}}声明移出循环(因此它们只标注一次,而不是每次循环)。
  3. 明确标注lastrow:强烈输入此变量应该有助于提高性能,因为它当前是未变暗的并且默认为变体(如果我正确读取,它将始终返回数据集中的字符串)< / LI>
  4. 取消curstr。激活和选择项目总是需要额外的时间,而且我不认为你的代码在编写时需要它。
  5. 您生成的代码可能如下所示:

    mainws.Activate

    那应该让你分道扬。

答案 1 :(得分:0)

如何将每个非主表单VLOOKUP()添加到主表(检查是否存在变量),然后按找到的值排序,最后找到错误,然后将它们复制到主表。
然后,在主表中插入公式列2,3..wscount + 1
IFERROR(VLOOKUP('variable', SheetN!$A$1:$B$x, 2, 0), "") - 这将找到现有变量的值 最后用主页上的vlookup复制范围,然后将其粘贴为值 - 瞧,我认为它比逐个单元格检查要快得多。
以上都是用VBA完成的。