使用VBA快速规范数据(Excel)
我目前正试图用Excel中的VBA规范化数据。 因此,我的工作簿导入几个csv文件,并将它们写入不同的工作表中,所有这些文件都是这样构build的。
- 第一行:标题
- 第一列:x轴(绘图)
- 第二列到第n列:y值
现在我想将从2到n的所有列标准化(除以每列的最大值)。 这是我目前使用的function:
Sub NormalizeData(dataName) cs = Worksheets(dataName).UsedRange.SpecialCells(xlCellTypeLastCell).Column rs = Worksheets(dataName).UsedRange.SpecialCells(xlCellTypeLastCell).Row For col = 2 To cs maxValue = Application.WorksheetFunction.Max(Worksheets(dataName).Columns(col)) For r = 2 To rs Worksheets(dataName).Cells(r, col) = Worksheets(dataName).Cells(r, col) / maxValue Next r Next col End Sub
这种方法是有效的,但是由于数据量很大,所以速度很慢。 有没有办法提高速度? 我已经切换了屏幕更新。
非常感谢您的帮助!
这里是一个在一个矩形范围内数字归一化的子。 你可以决定你想要规范的范围,然后把这个范围传递给这个子集:
Sub NormalizeRange(R As Range) 'assumes that R is a rectangular range 'will throw an error if any column has max 0 Dim vals As Variant, maxes As Variant Dim i As Long, j As Long, m As Long, n As Long m = R.Rows.Count n = R.Columns.Count ReDim maxes(1 To n) With Application.WorksheetFunction For i = 1 To n maxes(i) = .Max(R.Columns(i)) Next i End With vals = R.Value For i = 1 To m For j = 1 To n vals(i, j) = vals(i, j) / maxes(j) Next j Next i R.Value = vals End Sub
这将比现在更有效率,因为它在批量传输中移动电子表格和VBA之间的值,而不是通过大量的单独读取/写入。 它也可以避免像屏幕更新问题和根据这些值对函数进行中间重新计算。
使用另一个工作表和PasteSpecial。 假设ws1包含您的数据,并且ws2当前未被使用:
with ws2.Range(.Cells(2,2), .Cells(rs, cs)) .value = maxValue .copy end with ws1.Range(.Cells(2,2), .Cells(rs, cs)).PasteSpecial _ Operation:=xlPasteSpecialOperationDivide Application.CutCopyMode = False