chisinhvnn
Thành viên tiêu biểu

- Tham gia
- 7/3/08
- Bài viết
- 479
- Được thích
- 106
Dạ file dữ liệu cần muốn lấy anh (File A).
Vậy file B đâu bạn?Dạ file dữ liệu cần muốn lấy anh (File A).
Dạ tạo file bất kỳ được anh. Nhờ anh giúp đỡVậy file B đâu bạn?
Nếu lấy cả các sheet thì chỉ cần đổi tên file là xong.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
mình không hểu ý anh lámNếu lấy cả các sheet thì chỉ cần đổi tên file là xong.
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
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]
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 ơnFile Dongia không mở, file B chưa có, rốt cuộc code chứa trong file nào?
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.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, ...
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
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
Em biết là trong code chắc có mở file, nhưng khi gán code trên một Button gì đó thì chắc không thấy file mở. Nhờ anh giúp đỡ em. Cảm ơn anhAi 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.
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 ạ.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ử xem sao,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 columnThêm 1 trường dữ liệu của Sheet nào nữa thì đẹp ạ.
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
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
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"
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à TableTrong tài liệu chỗ Kind đó có danh sách cụ thể không anh?
Ý 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...)Khi chưa lọc thì chỉ có 2 Kind Sheet và Table
Bạn thử với code sau nhé: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
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 đỡ.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
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.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.
Có thể gán nó vào mảng như sau nha 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 đỡ.
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