Consulting

Results 1 to 2 of 2

Thread: change code help

  1. #1
    VBAX Regular
    Joined
    Feb 2009
    Posts
    10
    Location

    change code help

    Hi all

    I have found some code on the internet that meets nearly all my requirements. I want to open all workbooks in a folder copy some data and then paste it into an existing workbook.

    the code below currently does all this however it creates a new workbook, i want it to use an existing workbook and the sheet name "SData". Im not the best and have tried tampering wih the code but it doesnt seem to adjust. any help would be greatful.

    [vba]Sub RDB_Merge_Data()
    Dim myFiles As Variant
    Dim myCountOfFiles As Long
    myCountOfFiles = Get_File_Names( _
    MyPath:="C:\Users\redexodia\Desktop\New Folder", _
    Subfolders:=False, _
    ExtStr:="*.xl*", _
    myReturnedFiles:=myFiles)
    If myCountOfFiles = 0 Then
    MsgBox "No files that match the ExtStr in this folder"
    Exit Sub
    End If
    Get_Data _
    FileNameInA:=True, _
    PasteAsValues:=True, _
    SourceShName:="", _
    SourceShIndex:=1, _
    SourceRng:="A:f", _
    StartCell:="", _
    myReturnedFiles:=myFiles
    End Sub

    ' Note: You not have to change the macro below, you only
    ' edit and run the RDB_Merge_Data above.
    Sub Get_Data(FileNameInA As Boolean, PasteAsValues As Boolean, SourceShName As String, _
    SourceShIndex As Integer, SourceRng As String, StartCell As String, myReturnedFiles As Variant)
    Dim SourceRcount As Long
    Dim SourceRange As Range, destrange As Range
    Dim mybook As Workbook, BaseWks As Worksheet
    Dim rnum As Long, CalcMode As Long
    Dim SourceSh As Variant
    Dim sh As Worksheet
    Dim I As Long
    'Change ScreenUpdating, Calculation and EnableEvents
    With Application
    CalcMode = .Calculation
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
    .EnableEvents = False
    End With
    'Add a new workbook with one sheet named "Combine Sheet"
    Set BaseWks = Workbooks.Add(xlWBATWorksheet).Worksheets(1)
    BaseWks.Name = "Combine Sheet"
    'Set start row for the Data
    rnum = 1
    'Check if we use a named sheet or the index
    If SourceShName = "" Then
    SourceSh = SourceShIndex
    Else
    SourceSh = SourceShName
    End If
    'Loop through all files in the array(myFiles)
    For I = LBound(myReturnedFiles) To UBound(myReturnedFiles)
    Set mybook = Nothing
    On Error Resume Next
    Set mybook = Workbooks.Open(myReturnedFiles(I))
    On Error GoTo 0
    If Not mybook Is Nothing Then
    If LCase(SourceShName) <> "all" Then
    'Set SourceRange and check if it is a valid range
    On Error Resume Next
    If StartCell <> "" Then
    With mybook.Sheets(SourceSh)
    Set SourceRange = .Range(StartCell & ":" & RDB_Last(3, .Cells))
    'Test if the row of the last cell >= then the row of the StartCell
    If RDB_Last(1, .Cells) < .Range(StartCell).Row Then
    Set SourceRange = Nothing
    End If
    End With
    Else
    With mybook.Sheets(SourceSh)
    Set SourceRange = Application.Intersect(.UsedRange, .Range(SourceRng))
    End With
    End If
    If Err.Number > 0 Then
    Err.Clear
    Set SourceRange = Nothing
    Else
    'if SourceRange use all columns then skip this file
    If SourceRange.Columns.Count >= BaseWks.Columns.Count Then
    Set SourceRange = Nothing
    End If
    End If
    On Error GoTo 0
    If Not SourceRange Is Nothing Then
    'Check if there enough rows to paste the data
    SourceRcount = SourceRange.Rows.Count
    If rnum + SourceRcount >= BaseWks.Rows.Count Then
    MsgBox "Sorry there are not enough rows in the sheet to paste"
    mybook.Close savechanges:=False
    BaseWks.Parent.Close savechanges:=False
    GoTo ExitTheSub
    End If
    'Set the destination cell
    If FileNameInA = True Then
    Set destrange = BaseWks.Range("B" & rnum)
    With SourceRange
    BaseWks.Cells(rnum, "A"). _
    Resize(.Rows.Count).Value = myReturnedFiles(I)
    End With
    Else
    Set destrange = BaseWks.Range("A" & rnum)
    End If
    'Copy/paste the data
    If PasteAsValues = True Then
    With SourceRange
    Set destrange = destrange. _
    Resize(.Rows.Count, .Columns.Count)
    End With
    destrange.Value = SourceRange.Value
    Else
    SourceRange.Copy destrange
    End If
    rnum = rnum + SourceRcount
    End If
    'Close the workbook without saving
    mybook.Close savechanges:=False
    Else
    'Loop through all sheets in mybook
    For Each sh In mybook.Worksheets
    'Set SourceRange and check if it is a valid range
    On Error Resume Next
    If StartCell <> "" Then
    With sh
    Set SourceRange = .Range(StartCell & ":" & RDB_Last(3, .Cells))
    If RDB_Last(1, .Cells) < .Range(StartCell).Row Then
    Set SourceRange = Nothing
    End If
    End With
    Else
    With sh
    Set SourceRange = Application.Intersect(.UsedRange, .Range(SourceRng))
    End With
    End If
    If Err.Number > 0 Then
    Err.Clear
    Set SourceRange = Nothing
    Else
    'if SourceRange use almost all columns then skip this file
    If SourceRange.Columns.Count > BaseWks.Columns.Count - 2 Then
    Set SourceRange = Nothing
    End If
    End If
    On Error GoTo 0
    If Not SourceRange Is Nothing Then
    'Check if there enough rows to paste the data
    SourceRcount = SourceRange.Rows.Count
    If rnum + SourceRcount >= BaseWks.Rows.Count Then
    MsgBox "Sorry there are not enough rows in the sheet to paste"
    mybook.Close savechanges:=False
    BaseWks.Parent.Close savechanges:=False
    GoTo ExitTheSub
    End If
    'Set the destination cell
    If FileNameInA = True Then
    Set destrange = BaseWks.Range("C" & rnum)
    With SourceRange
    BaseWks.Cells(rnum, "A"). _
    Resize(.Rows.Count).Value = myReturnedFiles(I)
    BaseWks.Cells(rnum, "B"). _
    Resize(.Rows.Count).Value = sh.Name
    End With
    Else
    Set destrange = BaseWks.Range("A" & rnum)
    End If
    'Copy/paste the data
    If PasteAsValues = True Then
    With SourceRange
    Set destrange = destrange. _
    Resize(.Rows.Count, .Columns.Count)
    End With
    destrange.Value = SourceRange.Value
    Else
    SourceRange.Copy destrange
    End If
    rnum = rnum + SourceRcount
    End If
    Next sh
    'Close the workbook without saving
    mybook.Close savechanges:=False
    End If
    End If
    'Open the next workbook
    Next I
    'Set the column width in the new workbook
    BaseWks.Columns.AutoFit
    ExitTheSub:
    'Restore ScreenUpdating, Calculation and EnableEvents
    With Application
    .ScreenUpdating = True
    .EnableEvents = True
    .Calculation = CalcMode
    End With
    End Sub


    [/vba]

  2. #2
    Distinguished Lord of VBAX VBAX Grand Master Bob Phillips's Avatar
    Joined
    Apr 2005
    Posts
    25,456
    Location
    That seems an awful lot of code to do a very simple thing.

    Change

    [vba]

    'Add a new workbook with one sheet named "Combine Sheet"
    Set BaseWks = Workbooks.Add(xlWBATWorksheet).Worksheets(1)
    [/vba]

    to

    [vba]

    Set BaseWks = ACtiveworkbook.Worksheets("SData")
    [/vba]
    ____________________________________________
    Nihil simul inventum est et perfectum

    Abusus non tollit usum

    Last night I dreamed of a small consolation enjoyed only by the blind: Nobody knows the trouble I've not seen!
    James Thurber

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •