Excel VBA - 编写数组的更有效方法

时间:2015-04-07 06:20:56

标签: excel vba excel-vba

我在excel VBA中成功构建了一个工具,它可以从SAP中的CJ74报告中获取数据,对其进行整合,并将其迁移到我们在项目办公室工作时使用的金融工具中。

第二个代码使用数组来提取数据并将其转换为列,这段代码有效,但我知道如果写得正确,它可以表现得更好。目前的代码如下,我欢迎建议让这段代码在一行中运行。

Sub Array()
Dim DateStore As Variant
Dim actualcolumnsource As Long, lngcnt as long

lngCnt = 0
actualcolumnsource = SourceSheet.Cells(5, Columns.Count).End(xlToRight).row

ReDim DateStore(0 To actualcolumnsource)
For lngCnt = LBound(DateStore, 1) To UBound(DateStore, 1)
    If lngCnt = 0 Then
        DateStore(lngCnt) = SourceSheet.Cells(5, lngCnt + 1).Value
    Else
        DateStore(lngCnt) = SourceSheet.Cells(5, lngCnt).Value
    End If
Next lngCnt
dumpsheet.Range("E2").Resize((UBound(DateStore) - LBound(DateStore)) + 1, 1).Value = _
                                                        Application.Transpose(DateStore)
lngCnt = 0
Erase DateStore

ReDim DateStore(0 To actualcolumnsource)
For lngCnt = LBound(DateStore, 1) To UBound(DateStore, 1)
    If lngCnt = 0 Then
        DateStore(lngCnt) = SourceSheet.Cells(5, lngCnt + 1).Column
    Else
        DateStore(lngCnt) = SourceSheet.Cells(5, lngCnt).Column
    End If
Next lngCnt
dumpsheet.Range("F2").Resize((UBound(DateStore) - LBound(DateStore)) + 1, 1).Value = _
                                                        Application.Transpose(DateStore)

lngCnt = 0
Erase DateStore


ReDim DateStore(0 To actualcolumntarget)
For lngCnt = LBound(DateStore, 1) To UBound(DateStore, 1)
    If lngCnt = 0 Then
        DateStore(lngCnt) = TargetSheet.Cells(5, lngCnt + 1).Value
    Else
        DateStore(lngCnt) = TargetSheet.Cells(5, lngCnt).Value
    End If
Next lngCnt
dumpsheet.Range("G2").Resize((UBound(DateStore) - LBound(DateStore)) + 1, 1).Value = _
                                                        Application.Transpose(DateStore)


lngCnt = 0
Erase DateStore


ReDim DateStore(0 To actualcolumntarget)
For lngCnt = LBound(DateStore, 1) To UBound(DateStore, 1)
    If lngCnt = 0 Then
        DateStore(lngCnt) = TargetSheet.Cells(5, lngCnt + 1).Column
    Else
        DateStore(lngCnt) = TargetSheet.Cells(5, lngCnt).Column
    End If
Next lngCnt
dumpsheet.Range("H2").Resize((UBound(DateStore) - LBound(DateStore)) + 1, 1).Value = _
                                                    Application.Transpose(DateStore)

lngCnt = 0
Erase DateStore

End Sub

1 个答案:

答案 0 :(得分:3)

放弃1D阵列并使用2D阵列 这也将消除Application.Transpose的使用,因为actualcolumnsource有其局限性 请考虑以下事项:(假设您已经获得了ReDim DateStore(1 To actualcolumntarget, 0 To 3) ' explicit array dimensioning For lngcnt = LBound(DateStore, 1) To Ubound(DateStore, 1) Datestore(lngcnt, 0) = SourceSheet.Cells(5, lngCnt).Value2 Datestore(lngcnt, 1) = SourceSheet.Cells(5, lngCnt).Column Datestore(lngcnt, 2) = TargetSheet.Cells(5, lngCnt).Value2 Datestore(lngcnt, 3) = TargetSheet.Cells(5, lngCnt).Column Next dumpsheet.Range("E2:H" & actualcolumntarget + 1) = DateStore 变量)

If Statement

数组已经明确标注尺寸,因此不需要+1 此外,它在数组中写入两次A5的值 因为你从第2行开始,所以在最后一行需要Value2 另外,我使用Value,比{{1}}属性快。