Gộp dữ liệu trên các sheet trên file Dongia để đưa vào 1 Mãng trên file B mà không cần mở file Dongia

Liên hệ QC

chisinhvnn

Thành viên tiêu biểu
Tham gia
7/3/08
Bài viết
478
Được thích
103
Nhờ các anh chị giúp đoạn code để lấy dữ liệu các sheet trên file Dơn gia để đưa vào một Mãng trên file B mà không cần mở file Don gia Xin cảm ơn
 

File đính kèm

  • Don gia.xlsx
    144 KB · Đọc: 21
Lần chỉnh sửa cuối:
Nhờ các anh chị giúp đoạn code để lấy dữ liệu các sheet trên file Dơn gia để đưa vào một Mãng trên file B mà không cần mở file Don gia Xin cảm ơn

Góp vui chống dịch. làm theo ý tự hiểu, không biết có đúng ý bạn không? tạm đặt tên Sh trả về kết quả (ShB như cách bạn gọi) là "TONGHOP"
Code này copy của tác giả nào đó trên GPE tôi chế lại tý chút cho hợp đầu bài
Nếu đúng ý và sử dụng code này, hãy gủi lời cảm ơn đến các anh chị em trong BQT diễn đàn và cá nhân các PTM, HieuCD, SA_DQ, befiant, be-09, batman, Ba Tê, VietMini, Maika8008,..... nhé.
Mã:
Sub DONVE1FILE() 'L?y d? li?u t? 1 Workbook khác
Dim wb As Workbook
Dim sh As Worksheet, ws As Worksheet
Dim sPat As String, swb As String
Dim lr&, col&, d&
Application.DisplayAlerts = False
Set sh = Sheets("TONGHOP")            ' ten sh cân dôn du lieu vê
 sh.Range("A1: F100000").ClearContents
sPat = "C:\Users\Admin\Downloads\"   ' lây duong dan neu o v? trí khác thì thay dôi
swb = "Don gia.xlsx"                 ' láy file cân don vê 1 sh o 1 file khác
Set wb = Workbooks.Open(sPat & swb)
t = 1
For Each ws In wb.Worksheets
            If ws.Cells(2, 1) <> Empty Then
               If t = 1 Then
                    ws.UsedRange.Copy ThisWorkbook.Sheets("TONGHOP").Range("A1")
               Else
                    lr = ThisWorkbook.Sheets("TONGHOP").Range("A" & Rows.Count).End(3).Row
                    d = ws.UsedRange.Rows.Count
                    col = ws.UsedRange.Columns.Count
                    ws.Range(ws.Cells(2, 1), ws.Cells(d, col)).Copy ThisWorkbook.Sheets("TONGHOP").Range("A" & lr + 1)
               End If
            End If
        t = t + 1
Next ws
wb.Close False
MsgBox " Xong"
End Sub
[code]
 

File đính kèm

  • TONGHOP NHIEU FILE VAO 1 Sh Ở FILE KHÁC (MsChiSinh).xlsm
    192.2 KB · Đọc: 13
File Dongia không mở, file B chưa có, rốt cuộc code chứa trong file nào?
 
Ai bảo bạn rằng ADO sẽ không mở file ra vậy? Đưa đoạn code dùng ADO mà không mở file xem.
 
hãy gủi lời cảm ơn đến các anh chị em trong BQT diễn đàn và cá nhân các PTM, ...
Cám ơn bạn đã nhắc đến tôi, nhưng loại bài thế này tôi chưa từng viết code nên không dám nhận.
Với bài này và với phương pháp Power query thì tạo 1 query với lệnh sau:
PHP:
let
    FName= "E:\Data\ThanhMy\DOWNLOAD\Don gia.xlsx",
    Source = Table.Combine({Table.PromoteHeaders(Excel.Workbook(File.Contents(FName), null, true){[Item="GIA CAY",Kind="Sheet"]}[Data],
                  [PromoteAllScalars=true]),
            Table.PromoteHeaders(Excel.Workbook(File.Contents(FName), null, true) {[Item="GIA DAT",Kind="Sheet"]}[Data],
                  [PromoteAllScalars=true]),
            Table.PromoteHeaders(Excel.Workbook(File.Contents(FName), null, true){[Item="GIA NHA",Kind="Sheet"]}[Data],
                  [PromoteAllScalars=true]),
            Table.PromoteHeaders(Excel.Workbook(File.Contents(FName), null, true){[Item="HO TRO KHAC",Kind="Sheet"]}[Data],
                  [PromoteAllScalars=true])})
in Source

Lưu ý: tiêu đề cả 4 sheet phải giống nhau, hiện tại sheet giá nhà không giống 3 sheet còn lại
 
Lần chỉnh sửa cuối:
Cám ơn bạn đã nhắc đến tôi, nhưng loại bài thế này tôi chưa từng viết code nên không dám nhận.
Với bài này và với phương pháp Power query thì tạo 1 query với lệnh sau:
PHP:
let
    FName= "E:\Data\ThanhMy\DOWNLOAD\Don gia.xlsx",
    Source = Table.Combine({Table.PromoteHeaders(Excel.Workbook(File.Contents(FName), null, true){[Item="GIA CAY",Kind="Sheet"]}[Data],
                  [PromoteAllScalars=true]),
            Table.PromoteHeaders(Excel.Workbook(File.Contents(FName), null, true) {[Item="GIA DAT",Kind="Sheet"]}[Data],
                  [PromoteAllScalars=true]),
            Table.PromoteHeaders(Excel.Workbook(File.Contents(FName), null, true){[Item="GIA NHA",Kind="Sheet"]}[Data],
                  [PromoteAllScalars=true]),
            Table.PromoteHeaders(Excel.Workbook(File.Contents(FName), null, true){[Item="HO TRO KHAC",Kind="Sheet"]}[Data],
                  [PromoteAllScalars=true])})
in Source

Lưu ý: tiêu đề cả 4 sheet phải giống nhau, hiện tại sheet giá nhà không giống 3 sheet còn lại

Anh và một số thành viên khác trên diễn đàn này hoàn toàn xứng đáng để được nhận những lời cảm ơn từ những bạn đọc, những thành viên mới tập tọng về VBA nói riêng và MS Excel nói chung, bỏi vì anh và một số anh khác trên diễn đàn xứng đáng được gọi là "THẦY" với đầy đủ ý nghĩa. Có thể anh chưa viết code về đề tài này, nhưng những bài viết khác, sách hướng dẫn anh viết đã phần nào giúp cho người khác viết được code, hoặc mở ra ý tưởng để giải quyết vấn đề.... Đọc những bài viết của anh trên diễn đàn người đọc cảm nhận được sự tân tâm giúp đỡ và truyền thụ kiến thức của mình cho người khác đến từ anh, mà không hề có này nọ, nọ kia....
 
Một cách khác của Power query không cần lấy hết sheet rồi combine lại. Cách ở bài #12 phải biết số lượng sheet và tên sheet.
Với cách mới này thì bao nhiêu sheet cũng lấy hết và không cần biết tên sheet, file nguồn thêm sheet, query cũng tự động thêm vào
PHP:
let
    FName="D:\MyPham\MY BOOK\MCode-PowerQuery\Don gia.xlsx",
    Source = Table.SelectRows(Excel.Workbook(File.Contents(FName), null, true),each ([Kind] = "Sheet"))[Data],
    List1 =  Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    ListColumns = Table.ColumnNames(List1{0}[Column1]),
    List2 = Table.PromoteHeaders(Table.ExpandTableColumn(List1,"Column1",ListColumns)),
    Ketqua = Table.SelectRows(List2, each ([MA] <> "MA"))
 
in
    Ketqua
 
Lần chỉnh sửa cuối:
Một cách khác của Power query không cần lấy hết sheet rồi combine lại. Cách ở bài #12 phải biết số lượng sheet và tên sheet.
Với cách mới này thì bao nhiêu sheet cũng lấy hết và không cần biết tên sheet, file nguồn thêm sheet, query cũng tự động thêm vào
PHP:
let
    FName="D:\MyPham\MY BOOK\MCode-PowerQuery\Don gia.xlsx",
    Source = Table.SelectRows(Excel.Workbook(File.Contents(FName), null, true),each ([Kind] = "Sheet"))[Data],
    List1 =  Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    ListColumns = Table.ColumnNames(List1{0}[Column1]),
    List2 = Table.PromoteHeaders(Table.ExpandTableColumn(List1,"Column1",ListColumns)),
    Ketqua = Table.SelectRows(List2, each ([MA] <> "MA"))
 
in
    Ketqua
Thêm 1 trường dữ liệu của Sheet nào nữa thì đẹp ạ.
 
Thêm 1 trường dữ liệu của Sheet nào nữa thì đẹp ạ.
Phải dùng vòng lặp để mỗi table con add 1 column
PHP:
let
    FName="D:\MyPham\MY BOOK\MCode-PowerQuery\Don gia.xlsx",
    Source = Table.SelectRows(Excel.Workbook(File.Contents(FName), null, true),each ([Kind] = "Sheet")),
    SourceData=Source[Data],
    SheetName=Source[Item],
    SheetNum={0..List.Count(SheetName)-1},
    DataN= List.Transform(SheetNum, (i) =>
    let
        Data0 = Source[Data]{i},
        Datai = Table.AddColumn(Data0, "Sheet", each SheetName{i})
    in Datai),
    List1 =  Table.FromList(DataN, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    ListColumns = Table.ColumnNames(List1{0}[Column1]),
    List2 = Table.PromoteHeaders(Table.ExpandTableColumn(List1,"Column1",ListColumns)),
    Ketqua = Table.SelectRows(List2, each ([MA] <> "MA"))
  
in
    Ketqua
 
Nếu Promote Headers trong vòng lặp thay vì bên ngoài thì có thể bỏ qua bước cuối Filter, nhờ vậy không cần biết tên cột

PHP:
let
    FName="D:\MyPham\MY BOOK\MCode-PowerQuery\Don gia.xlsx",
    Source = Table.SelectRows(Excel.Workbook(File.Contents(FName), null, true),each ([Kind] = "Sheet")),
    SourceData=Source[Data],
    SheetName=Source[Item],
    SheetNum={0..List.Count(SheetName)-1},
    DataN= List.Transform(SheetNum, (i) =>
    let
        Data0 = Source[Data]{i},
        Datai = Table.AddColumn(Table.PromoteHeaders(Data0), "SheetName", each SheetName{i})
    in Datai),
    List1 =  Table.FromList(DataN, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    ListColumns = Table.ColumnNames(List1{0}[Column1]),
    List2 = Table.ExpandTableColumn(List1,"Column1",ListColumns)
in
    List2
 
Web KT
Back
Top Bottom