0

シートを結合するために VBA Express が提供するコードを試しましたが、実行中にランタイム エラー 1004: アプリケーション定義またはオブジェクト定義エラー: が表示されました。

私のシナリオは次のとおりです。最初のシート「接続」があり、その後にSheet1、Sheet2などがあります。シート「接続」を除くすべてのシートを、シート2から開始すると言って結合しています。

「接続」シートを除外するために次のコード行を試しまし
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
4

2 に答える 2

2

最初の問題は、接続シートを除外しようとする場合、外側ではなくループ内で行う必要があることです。次に、範囲転送ではなく、値を貼り付けてみましょう。

        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
于 2012-10-01T19:22:56.563 に答える
0

「CrossProjectReqCoverage」という名前のマスターシートを、指定された場所に結合された値で保存しようとしています。作成された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
于 2012-10-02T20:07:26.783 に答える