Nhờ sửa code VBA lấy dữ liệu từ file excel khác (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

alonelove

Thành viên chính thức
Tham gia
7/9/10
Bài viết
52
Được thích
2
Mình muốn lấy dữ liệu vùng B19:I785 vào file MAIN.xlsm

Trong file MAIN.xlsm, tại sheet "Main" nhấn nút "Get DATA" sẽ brown file tới Foder đích để chọn tầm 22 file có cấu trúc giống hệt nhau. Sau đó copy dữ liệu từ 22 file này tới sheet DATA trong file MAIN.xlsm (sheet DATA chưa có sẽ tạo hoặc có rồi sẽ delete tạo lại)

Đây là code mình sưu tầm được:
Mã:
Private Declare Function SetCurrentDirectoryA Lib _
    "kernel32" (ByVal lpPathName As String) As Long

Sub ChDirNet(szPath As String)
    SetCurrentDirectoryA szPath
End Sub


Sub MergeSpecificWorkbooks()
    Dim MyPath As String
    Dim SourceRcount As Long, FNum As Long
    Dim mybook As Workbook, BaseWks As Worksheet
    Dim sourceRange As Range, destrange As Range
    Dim rnum As Long, CalcMode As Long
    Dim SaveDriveDir As String
    Dim FName As Variant


    ' Set application properties.
    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    SaveDriveDir = CurDir
    ' Change this to the path\folder location of the files.
    ChDirNet "C:\Users\alone"

    FName = Application.GetOpenFilename(filefilter:="Excel Files (*.xl*), *.xl*", _
                                        MultiSelect:=True)
    If IsArray(FName) Then

        ' Delete the summary sheet if it exists.
    Application.DisplayAlerts = False
    On Error Resume Next
    ActiveWorkbook.Worksheets("DATA").Delete
    On Error GoTo 0
    Application.DisplayAlerts = True

    ' Add a new summary worksheet.
    Set DestSh = ActiveWorkbook.Worksheets.Add
    DestSh.Name = "DATA"


        ' Loop through all files in the myFiles array.
        For FNum = LBound(FName) To UBound(FName)
            Set mybook = Nothing
            On Error Resume Next
            Set mybook = Workbooks.Open(FName(FNum))
            On Error GoTo 0

            If Not mybook Is Nothing Then

                On Error Resume Next
                With mybook.Worksheets(1)
                    Set sourceRange = .Range("B19:I785")
                End With

                If Err.Number > 0 Then
                    Err.Clear
                    Set sourceRange = Nothing
                Else
                    ' If the source range uses 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

                    SourceRcount = sourceRange.Rows.Count

                    If rnum + SourceRcount >= BaseWks.Rows.Count Then
                        MsgBox "There are not enough rows in the target worksheet."
                        BaseWks.Columns.AutoFit
                        mybook.Close savechanges:=False
                        GoTo ExitTheSub
                    Else

                        ' Copy the file name in column A.
                        With sourceRange
                            BaseWks.Cells(rnum, "A"). _
                                    Resize(.Rows.Count).Value = FName(FNum)
                        End With

                        ' Set the destination range.
                        Set destrange = BaseWks.Range("B" & rnum)

                        ' Copy the values from the source range
                        ' to the destination range.
                        With sourceRange
                            Set destrange = destrange. _
                                            Resize(.Rows.Count, .Columns.Count)
                        End With
                        destrange.Value = sourceRange.Value
                        rnum = rnum + SourceRcount
                    End If
                End If
                mybook.Close savechanges:=False
            End If

        Next FNum
        BaseWks.Columns.AutoFit
    End If

ExitTheSub:
    ' Restore the application properties.
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = CalcMode
    End With
    ChDirNet SaveDriveDir
End Sub

Code này nó báo lỗi tại dòng BaseWks.Columns.AutoFit => mình đã bôi đỏ

Nhờ các bạn giúp sửa code với ạ, đính kèm file để các bạn dễ hình dung.

Cảm ơn nhiều ạ./.
 

File đính kèm

Không thấy chỗ nào màu đỏ cả. :D
Trên diễn đàn có rất rất nhiều bài tổng hợp dữ liệu từ nhiều file rồi. Bạn chịu khó tìm xem... copy về là xài được luôn. Mới đây nhất có bạn cần tổng hợp từ 600 "anh em" files ấy.
Chờ người sửa code chắc chờ tới 2 mùa quýt.
 
Upvote 0
cảm ơn bạn replay nhé, 4rum mình cũng kiếm rồi mà chưa ưng ý lắm kiếm code này về xem sao ấy mà.

Nếu bạn có thời gian thì giúp với nhé, mình có đính kèm file đó chạy bị lỗi. À nãy lúc post threat có bôi đỏ đoạn code báo lỗi mà post lên đen thui hết. sorry
 
Upvote 0
Mình muốn lấy dữ liệu vùng B19:I785 vào file MAIN.xlsm

Trong file MAIN.xlsm, tại sheet "Main" nhấn nút "Get DATA" sẽ brown file tới Foder đích để chọn tầm 22 file có cấu trúc giống hệt nhau. Sau đó copy dữ liệu từ 22 file này tới sheet DATA trong file MAIN.xlsm (sheet DATA chưa có sẽ tạo hoặc có rồi sẽ delete tạo lại)

Đây là code mình sưu tầm được:
Mã:
Private Declare Function SetCurrentDirectoryA Lib _
    "kernel32" (ByVal lpPathName As String) As Long

Sub ChDirNet(szPath As String)
    SetCurrentDirectoryA szPath
End Sub


Sub MergeSpecificWorkbooks()
    Dim MyPath As String
    Dim SourceRcount As Long, FNum As Long
    Dim mybook As Workbook, BaseWks As Worksheet
    Dim sourceRange As Range, destrange As Range
    Dim rnum As Long, CalcMode As Long
    Dim SaveDriveDir As String
    Dim FName As Variant


    ' Set application properties.
    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    SaveDriveDir = CurDir
    ' Change this to the path\folder location of the files.
    ChDirNet "C:\Users\alone"

    FName = Application.GetOpenFilename(filefilter:="Excel Files (*.xl*), *.xl*", _
                                        MultiSelect:=True)
    If IsArray(FName) Then

        ' Delete the summary sheet if it exists.
    Application.DisplayAlerts = False
    On Error Resume Next
    ActiveWorkbook.Worksheets("DATA").Delete
    On Error GoTo 0
    Application.DisplayAlerts = True

    ' Add a new summary worksheet.
    Set DestSh = ActiveWorkbook.Worksheets.Add
    DestSh.Name = "DATA"


        ' Loop through all files in the myFiles array.
        For FNum = LBound(FName) To UBound(FName)
            Set mybook = Nothing
            On Error Resume Next
            Set mybook = Workbooks.Open(FName(FNum))
            On Error GoTo 0

            If Not mybook Is Nothing Then

                On Error Resume Next
                With mybook.Worksheets(1)
                    Set sourceRange = .Range("B19:I785")
                End With

                If Err.Number > 0 Then
                    Err.Clear
                    Set sourceRange = Nothing
                Else
                    ' If the source range uses 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

                    SourceRcount = sourceRange.Rows.Count

                    If rnum + SourceRcount >= BaseWks.Rows.Count Then
                        MsgBox "There are not enough rows in the target worksheet."
                        BaseWks.Columns.AutoFit
                        mybook.Close savechanges:=False
                        GoTo ExitTheSub
                    Else

                        ' Copy the file name in column A.
                        With sourceRange
                            BaseWks.Cells(rnum, "A"). _
                                    Resize(.Rows.Count).Value = FName(FNum)
                        End With

                        ' Set the destination range.
                        Set destrange = BaseWks.Range("B" & rnum)

                        ' Copy the values from the source range
                        ' to the destination range.
                        With sourceRange
                            Set destrange = destrange. _
                                            Resize(.Rows.Count, .Columns.Count)
                        End With
                        destrange.Value = sourceRange.Value
                        rnum = rnum + SourceRcount
                    End If
                End If
                mybook.Close savechanges:=False
            End If

        Next FNum
        BaseWks.Columns.AutoFit
    End If

ExitTheSub:
    ' Restore the application properties.
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = CalcMode
    End With
    ChDirNet SaveDriveDir
End Sub

Code này nó báo lỗi tại dòng BaseWks.Columns.AutoFit => mình đã bôi đỏ

Nhờ các bạn giúp sửa code với ạ, đính kèm file để các bạn dễ hình dung.

Cảm ơn nhiều ạ./.
Lỗi ở chỗ này nè
Set sourceRange = .Range("B19:I785") (bạn lấy rang thì đoạn code dưới Columns.count sao được nữa nếu biết 8 cột thì dùng luon

If sourceRange.Columns.Count >= BaseWks.Columns.Count Then
Set sourceRange = Nothing
End If
 
Upvote 0
Lỗi ở chỗ này nè
Set sourceRange = .Range("B19:I785") (bạn lấy rang thì đoạn code dưới Columns.count sao được nữa nếu biết 8 cột thì dùng luon

If sourceRange.Columns.Count >= BaseWks.Columns.Count Then
Set sourceRange = Nothing
End If
Cảm ơn bạn nhiều, vì file cần lấy có số liệu tới row 785 thôi bạn, từ row 786 là các dòng text chú thích với comment mà mình chỉ muốn lấy data thôi.

Bạn có cách gì sửa nguyên code chạy không ạ
 
Upvote 0

File đính kèm

Upvote 0
Thanks hpkhuong

Code này mình cũng ngâm cứu trên GPE rồi (Sorry vì quên mất link topic, hình như ADO thì phải) và thấy chạy được nhưng vẫn còn một số vẫn đề như sau:

1. Dữ liệu copy vào dạng text (tức là giữ nguyên forrmat file nguồn), mình muốn khi dán định dạng số.
2. Không lấy được tên file vào cột A, mình cần lấy tên file để biết được dử liệu đó nó nằm ở file nguồn nào ấy mà.
3. Nếu mình tạo 1 Button để gán code vào thì mặc định dữ liệu sẽ được Patch vào sheet chứa button, mình muốn dữ liệu được patch vào sheet chỉ định như sheet "DATA" chẳng hạn.

Một lần nữa cảm ơn các bạn giúp đỡ ạ, mình cũng đang "ngâm cứu" thêm.
 
Lần chỉnh sửa cuối:
Upvote 0
Tuyệt vời bạn hpkhuong nhưng còn một lỗi nho nhỏ:

Code chạy được 1 lần, nếu chạy code lần thứ 2 thì nó mặc nhiên nối tiếp vào dữ liệu có trước. Vì vậy muốn chạy code tiếp cần xóa dữ liệu trong sheet DATA thủ công, bạn có thể thêm chút code xóa hết dữ liệu cũ trước khi gán dữ liệu mới không ạ??

Nhân tiện cho mình hỏi ý nghĩa của f1, val(f3) là gì được không ạ?
 
Upvote 0
Thật là vui vì 4rum mình được giúp đỡ tận tình. Code của bạn quá chuẩn luôn.

Mình cũng vừa nghiên cứu ra thêm code này sau phần dim là clear hết trong sheet "DATA", tuy nhiên rõ ràng sẽ thiếu cột tiêu đề
Mã:
With Sheets("DATA").Cells.Clear

End With

Cảm ơn bạn hpkhuong nhiều lắm, nhờ bạn mà mình bớt hẳn 4h làm việc mỗi tuần để copy dữ liệu chưa kể có khi copy sót cột hay hàng nữa.
 
Upvote 0
Vậy mình mời anh í chầu nhậu chứ nhỉ? ;);)
Nếu có cơ hội thì sẵn sàng thôi, tui đang làm việc tại Nha Trang, chưa thấy GPE offlone tại Nha Trang lần nào không thì cũng tham gia rồi.

Nhân tiện có ACE nào ở Nha Trang hoặc đi đâu đó có ghé qua thì liên hệ tui nhé, trước mắt có chầu cafe đã sau đó tính tiếp ^^!
 
Upvote 0
À có xíu lỗi "oánh mái" dư chữ "a" hi hi

Mình đính kèm 3 file cân đối lên bạn xem thử với ạ.

Thanks
Thì ra cậu làm o SBV hả, tớ cũng vừa làm xong PM chuyên dùng TH số liệu từ CĐ, nếu bạn cần liên hệ mình sẽ tặng (trungkiensbv2803@gmail.com)
 
Upvote 0
Thì ra cậu làm o SBV hả, tớ cũng vừa làm xong PM chuyên dùng TH số liệu từ CĐ, nếu bạn cần liên hệ mình sẽ tặng (trungkiensbv2803@gmail.com)
Bạn cũng làm ở SBV à? sắp tới đụng nhiều số liệu quá nên phải tìm cách "liệu liệu mà lấy số" thôi. Để mình email
 
Upvote 0
xúi chủ thớt nhờ tiếp nè
1/ Tạo thêm 1 file mới cho chung vào với cái mớ file đó trong 1 Folder ... Nhưng file đó ko có tên sheet là G000141
2/Thử chạy code chọn hết 1 mớ file đó trong đó có File ko có tên sheet nêu trên ... xem điều gì sẻ xẩy ra he
3/ Xong lại nhờ tiếp ........................ học mà chơi ............. chơi mà học mà .......... như vậy sẻ nhanh viết được code đó nhe ............... Mình Run nha :D:p
 
Upvote 0
Thử làm như Mr kieu manh nói thì nó bão lỗi thế này ^^!:
 

File đính kèm

  • GPE.jpg
    GPE.jpg
    32.5 KB · Đọc: 17
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom