vb.net - excel 2007的另一个优化宏vba代码。该代码是我数据的一种转置器

标签 vb.net vba excel

您好,此代码最初不是由我完成的,这里有一些我不太明白的问题,我已经从我的同事代码中对其进行了一些更改以适应我的数据并且它可以工作。但太慢了。当我有 4000+kb 的 excel 文件时,它可能会完全卡住。 (我已经检查过,当这个转置器运行时和之后它仍然会在 excel 行限制内,我之前已经完成了计算,并制作了一个宏来根据列数和行数自动拆分 excel 文件,以确保是这样) .这段代码似乎开始很快,然后运行的时间越长越慢。至少这对我来说似乎很有趣。

随意提出任何使此代码更快/更好的方法!感谢您的时间。
抱歉,我不太理解这段代码。

我已经关闭了屏幕更新、自动计算等。

Dim InitRange As Range
Dim Counter As Range
Dim paracount As Long
Dim Filler As Range
Dim ParaSelect As Range
Dim Paraloc As Range
Dim Paravalloc As Range
Dim Unitloc As Range
Dim methodloc As Range
Dim CurNum As Long
Dim MaxNum As Long
Dim eCell As Range
Dim checkRow As Long
Dim InsertRow As Long
Dim x As Long
Dim y As Long
Dim vRow As Long

CurNum = 0
MaxNum = 0

x = 1

Range("K1").End(xlToRight).Offset(0, 0).Select

Set ParaSelect = Range("K1", ActiveCell)
InsertRow = ParaSelect.Count - 1

Set InitRange = Range("A4", "F4")
Set Counter = InitRange

Do
MaxNum = MaxNum + 1
InitRange.Offset(MaxNum, 0).Activate
Loop Until ActiveCell = ""


Set eCell = InitRange.Offset(0, 0)

Do
eCell.Offset(x, 0).Activate
Rows(eCell.Offset(x, 0).row & ":" & eCell.Offset(x, 0).row + InsertRow - 1).Insert
x = x + InsertRow + 1
If x > MaxNum * (InsertRow + 1) Then Exit Do
Loop

Range("A1").Activate

Set Filler = InitRange

Set Paraloc = Range("G4")
Set Paravalloc = Range("H4")
Set Unitloc = Range("I4")
Set methodloc = Range("J4")

vRow = 0
y = 0
Do

ParaSelect.Copy
Paraloc.Offset(y, 0).PasteSpecial xlPasteValues, Transpose:=True

ParaSelect.Offset(1, 0).Copy
methodloc.Offset(y, 0).PasteSpecial xlPasteValues, Transpose:=True

ParaSelect.Offset(2, 0).Copy
Unitloc.Offset(y, 0).PasteSpecial xlPasteValues, Transpose:=True

ParaSelect.Offset(CurNum * (InsertRow + 1) + 3, 0).Copy
Paravalloc.Offset(y, 0).PasteSpecial xlPasteValues, Transpose:=True

Filler.Offset(y, 0).Copy
CurNum = CurNum + 1
y = y + 1
checkRow = 1
Do
Filler.Offset(y, 0).PasteSpecial xlPasteValues
y = y + 1
Filler.Offset(y, 0).Activate
checkRow = checkRow + 1

Loop Until checkRow > InsertRow
Loop Until CurNum >= MaxNum

Jon 提出了一个很好的建议 g >.> 我应该坚决提供一些东西来向你们展示这段代码是关于什么的。图 1 是文件转置前的样子

This is what the file looks like before i run the transposer

enter image description here

图 2 是文件转置后的样子。不用担心列 k 和之后将被删除。

注意:文件可以有任意数量的列和行

最佳答案

此代码运行缓慢的主要原因是循环中的所有单元格引用。如果您将数据复制到变量数组并对其进行处理,它将运行得更快。

您应该遵循的步骤:

  • 计算出源数据范围,并设置 Range变数
    Dim rngData as RangeSet rngData = Your Source Range
  • 复制数据
    Dim varSource as VariantvarSource = rngData
  • 计算目标数据的大小并将变体数组调暗到该大小
    Dim varDestn() as variantRedim varDestn(1 to NumberOfRows, 1 to NumberOfColumns)
  • 计算新数据。将值从 varDource(row,col) 复制到 varDestn(row,col)
  • 删除原始数据(如果需要)
  • 将新数据放在工作表上
    Set rngData = Cells(1,1) _ .Resize(UBound(varDestn,1), UBound(varDestn,2)) _ .Offset(TopLeftCellRow, TopLeftCellCol)rngData = varDestn

  • 一般来说,将对工作表的引用数量保持在最低限度,尤其是在循环中

    关于vb.net - excel 2007的另一个优化宏vba代码。该代码是我数据的一种转置器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7367324/

    相关文章:

    excel - 类未注册 VBA excel

    vba - 如何显示hh :mm:ss in Excel?

    VBA如何通过外部地址只返回工作表名称和单元格地址?

    vb.net - 从数据库中删除时 SQL 逻辑错误或缺少数据库没有这样的表

    arrays - 组合框和文本框单击事件的 VBA 动态数组

    memory - Excel 2007 工作簿名称大小限制是多少?为什么?

    excel - 带过滤器的 GetPivotData

    mysql - 在网格单元值更新时更新数据库表

    c# - .NET如何在单独的类/表单上捕获预先捕获的异常

    vb.net - Visual Basic中like和contains有什么区别