Excel 为超过500K行运行宏的最佳方法?

Excel 为超过500K行运行宏的最佳方法?,excel,vba,large-data,large-files,Excel,Vba,Large Data,Large Files,我有一个文件,其中有一堆行,其中包含来自不同配置的某些零件号的数据。其中一些零件号在整个文件中重复,在这些重复的零件号中,可能包含某些数据,而有些可能不包含。我试图找到确定文件中某些数据共性的最佳方法。因此,对于公共性,如果一行具有值,另一行为空,则非空白行的值将被放入空白行中。如果这两行上的数据不同,则会更改单元格上的字体颜色,表示此零件编号有两个不同的唯一值,应进行检查 Dim i, j, n As Long Dim lr As Long Dim moaf As Workbook Dim s

我有一个文件,其中有一堆行,其中包含来自不同配置的某些零件号的数据。其中一些零件号在整个文件中重复,在这些重复的零件号中,可能包含某些数据,而有些可能不包含。我试图找到确定文件中某些数据共性的最佳方法。因此,对于公共性,如果一行具有值,另一行为空,则非空白行的值将被放入空白行中。如果这两行上的数据不同,则会更改单元格上的字体颜色,表示此零件编号有两个不同的唯一值,应进行检查

Dim i, j, n As Long
Dim lr As Long
Dim moaf As Workbook
Dim sht As Worksheet

Application.ScreenUpdating = False

Set moaf = Workbooks("MOAF3.xlsb")
Set sht = moaf.Worksheets("Wire Data")

n = InputBox("What column # are you trying to fill in?: ")
lr = Cells(Rows.count, 2).End(xlUp).Row

For i = 2 To lr
    lkup = Cells(i, 2).Value 'sets first lookup value
    Fill = Cells(i, n).Value 'sets the first data value to compare
    If Len(Fill) > 0 Then
        For j = 2 To lr
            lkup2 = Cells(j, 2).Value 'sets the second lookup value
            Fill2 = Cells(j, n).Value 'sets the second value to compare
            If lkup2 = lkup Then 'checks to see if p/ns are same
                If Len(Fill2) = 0 Then 'checks to see if second value is blank
                    Cells(j, n).Value = Fill 'if value is blank the cell takes value of non blank     cell
                ElseIf Fill <> Fill2 Then 'checks to see if the values are non matching and non zero
                    Cells(i, n).Font.ColorIndex = 3 'changes font color of two cells
                    Cells(j, n).Font.ColorIndex = 3 'changes font color of two cells
                End If
            End If
        Next j
    End If
Next i
Application.ScreenUpdating = True
End Sub
尺寸i、j、n与长度相同
变暗lr为长
将moaf设置为工作簿
将sht变暗为工作表
Application.ScreenUpdating=False
设置moaf=工作簿(“MOAF3.xlsb”)
设置sht=moaf.工作表(“导线数据”)
n=输入框(“您要填写的是哪一列?:”)
lr=单元格(Rows.count,2).结束(xlUp).行
对于i=2至lr
lkup=单元格(i,2)。值“设置第一个查找值
Fill=单元格(i,n).Value'设置要比较的第一个数据值
如果Len(Fill)>0,则
对于j=2至lr
lkup2=单元格(j,2).Value'设置第二个查找值
Fill2=单元格(j,n).Value'设置要比较的第二个值
如果lkup2=lkup,则“检查p/N是否相同”
如果Len(Fill2)=0,则“检查第二个值是否为空”
单元格(j,n).Value=Fill'如果值为空,则单元格取非空单元格的值
ElseIf Fill Fill2然后检查值是否不匹配和非零
单元格(i,n).Font.ColorIndex=3'更改两个单元格的字体颜色
单元格(j,n).Font.ColorIndex=3'更改两个单元格的字体颜色
如果结束
如果结束
下一个j
如果结束
接下来我
Application.ScreenUpdating=True
端接头

这样做通常会冻结我的excel,我的计算机有32GB的RAM,并且是Windows10。有没有更好的方法来解决我的问题,或者不使用vba就可以完成?我对一种不使用vba的方法做了一些研究,但使用了sumifs、countifs等,但没有真正进行任何深度潜水。

因此,如果我正确理解您的问题,请从以下数据开始:

ID Column_header
 2             a
 3       _BLANK_
 4       _BLANK_
 5             b
 6       _BLANK_
你想把它变成:

ID Column_header
 2             a
 3             a
 4             a
 5             b
 6             b
我知道一个非常简单的诀窍(我将所有内容都放在“a”栏中进行解释):

  • 选择该列中的每个单元格
  • 转到(Ctrl+G)特殊,空白
  • 在公式栏中,键入
    =A2
    (您当前位于'A3'中,并且您希望将单元格的值复制到其正上方)
  • 按Ctrl键+回车键
您将看到“A2”被复制到“A3”、“A3”被复制到“A4”中,“A5”被复制到“A6”中(这是因为所有空白单元格都被复制到了Ctrl+ENTER)

将此记录到宏中,速度会快得多

我已经看到一个问题出现了:“好的,但是我想改变的字体颜色呢?”。新填充的单元格基于公式,因此
=FORMULATEXT()
的长度不会为零。您可以将其用作条件格式的基础


祝你好运

内部for循环只需要从i开始,即:

for j = i to lr
这大约占运行时间的一半

进一步的绩效提升: 使用.Value2而不是.Value属性。
或者更好的方法是,将整列读入数组,在VBA中处理,然后将结果写回

您的代码在较小的数据集上工作正常吗?如果是,这个问题可能更适合上述情况,您可能希望研究第一个循环是
i=2到lr-1
,第二个循环是
j=i+1到lr
,您能给出一些简短的样本数据和预期的输出吗?我想知道条件格式是否可行?此外,您还可以尝试使用
Application.Calculation=False
关闭可能会增加speec的计算。此外,您的范围都是不合格的…您声明
sht
,但从未将范围链接到它…我在开始时进行了一步测试,以测试代码的每个实例,结果成功了。例如:p123有一个参数a,p123也在后面,但没有列出该参数。它将把A的参数进一步放在空白处。这样我就不必手动筛选每个查找值或部分。我知道我意识到我没有使用sht值。我最初编写时打开了多个工作簿,但决定在运行时只打开文件。@brucewayne我不太熟悉关闭计算。当blank被认为是一种计算时,实际上是在输入一个值。当屏幕更新重新打开时,关闭它会阻止单元格填充吗?是的,这基本上是这样,但对于填充的每个空白,它们都有一个单独的列,该列有一个共同的值来确定将其放置在何处。我不明白你的确切意思,但是你认为你可以通过修改公式来完成吗?索引外观参数2 L1 a 3 L1?4 L2 c n L1?对于2和3,该值取决于查找,如果它们不同,则取决于颜色。?对不起,我不明白你的意思。你能编辑你的问题,展示你的工作表是什么样子的,以及宏后它应该是什么样子吗?我这样做了,这使它变得更容易,我不确定我什么时候开始运行,但它几乎没有通过任何代码。是否有其他方法可以实现我的目标。通过将整个范围读取到一个2-dim阵列中,您可能可以进一步提高性能,然后继续操作,直到完全完成后才进行回写。一般来说,这应该比一个接一个地读取这么多单元格要快。