Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA:需要更有效的解决方案来根据第一列的值将此矩阵排序为新矩阵-耗时太长_Excel_Vba - Fatal编程技术网

Excel VBA:需要更有效的解决方案来根据第一列的值将此矩阵排序为新矩阵-耗时太长

Excel VBA:需要更有效的解决方案来根据第一列的值将此矩阵排序为新矩阵-耗时太长,excel,vba,Excel,Vba,这里是新手 我试图根据第一列中的值将一个长的数据矩阵排序为新的矩阵。例如,如果10000行的第一列中有a,我将用这10000行创建一个新矩阵。我这样做也是为了b 现在,代码只是一个循环,它查看每一行,并在满足条件时将其复制到一旁。然后我复制并粘贴矩阵b,使其与矩阵a相邻 丑陋,对吧?我有70000-100000行要处理,所以这会让事情变得有点慢。什么是更优雅的解决方案 Dim daRow As Long daRow = ActiveSheet.Cells(Rows.Count, 9).End(x

这里是新手

我试图根据第一列中的值将一个长的数据矩阵排序为新的矩阵。例如,如果10000行的第一列中有a,我将用这10000行创建一个新矩阵。我这样做也是为了b

现在,代码只是一个循环,它查看每一行,并在满足条件时将其复制到一旁。然后我复制并粘贴矩阵b,使其与矩阵a相邻

丑陋,对吧?我有70000-100000行要处理,所以这会让事情变得有点慢。什么是更优雅的解决方案

Dim daRow As Long
daRow = ActiveSheet.Cells(Rows.Count, 9).End(xlUp).Row
Dim cell As Range
Dim rRange As Range
Set rRange = ActiveSheet.Range(Cells(1, 9), Cells(daRow, 9))

For Each cell In rRange
If cell.Value = "a" Then
cell.Offset(0, 4).Value = cell.Value
cell.Offset(0, 5).Value = cell.Offset(0, 1).Value
cell.Offset(0, 6).Value = cell.Offset(0, 2).Value
ElseIf cell.Value = "b" Then
cell.Offset(0, 8).Value = cell.Value
cell.Offset(0, 9).Value = cell.Offset(0, 1).Value
cell.Offset(0, 10).Value = cell.Offset(0, 2).Value
End If
Next cell

Dim theRow As Long
theRow = ActiveSheet.Cells(Rows.Count, 13).End(xlUp).Row
Range(Cells(theRow + 1, 17), Cells(theRow + theRow, 19)).Cut
Range("Q1").Select
ActiveSheet.Paste

考虑在一条VBA指令中输入所有数据,然后在一条指令中输出所有数据。那样会快得多。每次代码从电子表格中读取或写入时,都会产生巨大的开销

例如,按以下方式替换.Cell的所有实例

例如,以下代码

For i = 1 to 10
   Variable = Worksheets("Sheet1").Range("A1").Cell(i,1).Value
Next i
可以用

Dim VariantArray as Variant
VariantArray = Workeheets("Sheet1").Range("A1:A10")

' Now VariantArray(0,0) has the first element, (1,0) has the second, etc.
类似地,在将其全部放回原处的同时,创建一个变量数组,并将矩阵所需的所有数据填入其中,以便OutputArray0,0是左上角的单元格值,依此类推,然后使用

Dim OutputRange as Range
Set OutputRange = Worksheets("Sheet1").Range("A3:Z300") ' Or wherever you like it
OutputRange = OutputArray

使用range.Sort方法按第一列排序,然后复制子范围并根据需要粘贴。正如你所观察到的,一行一行地这样做是低效的。你能给我指一些关于子范围排序和复制的文献吗?使用宏记录器对你的范围排序;根据需要修改生成的代码。排序在数据功能区中:我同意@DavidZemens。尝试使用sort+autofilter解决方案,运行几乎不需要时间。录制宏应该可以让您在75%以上的时间内完成。