代码中出现运行时 1004 错误
Posted
技术标签:
【中文标题】代码中出现运行时 1004 错误【英文标题】:Getting Run time 1004 error in code 【发布时间】:2012-10-01 15:21:36 【问题描述】:我尝试了VBA Express提供的用于合并工作表的代码,在执行时显示运行时错误1004:应用程序定义或对象定义错误:
我的情况是: 我有一个 Excel,因为我有第一张表“连接”,然后我有 Sheet1、Sheet2 等等。我通过说从 sheet2 开始来组合除工作表“连接”之外的所有工作表。
我尝试使用以下代码行排除“连接”表:If Not Sheet.Name = "Connection" then
但它没有用。
无论我在其中的一些表格中使用什么表格,我的一些单元格中都有大量数据。
这是我正在使用的代码:我已突出显示该行
Sub CopyFromWorksheets()
Dim wrk As Workbook 'Workbook object - Always good to work with object variables
Dim sht As Worksheet 'Object for handling worksheets in loop
Dim trg As Worksheet 'Master Worksheet
Dim rng As Range 'Range object
Dim colCount As Integer 'Column count in tables in the worksheets
Set wrk = ActiveWorkbook 'Working in active workbook
For Each sht In wrk.Worksheets
If sht.Name = "Master" Then
sht.Delete
Exit Sub
End If
Next sht
'We don't want screen updating
Application.ScreenUpdating = False
'trg.SaveAs "C:\temp\CPReport1.xls"
'Add new worksheet as the last worksheet
Set trg = wrk.Worksheets.Add(After:=wrk.Worksheets(wrk.Worksheets.Count))
'Rename the new worksheet
trg.Name = "Master"
'Get column headers from the first worksheet
'Column count first
Set sht = wrk.Worksheets(2)
colCount = sht.Cells(1, 255).End(xlToLeft).Column
'Now retrieve headers, no copy&paste needed
With trg.Cells(1, 1).Resize(1, colCount)
.Value = sht.Cells(1, 1).Resize(1, colCount).Value
'Set font as bold
.Font.Bold = True
End With
trg.SaveAs "C:\temp\CPReport1.xls"
'We can start loop
'Skip Sheet - Connection
If Not sht.Name = "Connection" Then
For Each sht In wrk.Worksheets
'If worksheet in loop is the last one, stop execution (it is Master worksheet)
If sht.Index = wrk.Worksheets.Count Then
Exit For
End If
'Data range in worksheet - starts from second row as first rows are the header rows in all worksheets
Set rng = sht.Range(sht.Cells(2, 1), sht.Cells(65536, 1).End(xlUp).Resize(, colCount))
'Put data into the Master worksheet
'----------------- Error in below line --------------------------------------------------
trg.Cells(65536, 1).End(xlUp).Offset(1).Resize(rng.Rows.Count, rng.Columns.Count).Value = rng.Value
'----------------------------------------------------------------------------------------
Next sht
End If
'Fit the columns in Master worksheet
trg.Columns.AutoFit
'Dim dest, destyfile
'dest = "E:\Test_Merge\"
'destyfile = dest & "_" & trg.Name
'trg.SaveAs (destyfile)
'Screen updating should be activated
Application.ScreenUpdating = True
End Sub
【问题讨论】:
【参考方案1】:第一个问题,如果您尝试排除连接表,则需要在循环内进行,而不是在外部进行。 其次,让我们尝试粘贴值而不是范围转移。
For Each sht In wrk.Worksheets
'Skip Sheet - Connection
If Not sht.Name = "Connection" and not sht.name="Master" Then
'Data range in worksheet - starts from second row as first rows are the header rows in all worksheets
Set rng = sht.Range(sht.Cells(2, 1), sht.Cells(65536, 1).End(xlUp).Resize(, colCount))
'Put data into the Master worksheet
rng.copy
trg.Cells(rows.count, 1).End(xlUp).Offset(1).pastespecial paste:=xlpastevalues
End If
Next sht
完整的代码现在看起来像这样
Sub CopyFromWorksheets()
Dim wrk As Workbook 'Workbook object - Always good to work with object variables
Dim sht As Worksheet 'Object for handling worksheets in loop
Dim trg As Worksheet 'Master Worksheet
Dim rng As Range 'Range object
Dim colCount As Integer 'Column count in tables in the worksheets
Set wrk = ActiveWorkbook 'Working in active workbook
For Each sht In wrk.Worksheets
If sht.Name = "Master" Then
sht.Delete
Exit Sub
End If
Next sht
'We don't want screen updating
Application.ScreenUpdating = False
'trg.SaveAs "C:\temp\CPReport1.xls"
'Add new worksheet as the last worksheet
Set trg = wrk.Worksheets.Add(After:=wrk.Worksheets(wrk.Worksheets.Count))
'Rename the new worksheet
trg.Name = "Master"
'Get column headers from the first worksheet
'Column count first
Set sht = wrk.Worksheets(2)
colCount = sht.Cells(1, 255).End(xlToLeft).Column
'Now retrieve headers, no copy&paste needed
With trg.Cells(1, 1).Resize(1, colCount)
.Value = sht.Cells(1, 1).Resize(1, colCount).Value
'Set font as bold
.Font.Bold = True
End With
'We can start loop
For Each sht In wrk.Worksheets
'Skip Sheet - Connection
If Not sht.Name = "Connection" and not sht.name="Master" Then
'Data range in worksheet - starts from second row as first rows are the header rows in all worksheets
Set rng = sht.Range(sht.Cells(2, 1), sht.Cells(65536, 1).End(xlUp).Resize(, colCount))
'Put data into the Master worksheet
rng.copy
trg.Cells(rows.count, 1).End(xlUp).Offset(1).pastespecial paste:=xlpastevalues
End If
Next sht
'move out the Master sheet
trg.move
activeworkbook.SaveAs "C:\temp\CPReport1.xls"
'Fit the columns in Master worksheet
trg.Columns.AutoFit
'Dim dest, destyfile
'dest = "E:\Test_Merge\"
'destyfile = dest & "_" & trg.Name
'trg.SaveAs (destyfile)
'Screen updating should be activated
Application.ScreenUpdating = True
End Sub
【讨论】:
我想将此母版表保存在指定位置,而不是最后创建所有表。而且我不想向用户显示其他工作表,无论创建什么工作表,我都必须隐藏它们。 你能说清楚你需要什么吗? 我正在将工作表合并到主工作表中。所有这些工作表都驻留在一个 Excel 工作簿中。我想隐藏所有这些表并掌握。而且我必须将主表保存到不同的位置。目前我将它保存在新位置,但是当我打开它时,它会显示所有工作表以及主表。 我只需要显示 Mastersheet 而不是其他的。 我已更新代码以仅将主工作表移动到新工作簿并保存。让我知道这是否适合您。【参考方案2】:我正在尝试将名为“跨项目请求覆盖率”的主表与指定位置的组合值一起保存。仅创建了 excel 工作表,但没有创建其中的值。当我们打开此母版表时,在状态栏中显示“选择目标并按 Enter 或选择粘贴。这是我的代码:
Sub CopyFromWorksheets()
Dim wrk As Workbook 'Workbook object - Always good to work with object variables
Dim sht As Worksheet 'Object for handling worksheets in loop
Dim trg As Worksheet 'Master Worksheet
Dim rng As Range 'Range object
Dim colCount As Integer 'Column count in tables in the worksheets
Set wrk = ActiveWorkbook 'Working in active workbook
'We don't want screen updating
Application.ScreenUpdating = False
'Add new worksheet as the last worksheet
'Set trg = wrk.Worksheets.Add(After:=wrk.Worksheets(wrk.Worksheets.Count))
Dim objcpExcel, objcpSheet
Set objcpExcel = CreateObject("Excel.Application")
objcpExcel.Workbooks.Add
Set objcpSheet = objcpExcel.ActiveWorkbook.Worksheets(1)
objcpSheet.Name = "Cross Project Reqs Coverage"
'Rename the new worksheet
'trg.Name = "Cross Project Reqs Coverage"
Dim ws As Worksheet
'For Each ws In ActiveWorkbook.Worksheets
'If UCase(Left(ws.Name, 1)) = "S" Then ws.Visible = xlSheetVeryHidden
'Next ws
'Get column headers from the first worksheet
'Column count first
Set sht = wrk.Worksheets(2)
colCount = sht.Cells(1, 255).End(xlToLeft).Column
'Now retrieve headers, no copy&paste needed
With objcpSheet.Cells(1, 1).Resize(1, colCount)
.Value = sht.Cells(1, 1).Resize(1, colCount).Value
.Font.Name = "Cambria"
.Font.Bold = True
.Font.ColorIndex = 2
.Font.Size = 10
.Interior.ColorIndex = 11
End With
'We can start loop
For Each sht In wrk.Worksheets
'Skip Sheet - Connection
If Not sht.Name = "Connection" And Not sht.Name = "Cross Project Reqs Coverage" Then
'Data range in worksheet - starts from second row as first rows are the header rows in all worksheets
Set rng = sht.Range(sht.Cells(2, 1), sht.Cells(65536, 1).End(xlUp).Resize(, colCount))
'Put data into the Master worksheet
rng.Copy
objcpSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues
End If
Next sht
'ActiveWorkbook.SaveAs "C:\Documents and Settings\All Users\Desktop\QC Downloader Reports\" & CPDomain & "_" & CPProject & "_Requirement Coverage.xls"
'Fit the columns in Master worksheet
'objcpSheet.Columns.AutoFit
'Screen updating should be activated
Application.ScreenUpdating = True
Dim fso
Dim Project_fileCP As String
Dim ReportsFolderDestination
ReportsFolderDestination = "C:\Documents and Settings\All Users\Desktop\"
Project_fileCP = "C:\Documents and Settings\All Users\Desktop\" & "Cross Project Reqs Coverage.xls"
'Project_file1 = "C:\temp\" & project & "_Defects List.xls"
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(Project_fileCP) Then
fso.DeleteFile Project_fileCP, True
objcpExcel.ActiveWorkbook.SaveAs (Project_fileCP)
objcpExcel.Quit
MsgBox " Cross Project Requirement Coverage Report Generated..Please check in QC Downloader Reports folder on Desktop!!!", vbInformation, "Cross Project Requirement Coverage Generated.. "
Application.StatusBar = False
If Dir("C:\Documents and Settings\All Users\Desktop\QC Downloader Reports\" & "Cross Project Reqs Coverage.xls") <> "" Then
Kill "C:\Documents and Settings\All Users\Desktop\QC Downloader Reports\" & "Cross Project Reqs Coverage.xls"
OldFilePath = "C:\Documents and Settings\All Users\Desktop\" & "Cross Project Reqs Coverage.xls" ' original file location
NewFilePath = "C:\Documents and Settings\All Users\Desktop\QC Downloader Reports\" & "Cross Project Reqs Coverage.xls" ' new file location"
Name OldFilePath As NewFilePath ' move the file
Else
OldFilePath = "C:\Documents and Settings\All Users\Desktop\" & "Cross Project Reqs Coverage.xls" ' original file location
NewFilePath = "C:\Documents and Settings\All Users\Desktop\QC Downloader Reports\" & "Cross Project Reqs Coverage.xls" ' new file location"
Name OldFilePath As NewFilePath ' move the file
End If
'Workbook_Deactivate
Else
objcpExcel.ActiveWorkbook.SaveAs (Project_fileCP)
objcpExcel.Quit
'MsgBox " Defect List Created..Check on Desktop!!!", vbInformation, "Defect List Created.. "
MsgBox " Cross Project Requirement Coverage Report Generated..Please check in QC Downloader Reports folder on Desktop!!!", vbInformation, "Cross Project Requirement Coverage Report Generated.. "
Application.StatusBar = False
If Dir("C:\Documents and Settings\All Users\Desktop\QC Downloader Reports\" & "Cross Project Reqs Coverage.xls") <> "" Then
Kill "C:\Documents and Settings\All Users\Desktop\QC Downloader Reports\" & "Cross Project Reqs Coverage.xls"
OldFilePath = "C:\Documents and Settings\All Users\Desktop\" & "Cross Project Reqs Coverage.xls" ' original file location
NewFilePath = "C:\Documents and Settings\All Users\Desktop\QC Downloader Reports\" & "Cross Project Reqs Coverage.xls" ' new file location"
Name OldFilePath As NewFilePath ' move the file
Else
OldFilePath = "C:\Documents and Settings\All Users\Desktop\" & "Cross Project Reqs Coverage.xls" ' original file location
NewFilePath = "C:\Documents and Settings\All Users\Desktop\QC Downloader Reports\" & "Cross Project Reqs Coverage.xls" ' new file location"
Name OldFilePath As NewFilePath ' move the file
End If
End If
' If error occurs It will take care of that
ErrorHandling:
If Err.Number <> 0 Then
'MsgBox "Error Occurred.."
MsgBox "Please check entered Path!!!", vbInformation, "Incorrect Value"
End If
End Sub
【讨论】:
我正在尝试使用指定位置的组合值保存名为“跨项目请求覆盖率”的主表。仅创建了 excel 工作表,但没有创建其中的值。当我们打开此母版表时,在状态栏上显示“选择目标并按 Enter 或选择粘贴。上面是我的代码以上是关于代码中出现运行时 1004 错误的主要内容,如果未能解决你的问题,请参考以下文章