问题:如何让这个宏运行得更快?
我将数据下载到一个工作簿中。数据由变量列表(列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
答案 0 :(得分:1)
欢迎使用StackOverflow。
对于将来的问题,你应该提供一些关于这个问题的更多信息:例如,对于这个问题,你可能已经包含了你所拥有的症状(运行需要多长时间?),你是什么&# 39;已经尝试过已经解决了这个问题(你做了什么研究,并且做了什么帮助?),以及其他相关细节(比如你的数据集有多大?)。
以下所有内容均未使用您的代码进行测试,但考虑到您没有重写使用字典,所有这些都应该是安全的,如Tim所暗示的那样:
Application.ScreenUpdating = False
和Application.Calculation = xlCalculationManual
。务必在最后重新打开它们。dim
,r
和mainwsrow
的{{1}}声明移出循环(因此它们只标注一次,而不是每次循环)。lastrow
:强烈输入此变量应该有助于提高性能,因为它当前是未变暗的并且默认为变体(如果我正确读取,它将始终返回数据集中的字符串)< / LI>
curstr
。激活和选择项目总是需要额外的时间,而且我不认为你的代码在编写时需要它。您生成的代码可能如下所示:
mainws.Activate
那应该让你分道扬。
答案 1 :(得分:0)
如何将每个非主表单VLOOKUP()
添加到主表(检查是否存在变量),然后按找到的值排序,最后找到错误,然后将它们复制到主表。
然后,在主表中插入公式列2,3..wscount + 1
IFERROR(VLOOKUP('variable', SheetN!$A$1:$B$x, 2, 0), "")
- 这将找到现有变量的值
最后用主页上的vlookup复制范围,然后将其粘贴为值 - 瞧,我认为它比逐个单元格检查要快得多。
以上都是用VBA完成的。