我收到以下错误消息:
Run-time error '1004':
Application-defined or object-defined error
当我尝试将数组写入工作表时。这是相关的代码片段:
'Write data from arrUniverseData into wsDetails worksheet
lngNumRows = UBound(arrUniverseData, 1) - LBound(arrUniverseData, 1) + 1
lngNumColumns = UBound(arrUniverseData, 2) - LBound(arrUniverseData, 2) + 1
Set rngDestination = wsDetails.Range("A" & lngFirstDetailsRow).Resize(lngNumRows, lngNumColumns)
rngDestination = arrUniverseData
错误显示在最后一行。我已经进行了三次检查:所有这些变量都已在该过程的早期定义并正常工作。事实上,大约 50 行我使用相同的代码写入不同的工作表,它工作得很好。
有趣的是,这条线似乎实际上正在尝试工作。如果我查看 wsDetails 工作表,我可以看到它已写入前 6,092 行。数组中总共有约 14-15k 行需要写入(有 106 列)。
当我只有 104 列时,这段代码工作得很好(除了数组大小以容纳新数据集之外,没有更改任何内容)。这是内存/大小问题吗?
如果有帮助的话,我愿意在这里发布完整的代码,但它相当庞大。预先感谢您的任何意见或建议!
编辑:这是整个过程,以防有帮助。我真的没有发现任何问题:
Option Explicit
Sub CostReductionRollup()
'Display a message box verifying that the user has already saved a backup
If MsgBox("This rollup procedure will replace any existing data in all of the worksheets of this workbook--please make sure you have saved this file as a copy to prevent overwriting previous rollups.", vbOKCancel, "Warning--Save a Backup") = vbCancel Then
Exit Sub
End If
'Update Status Bar
Call UpdateStatusBar(0, 10, 0, "Processing Universe data...")
'Disable screen updating to reduce processing time
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
'Set public workbook, worksheet, directory, and date variables
Set wbRollup = ActiveWorkbook
Set wbMacro = ThisWorkbook
Set wsProcess = wbRollup.Worksheets("Process")
Set wsDetails = wbRollup.Worksheets("Details")
strUniverseServerPath = wsProcess.Range("B7").Text & wsProcess.Range("B10").Text
Set wbUniverse = Workbooks.Open(strUniverseServerPath)
Set wsUniverse = wbUniverse.Worksheets("LOS Report")
datRollupDate = Date
'Copy last month's subtotals into the "previous rollup" cells for easy comparison
wsDetails.Range("N1").Value = wsDetails.Range("N2").Value
wsDetails.Range("O1").Value = wsDetails.Range("O2").Value
wsDetails.Range("P1").Value = wsDetails.Range("P2").Value
wsDetails.Range("Q1").Value = wsDetails.Range("Q2").Value
wsDetails.Range("R1").Value = wsDetails.Range("R2").Value
'Store data from Universe Report into arrUniverseData
Dim lngFirstUniverseRow As Long
Dim lngLastUniverseRow As Long
lngFirstUniverseRow = 1 'Stores header row
lngLastUniverseRow = wsUniverse.UsedRange.Rows.Count
arrUniverseData = wsUniverse.Range("A" & lngFirstUniverseRow & ":CR" & lngLastUniverseRow)
'Close wbUniverse without saving changes
wbUniverse.Close SaveChanges:=False
'Update Status Bar
Call UpdateStatusBar(0, 10, 1, "Arranging Universe data...")
'Create wsTemp to temporarily store data while it is manipulated
wbRollup.Worksheets.Add().Name = "Temp"
Set wsTemp = wbRollup.Worksheets("Temp")
'Write data from arrUniverseData to wsTemp
Dim lngNumRows As Long
Dim lngNumColumns As Long
lngNumRows = UBound(arrUniverseData, 1) - LBound(arrUniverseData, 1) + 1
lngNumColumns = UBound(arrUniverseData, 2) - LBound(arrUniverseData, 2) + 1
Set rngDestination = wsTemp.Range("A1").Resize(lngNumRows, lngNumColumns)
rngDestination = arrUniverseData
'Insert column in wsTemp for YE Type
wsTemp.Range("Y1").EntireColumn.Insert
wsTemp.Range("Y1").Value = "YE_TYPE"
'Insert column in wsTemp for At Risk
wsTemp.Range("Z1").EntireColumn.Insert
wsTemp.Range("Z1").Value = "AT_RISK"
'Insert column in wsTemp for DC EM
wsTemp.Range("O1").EntireColumn.Insert
wsTemp.Range("O1").Value = "DC_EM"
'Insert column in wsTemp for Implementation Month-Year
wsTemp.Range("CU1").EntireColumn.Insert
wsTemp.Range("CU1").Value = "IMPLEMENTATION_MONTH_YEAR"
'Insert column in wsTemp for Carryover Implementation Month
wsTemp.Range("CU1").EntireColumn.Insert
wsTemp.Range("CU1").Value = "CARRYOVER_IMPLEMENTATION_MONTH"
'Insert column in wsTemp for Carryover Months
wsTemp.Range("CU1").EntireColumn.Insert
wsTemp.Range("CU1").Value = "CARRYOVER_MONTHS"
'Insert column in wsTemp for Current Year Net Fiscal Impact (Factored)
wsTemp.Range("CU1").EntireColumn.Insert
wsTemp.Range("CU1").Value = "CURRENT_YEAR_NET_FISCAL_IMPACT_(FACTORED)"
'Insert column in wsTemp for Adjusted (Floating) Impact
wsTemp.Range("CU1").EntireColumn.Insert
wsTemp.Range("CU1").Value = "ADJUSTED_(FLOATING)_IMPACT"
'Insert column in wsTemp for Concatenate
wsTemp.Range("DA1").EntireColumn.Insert
wsTemp.Range("DA1").Value = "CONCATENATE"
'Insert column in wsTemp for YTD CICT Expected Savings
wsTemp.Range("DB1").EntireColumn.Insert
wsTemp.Range("DB1").Value = "YTD_CICT_EXPECTED_SAVINGS"
'Update Status Bar
Call UpdateStatusBar(0, 10, 2, "Writing Universe data to temporary data source...")
'Store new data from wsTemp into arrUniverseData
lngFirstUniverseRow = 1
lngLastUniverseRow = wsTemp.UsedRange.Rows.Count
arrUniverseData = wsTemp.Range("A" & lngFirstUniverseRow & ":DB" & lngLastUniverseRow)
lngNumRows = UBound(arrUniverseData, 1) - LBound(arrUniverseData, 1) + 1
lngNumColumns = UBound(arrUniverseData, 2) - LBound(arrUniverseData, 2) + 1
'Update Status Bar
Call UpdateStatusBar(0, 10, 3, "Calculating...")
'----------MAIN LOOP----------MAIN LOOP----------MAIN LOOP----------MAIN LOOP----------MAIN LOOP----------MAIN LOOP----------MAIN LOOP----------
'Loop through arrUniverseData and determine YE Type and whether project is At Risk
Dim i As Long 'looper variable
Dim datImpactDate As Date 'Date to hold line item's impact date
Dim strCICTStatus As String 'String to hold line item's CICT status
Dim strDCEM() As String 'String array to hold design control engineering managers
For i = 2 To lngNumRows 'do not change first row
datImpactDate = arrUniverseData(i, 25)
strCICTStatus = arrUniverseData(i, 24)
'Set YE Type
If strCICTStatus = "In Queue" Or strCICTStatus = "In Process : Pending Approval" Or strCICTStatus = "In Process : Business Case Started" Then
arrUniverseData(i, 26) = "Potential"
ElseIf strCICTStatus = "In Process : Execution Started" Then
arrUniverseData(i, 26) = "Active"
ElseIf strCICTStatus = "Complete" And Year(datRollupDate) - Year(datImpactDate) = 1 Then
arrUniverseData(i, 26) = "Carryover"
ElseIf strCICTStatus = "Complete" And Year(datRollupDate) = Year(datImpactDate) And datImpactDate < datRollupDate Then
arrUniverseData(i, 26) = "In Production"
ElseIf strCICTStatus = "Complete" And Year(datRollupDate) = Year(datImpactDate) And datImpactDate >= datRollupDate Then
arrUniverseData(i, 26) = "Engineering Complete"
ElseIf strCICTStatus = "Complete" And Year(datRollupDate) < Year(datImpactDate) Then
arrUniverseData(i, 26) = "Engineering Complete"
End If
'Set At Risk
If arrUniverseData(i, 26) = "Carryover" Then
arrUniverseData(i, 27) = "n"
ElseIf arrUniverseData(i, 26) = "Potential" Then
If DateDiff("d", datRollupDate, datImpactDate) <= 180 Then
arrUniverseData(i, 27) = "y"
Else
arrUniverseData(i, 27) = "n"
End If
ElseIf arrUniverseData(i, 26) = "Active" Then
If DateDiff("d", datRollupDate, datImpactDate) <= 60 Then
arrUniverseData(i, 27) = "y"
Else
arrUniverseData(i, 27) = "n"
End If
ElseIf arrUniverseData(i, 26) = "Engineering Complete" Then
If DateDiff("d", datRollupDate, datImpactDate) <= 31 Then
arrUniverseData(i, 27) = "y"
Else
arrUniverseData(i, 27) = "n"
End If
Else
arrUniverseData(i, 27) = "n"
End If
'Set DC EM
If arrUniverseData(i, 98) <> "" Then
strDCEM() = Split(arrUniverseData(i, 98), "/")
arrUniverseData(i, 15) = strDCEM(0)
ElseIf arrUniverseData(i, 97) <> "" Then
arrUniverseData(i, 15) = arrUniverseData(i, 97)
ElseIf arrUniverseData(i, 95) <> "" Then
arrUniverseData(i, 15) = arrUniverseData(i, 95)
ElseIf arrUniverseData(i, 93) <> "" Then
arrUniverseData(i, 15) = arrUniverseData(i, 93)
ElseIf arrUniverseData(i, 91) <> "" Then
arrUniverseData(i, 15) = arrUniverseData(i, 91)
ElseIf arrUniverseData(i, 89) <> "" Then
arrUniverseData(i, 15) = arrUniverseData(i, 89)
End If
'Calculate Current Year Net Fiscal Impact (Factored)
If arrUniverseData(i, 26) = "Potential" Then
arrUniverseData(i, 100) = 0.25 * arrUniverseData(i, 59)
ElseIf arrUniverseData(i, 26) = "Active" Then
arrUniverseData(i, 100) = 0.75 * arrUniverseData(i, 59)
Else
arrUniverseData(i, 100) = arrUniverseData(i, 59)
End If
'Calculate Carryover Months
If arrUniverseData(i, 26) = "Carryover" Then
arrUniverseData(i, 101) = arrUniverseData(i, 82) - 1
Else
arrUniverseData(i, 101) = 0
End If
'Calculate Carryover Implementation Month
If arrUniverseData(i, 101) = 1 Then
arrUniverseData(i, 102) = "Feb"
ElseIf arrUniverseData(i, 101) = 2 Then
arrUniverseData(i, 102) = "Mar"
ElseIf arrUniverseData(i, 101) = 3 Then
arrUniverseData(i, 102) = "Apr"
ElseIf arrUniverseData(i, 101) = 4 Then
arrUniverseData(i, 102) = "May"
ElseIf arrUniverseData(i, 101) = 5 Then
arrUniverseData(i, 102) = "Jun"
ElseIf arrUniverseData(i, 101) = 6 Then
arrUniverseData(i, 102) = "Jul"
ElseIf arrUniverseData(i, 101) = 7 Then
arrUniverseData(i, 102) = "Aug"
ElseIf arrUniverseData(i, 101) = 8 Then
arrUniverseData(i, 102) = "Sep"
ElseIf arrUniverseData(i, 101) = 9 Then
arrUniverseData(i, 102) = "Oct"
ElseIf arrUniverseData(i, 101) = 10 Then
arrUniverseData(i, 102) = "Nov"
ElseIf arrUniverseData(i, 101) = 11 Then
arrUniverseData(i, 102) = "Dec"
End If
'Calculate Implementation Year-Month
arrUniverseData(i, 103) = arrUniverseData(i, 83) & "-" & arrUniverseData(i, 82)
'Set current fiscal columns of In Queue projects to $0
If strCICTStatus = "In Queue" Then
arrUniverseData(i, 57) = 0
arrUniverseData(i, 58) = 0
arrUniverseData(i, 59) = 0
arrUniverseData(i, 99) = 0
End If
'Calculate Adjusted (Floating) Impact
arrUniverseData(i, 99) = -((arrUniverseData(i, 44) * arrUniverseData(i, 46)) / 365) * DateDiff("d", datImpactDate, "12/31/" & Year(datImpactDate))
'Calculate Concatenate
If Len(arrUniverseData(i, 40)) < 4 Then
arrUniverseData(i, 105) = "LS" & arrUniverseData(i, 40) & arrUniverseData(i, 28)
Else
arrUniverseData(i, 105) = "" & arrUniverseData(i, 40) & arrUniverseData(i, 28)
End If
'Calculate YTD CICT Expected Savings
If Year(datImpactDate) = Year(Date) And arrUniverseData(i, 26) = "In Production" Then
arrUniverseData(i, 106) = (arrUniverseData(i, 59) / DateDiff("d", datImpactDate, "12/31/" & Year(Date))) * (DateDiff("d", datImpactDate, Date))
Else
arrUniverseData(i, 106) = 0
End If
Next i
'Update Status Bar
Call UpdateStatusBar(0, 10, 5, "Writing calculations to temporary data source...")
'Write data from arrUniverseData to wsTemp
lngNumRows = UBound(arrUniverseData, 1) - LBound(arrUniverseData, 1) + 1
lngNumColumns = UBound(arrUniverseData, 2) - LBound(arrUniverseData, 2) + 1
Set rngDestination = wsTemp.Range("A1").Resize(lngNumRows, lngNumColumns)
rngDestination = arrUniverseData
'Rearrange Columns
Call Rearrange_wsTemp_Columns
'Insert Dummy rows (12 dummy rows for current year, 12 dummy rows for previous year)
Call InsertDummyRows
'Store new data from wsTemp into arrUniverseData
lngFirstUniverseRow = 2 'Do not take header row
lngLastUniverseRow = wsTemp.UsedRange.Rows.Count
arrUniverseData = wsTemp.Range("A" & lngFirstUniverseRow & ":DB" & lngLastUniverseRow)
'Update Status Bar
Call UpdateStatusBar(0, 10, 6, "Writing data to Details worksheet...")
'Clear data from wsDetails
lngFirstDetailsRow = 5 'leaves room for the wsDetails headers
lngLastDetailsRow = wsDetails.UsedRange.Rows.Count + 5
wsDetails.Rows(lngFirstDetailsRow & ":" & lngLastDetailsRow).ClearContents
wsDetails.Rows(lngFirstDetailsRow & ":" & lngLastDetailsRow).Delete
'Write data from arrUniverseData into wsDetails worksheet
lngNumRows = UBound(arrUniverseData, 1) - LBound(arrUniverseData, 1) + 1
lngNumColumns = UBound(arrUniverseData, 2) - LBound(arrUniverseData, 2) + 1
Set rngDestination = wsDetails.Range("A" & lngFirstDetailsRow).Resize(lngNumRows, lngNumColumns)
rngDestination = arrUniverseData
End Sub
如果我更改最后一行
rngDestination = arrUniverseData
至
rngDestination = "Test"
它工作得很好(在所有 14493 行和 106 列中吐出“Test”)。这意味着它知道 lngNumRows = 14493 和 lngNumColumns = 106,因此数组本身已正确定义。
我在这里完全不知所措。
最佳答案
因此,如果不查看数据集,你们就无法知道这一点,但事实证明,我添加的新列之一在写入 wsTemp 工作表时被格式化为“日期” 。然而,该单元格中包含的数据是财务信息。
所以我在代码中添加了以下内容:
wsTemp.Columns("DB:DB").NumberFormat = "General"
就在该过程将所有数据写入数组之前。现在一切都很好。我猜这与负值(经济损失)与日期格式冲突有关。
希望这可以帮助将来遇到类似错误的其他人。感谢大家的意见 - 非常感谢!
关于arrays - Excel 2013 VBA : Writing Array to Sheet "Application-Defined or Object-Defined Error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34930121/