使用VBA(Excel)快速规范化数据的方法

时间:2017-01-09 16:07:45

标签: excel vba excel-vba normalize

我目前正在尝试使用Excel中的VBA规范化数据。因此,我的工作簿导入了几个csv文件,并将它们写在不同的工作表中,所有这些都是这样构建的。

  • 第一行:标题
  • 第一栏:x轴(用于绘图)
  • 第二列到第n列:y值

现在我想将所有列从2到n标准化(除以每列的最大值)。这是我到目前为止使用的功能:

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

这种方法有效,但由于数据量很大,因此非常慢。有没有办法提高速度?我已经切换了屏幕更新。

非常感谢你的帮助!!!

2 个答案:

答案 0 :(得分:3)

使用另一张表和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

答案 1 :(得分:2)

这是一个对矩形范围内的数字进行归一化的子程序。您可以决定要标准化的范围,然后将该范围传递给该子范围:

@objc class NewClass: NSObject, WCSessionDelegate {
    ...
    @available(iOS 9.3, *)
    func updateContent(username: String, password: String) throws {
        guard let session = session where session.state == .Activated else { // app is crashing on this line
            return
        }
        do {
            ...
        } catch {
            throw error
        }
        ...
    }

    @available(iOS 9.3, *)
    func session(session: WCSession, state: WCSessionActivationState, error: NSError?) {
        do {
            ...
        } catch 
            print(error)
        }
    }
    ...
}

这比您目前拥有的效率更高,因为它在批量传输中在电子表格和VBA之间移动值,而不是通过大量的单个读/写。它还可以避免屏幕更新问题和根据这些值重新计算函数的内容。