Share via

Include cell formatting when values are copied in VBA from one worksheet to another

Anonymous
2012-05-15T06:17:30+00:00

I have a macro that I obtained from Microsoft MSDN that I have modified.  I wish to create a master list combining the data in several files into one sheet (multiple users update a template) in a MasterData sheet.  the MasterData updates all data in a holding directory to ensure all finished files are accounted for. The folowing code works okay but the cell formating does not come across with the cell values.  The users will highlight some cells they think need reviewed.  How would I modify this to merge the data along with the formatting.  I've left some comments in to show where I've modified the code.

Any help appreciated.

Sub MergeAllWorkbooks()

    Dim MasterData As Worksheet

    Dim FolderPath As String

    Dim NRow As Long

    Dim FileName As String

    Dim WorkBk As Workbook

    Dim SourceRange As Range

    Dim DestRange As Range

    Dim LastRow As Long

ThisWorkbook.Activate

 With Application

        .Calculation = xlCalculationManual

        .ScreenUpdating = False

    End With

 Application.DisplayAlerts = False

    ' Create a new workbook and set a variable to the first sheet.

    Set MasterData = ThisWorkbook.Worksheets("MasterData") 'Workbooks.Add(xlWBATWorksheet).Worksheets(1)

    'Worksheet("MasterData").Select

           Sheets("MasterData").Select

             Range("A3").Select

             Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select

             Selection.Delete

             Range("A3").Select

    ' Modify this folder path to point to the files you want to use.

    FolderPath = Worksheets("Control").Range("B6").Value

    Debug.Print (FolderPath)

    ' NRow keeps track of where to insert new rows in the destination workbook.

    NRow = 3

    ' Call Dir the first time, pointing it to all Excel files in the folder path.

    FileName = Dir(FolderPath & "*.xl*")

    Debug.Print (FileName)

    ' Loop until Dir returns an empty string.

    Do While FileName <> ""

        ' Open a workbook in the folder

        Set WorkBk = Workbooks.Open(FolderPath & FileName)

        ' Set the cell in column A to be the file name.

        'MasterData.Range("A" & NRow).Value = FileName

        ' Set the source range to be A9 through C9.

        ' Modify this range for your workbooks.

        ' It can span multiple rows.

        LastRow = WorkBk.Worksheets(1).Cells.Find(What:="*", _

                 After:=WorkBk.Worksheets(1).Cells.Range("A1"), _

                 SearchDirection:=xlPrevious, _

                 LookIn:=xlFormulas, _

                 SearchOrder:=xlByRows).Row

        Set SourceRange = WorkBk.Worksheets(1).Range("A3:AV" & LastRow)

        'Set SourceRange = WorkBk.Worksheets(1).Range("A9:C9")

        ' Set the destination range to start at column B and

        ' be the same size as the source range.

        Set DestRange = MasterData.Range("A" & NRow)

        Set DestRange = DestRange.Resize(SourceRange.Rows.Count, _

           SourceRange.Columns.Count)

        ' Copy over the values from the source to the destination.

        DestRange.Value = SourceRange.Value

        ' Increase NRow so that we know where to copy data next.

        NRow = NRow + DestRange.Rows.Count

        ' Close the source workbook without saving changes.

        WorkBk.Close savechanges:=False

        ' Use Dir to get the next file name.

        FileName = Dir()

    Loop

    ' Call AutoFit on the destination sheet so that all

    ' data is readable.

    'MasterData.Columns.AutoFit

    With Application

        .Calculation = xlCalculationAutomatic

        .ScreenUpdating = True

    End With

    Application.DisplayAlerts = True

End Sub

Microsoft 365 and Office | Excel | For home | Windows

Locked Question. This question was migrated from the Microsoft Support Community. You can vote on whether it's helpful, but you can't add comments or replies or follow the question.

0 comments No comments
Answer accepted by question author
  1. HansV 462.6K Reputation points MVP Volunteer Moderator
    2012-05-15T07:22:02+00:00

    If the source range doesn't contain formulas, change

            ' Copy over the values from the source to the destination.

            DestRange.Value = SourceRange.Value

    to

            ' Copy over the values from the source to the destination.

            SourceRange.Copy Destination:=DestRange

    If the source range contains formulas, they might not work correctly after copying, so use

            ' Copy over the values from the source to the destination.

            SourceRange.Copy

            DestRange.PasteSpecial Paste:=xlPasteValues

            DestRange.PasteSpecial Paste:=xlPasteFormats

    0 comments No comments

2 additional answers

Sort by: Most helpful
  1. Andreas Killer 144.1K Reputation points Volunteer Moderator
    2012-05-15T10:16:29+00:00

    In additional to Hans, some parts of your code are much easier if you use the objects directly.

    Andreas.

    Option Explicit

    Sub MergeAllWorkbooks()

      Dim MasterData As Worksheet

      Dim FolderPath As String

      Dim FileName As String

      Dim WorkBk As Workbook

      Dim SourceRange As Range

      Dim DestRange As Range

      ' Modify this folder path to point to the files you want to use.

      FolderPath = Worksheets("Control").Range("B6").Value

      Debug.Print FolderPath

    '!!AK-15.05.12 begin

      If Right(FolderPath, 1) <> "" Then FolderPath = FolderPath & ""

      Set MasterData = ThisWorkbook.Worksheets("MasterData")

      With MasterData

        'Remove the data in the master sheet

        .Range("A3", RangeLastCell(.Cells)).ClearContents

        'Setup the cell for the first data

        Set DestRange = .Range("A3")

      End With

    '!!AK-15.05.12 end

      ' Call Dir the first time, pointing it to all Excel files in the folder path.

      FileName = Dir(FolderPath & "*.xl*")

      Debug.Print FileName

      ' Loop until Dir returns an empty string.

      Do While FileName <> ""

        ' Open a workbook in the folder

        Set WorkBk = Workbooks.Open(FolderPath & FileName)

    '!!AK-15.05.12 begin

        With WorkBk.Worksheets(1)

          ' Set the source range

          Set SourceRange = .Range("A3", RangeLastCell(.Cells))

        End With

        'Copy the cells

        SourceRange.Copy DestRange

        'Copy the values only

        'DestRange.Resize(SourceRange.Rows.Count, SourceRange.Columns.Count) = _

          SourceRange.Value

        'Set DestRange to the next empty cell

        Set DestRange = DestRange.Offset(SourceRange.Rows.Count)

    '!!AK-15.05.12 end

        ' Close the source workbook without saving changes.

        WorkBk.Close SaveChanges:=False

        ' Use Dir to get the next file name.

        FileName = Dir()

      Loop

    End Sub

    Function RangeLastCell(Optional Bereich As Range) As Range

      'Liefert die letzte verwendete Zelle in Bereich

      Dim R As Range, C As Range

      If Bereich Is Nothing Then Set Bereich = ActiveSheet.Cells

      Set R = Bereich.Cells(Bereich.Rows.Count, Bereich.Columns.Count)

      If IsEmpty(R) And Not R.Address = Bereich.Cells(1, 1).Address Then

        Set C = Bereich.Find("*", After:=R, SearchOrder:=xlByColumns, _

          SearchDirection:=xlPrevious)

        If C Is Nothing Then

          Set RangeLastCell = Bereich(1, 1)

        Else

          Set R = Bereich.Find("*", After:=R, SearchOrder:=xlByRows, _

            SearchDirection:=xlPrevious)

          Set RangeLastCell = Bereich.Cells(R.Row - Bereich.Row + 1, C.Column - Bereich _

            .Column + 1)

        End If

      Else

        Set RangeLastCell = R

      End If

    End Function

    0 comments No comments
  2. Anonymous
    2012-05-15T07:50:28+00:00

    Thanks Hans, it worked a treat.

    Cheers

    Jim

    0 comments No comments