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 (1 người xem)

Liên hệ QC

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

chisinhvnn

Thành viên tiêu biểu
Tham gia
7/3/08
Bài viết
479
Được thích
106
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

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

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
 
Anh cho em hỏi, chỗ [Kind] = "Sheet", thì Sheet ở đây có phân biệt Chart sheet và Worksheet không?
Rất tiếc là không. Thế nên file dữ liệu tốt nhất không vẽ vời báo cáo hay biểu đồ. Tốt nhất là format as table tất cả bảng dữ liệu và lọc [Kind] = "Table"

1627612965979.png
 
Trong tài liệu chỗ Kind đó có danh sách cụ thể không anh?
Trong tài liệu hàm M tiếng Anh mà tôi dùng thì chỉ có cú pháp hàm để ra kết quả, không chi tiết hoá kết quả. Mà như hình bài trên thì chart sheet bị đánh đồng Kind là "sheet". Khi chưa lọc thì chỉ có 2 Kind Sheet và Table
 
Dạ, file B anh tạo file mới anh. Anh làm giúp bằng ADO giúp em với. Em cảm ơn
Bạn thử với code sau nhé:

Mã:
Sub LayDL_HLMT()
    Dim strPath As String
    strPath = "C:\Users\HP\Downloads\Don gia.xlsx" 'Chinh duong dan den file 'Don gia.xlsx'
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath & ";Extended Properties=""Excel 12.0;HDR=No""")
        Sheet1.Range("A2").CopyFromRecordset .Execute("Select * From [GIA NHA$A2:F] Union All Select * From [GIA CAY$A2:F] Union All Select * From [GIA DAT$A2:F] Union All Select * From [HO TRO KHAC$A2:F]")
    End With
End Sub
 
Ý em hỏi "danh sách cụ thể" của Kind đó là gì. Ngoài (Sheet, Table) thì còn loại nào nữa không anh? (Ví dụ Range, Name...)
Không "chi tiết hoá kết quả" tức là không có "danh sách cụ thể" :p :p :p
Range: Chưa từng thấy
Name: có từng xài 1 Kind là DefinedName, Chỉ liệt kê Name tĩnh, không chơi name động

1627618538281.png
 
Lần chỉnh sửa cuối:
Bạn thử với code sau nhé:

Mã:
Sub LayDL_HLMT()
    Dim strPath As String
    strPath = "C:\Users\HP\Downloads\Don gia.xlsx" 'Chinh duong dan den file 'Don gia.xlsx'
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath & ";Extended Properties=""Excel 12.0;HDR=No""")
        Sheet1.Range("A2").CopyFromRecordset .Execute("Select * From [GIA NHA$A2:F] Union All Select * From [GIA CAY$A2:F] Union All Select * From [GIA DAT$A2:F] Union All Select * From [HO TRO KHAC$A2:F]")
    End With
End Sub
Cảm ơn anh. Nhưng kết quả chưa đúng anh. sheet Gia Nhà, cột Hệ số 1,08, khi copy xong thì nó thành 108 anh. Cho em hỏi thêm. Có thể gán trực tiếp trên biến luôn được không? không gán vào sheet nữa. Nhờ anh giúp đỡ.
 
Cảm ơn anh. Nhưng kết quả chưa đúng anh. sheet Gia Nhà, cột Hệ số 1,08, khi copy xong thì nó thành 108 anh.
Nó lấy dữ liệu theo kiểu chuẩn không phải kiểu của Tiếng Việt nhé bạn.

Cho em hỏi thêm. Có thể gán trực tiếp trên biến luôn được không? không gán vào sheet nữa. Nhờ anh giúp đỡ.
Có thể gán nó vào mảng như sau nha bạn.

Mã:
Sub LayDL_HLMT()
    Dim strPath As String
    Dim Arr() As Variant
    strPath = "C:\Users\HP\Downloads\Don gia.xlsx" 'Chinh duong dan den file 'Don gia.xlsx'
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath & ";Extended Properties=""Excel 12.0;HDR=No""")
        Arr() = .Execute("Select * From [GIA NHA$A2:F] Union All Select * From [GIA CAY$A2:F] Union All Select * From [GIA DAT$A2:F] Union All Select * From [HO TRO KHAC$A2:F]").Getrows
    End With
End Sub
 

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

Back
Top Bottom