我在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
答案 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}}属性快。