maixuanvuong276
Thành viên mới

- Tham gia
- 28/8/13
- Bài viết
- 31
- Được thích
- 3
- Giới tính
- Nam
- Nghề nghiệp
- Human
thử cái code này.Nhờ các cao nhân giúp mình gộp dữ liệu từ sheet 1 sang sheet 2, các SP trùng nhau thì cộng dồn lại, kq mong muốn như sheet2 trong file. Chân thành cảmơnạ!
Sub gop()
Dim i As Long, lr As Long, dic As Object, a As Long, arr, kq(1 To 1000, 1 To 6), b As Long, dk As String, j As Long
Set dic = CreateObject("scripting.dictionary")
With Sheets("sheet1")
lr = .Range("C" & Rows.Count).End(xlUp).Row
If lr > 2 Then
arr = .Range("B3:G" & lr).Value
For i = 1 To UBound(arr)
dk = arr(i, 1)
If Not dic.exists(dk) Then
a = a + 1
dic.Add dk, a
For j = 1 To 6
kq(a, j) = arr(i, j)
Next j
Else
b = dic.Item(dk)
kq(b, 4) = kq(b, 4) + arr(i, 4)
kq(b, 6) = kq(b, 6) + arr(i, 6)
End If
Next i
End If
End With
With Sheets("sheet2")
lr = .Range("C" & Rows.Count).End(xlUp).Row
If lr > 2 Then
arr = .Range("B3:G" & lr).Value
For i = 1 To UBound(arr)
dk = arr(i, 1)
If Not dic.exists(dk) Then
a = a + 1
dic.Add dk, a
For j = 1 To 6
kq(a, j) = arr(i, j)
Next j
Else
b = dic.Item(dk)
kq(b, 4) = kq(b, 4) + arr(i, 4)
kq(b, 6) = kq(b, 6) + arr(i, 6)
End If
Next i
End If
lr = .Range("j" & Rows.Count).End(xlUp).Row
If lr > 2 Then .Range("J3:O" & lr).ClearContents
If a Then .Range("j3:o3").Resize(a).Value = kq
End With
Set dic = Nothing
End Sub
Tks bạn nhiều, bạn ơi còn Thiếu hàng tính tổng cộng, bạn giúp mình luôn đc hk! cảm ơn bạn trc ạ!thử cái code này.
Mã:Sub gop() Dim i As Long, lr As Long, dic As Object, a As Long, arr, kq(1 To 1000, 1 To 6), b As Long, dk As String, j As Long Set dic = CreateObject("scripting.dictionary") With Sheets("sheet1") lr = .Range("C" & Rows.Count).End(xlUp).Row If lr > 2 Then arr = .Range("B3:G" & lr).Value For i = 1 To UBound(arr) dk = arr(i, 1) If Not dic.exists(dk) Then a = a + 1 dic.Add dk, a For j = 1 To 6 kq(a, j) = arr(i, j) Next j Else b = dic.Item(dk) kq(b, 4) = kq(b, 4) + arr(i, 4) kq(b, 6) = kq(b, 6) + arr(i, 6) End If Next i End If End With With Sheets("sheet2") lr = .Range("C" & Rows.Count).End(xlUp).Row If lr > 2 Then arr = .Range("B3:G" & lr).Value For i = 1 To UBound(arr) dk = arr(i, 1) If Not dic.exists(dk) Then a = a + 1 dic.Add dk, a For j = 1 To 6 kq(a, j) = arr(i, j) Next j Else b = dic.Item(dk) kq(b, 4) = kq(b, 4) + arr(i, 4) kq(b, 6) = kq(b, 6) + arr(i, 6) End If Next i End If lr = .Range("j" & Rows.Count).End(xlUp).Row If lr > 2 Then .Range("J3:O" & lr).ClearContents If a Then .Range("j3:o3").Resize(a).Value = kq End With Set dic = Nothing End Sub
được rồi bạn! tks bạn nhiều nhé!Cái đấy viết công thức vào là được mà.
Sao bạn không làm một vòng lặp duyệt qua các Sh để lấy dữ liệu vào mảng.thử cái code này.
Mã:Sub gop() Dim i As Long, lr As Long, dic As Object, a As Long, arr, kq(1 To 1000, 1 To 6), b As Long, dk As String, j As Long Set dic = CreateObject("scripting.dictionary") With Sheets("sheet1") lr = .Range("C" & Rows.Count).End(xlUp).Row If lr > 2 Then arr = .Range("B3:G" & lr).Value For i = 1 To UBound(arr) dk = arr(i, 1) If Not dic.exists(dk) Then a = a + 1 dic.Add dk, a For j = 1 To 6 kq(a, j) = arr(i, j) Next j Else b = dic.Item(dk) kq(b, 4) = kq(b, 4) + arr(i, 4) kq(b, 6) = kq(b, 6) + arr(i, 6) End If Next i End If End With With Sheets("sheet2") lr = .Range("C" & Rows.Count).End(xlUp).Row If lr > 2 Then arr = .Range("B3:G" & lr).Value For i = 1 To UBound(arr) dk = arr(i, 1) If Not dic.exists(dk) Then a = a + 1 dic.Add dk, a For j = 1 To 6 kq(a, j) = arr(i, j) Next j Else b = dic.Item(dk) kq(b, 4) = kq(b, 4) + arr(i, 4) kq(b, 6) = kq(b, 6) + arr(i, 6) End If Next i End If lr = .Range("j" & Rows.Count).End(xlUp).Row If lr > 2 Then .Range("J3:O" & lr).ClearContents If a Then .Range("j3:o3").Resize(a).Value = kq End With Set dic = Nothing End Sub
Sub gop()
Dim i As Long, lr As Long, dic As Object, a As Long, C&, D&, tong&
Dim arr, kq(1 To 1000, 1 To 6), b As Long, dk As String, j As Long
Dim Sh As Worksheet, rng As Range
Set dic = CreateObject("scripting.dictionary")
For Each Sh In Worksheets
lr = Sh.Range("C" & Rows.Count).End(xlUp).Row
Set rng = Sh.Range("A1:G" & lr)
Set Item = rng.Find("Tên SP")
If Not Item Is Nothing Then
D = Item.Row + 1
arr = Sh.Range("B" & D, "G" & lr).Value
For i = 1 To UBound(arr)
dk = arr(i, 1)
If Not dic.exists(dk) Then
a = a + 1
dic.Add dk, a
For j = 1 To 6
kq(a, j) = arr(i, j)
Next j
Else
b = dic.Item(dk)
kq(b, 4) = kq(b, 4) + arr(i, 4)
kq(b, 6) = kq(b, 6) + arr(i, 6)
End If
tong = tong + arr(i, 6)
kq(a + 1, 1) = "TÔNG CÔNG"
kq(a + 1, 6) = tong
Next i
End If
Next Sh
With Sheets("sheet2")
.Range("J16").Resize(1000, 6).ClearContents
If a Then .Range("J16").Resize(a + 1, 6).Value = kq
.Range("J16").Resize(a + 1, 6).Borders.LineStyle = 1
End With
Set dic = Nothing
MsgBox "xong"
End Sub
cái này hay đấy ... mà nó có tổng hợp được data ở file bất kỳ đang đóng mà ko biết tên Sheet ko bạnThử dùng Power Query nhé.
Kết quả ở sheet PowerQuery.
Click phải chuột vào dùng dữ liệu chọn refresh.
Bạn thụt đầu dòng bị lố. Chắc là chưa biết rõ vì sao cần phải thụt đầu dòng nhỉ? Bên trong With... End With, If...End If và các vòng lặp For...Next, Do... Loop,... thì mới thụt 1 tab để cho dễ dò code, biết được code bên trong chúng đến đâu là kết thúc.Sao bạn không làm một vòng lặp duyệt qua các Sh để lấy dữ liệu vào mảng.
Xin phép bạn tôi sửa lại code như sau:
bị lỗi chỗ item rồi bạn ơiSao bạn không làm một vòng lặp duyệt qua các Sh để lấy dữ liệu vào mảng.
Xin phép bạn tôi sửa lại code như sau:
Mã:Sub gop() Dim i As Long, lr As Long, dic As Object, a As Long, C&, D&, tong& Dim arr, kq(1 To 1000, 1 To 6), b As Long, dk As String, j As Long Dim Sh As Worksheet, rng As Range Set dic = CreateObject("scripting.dictionary") For Each Sh In Worksheets lr = Sh.Range("C" & Rows.Count).End(xlUp).Row Set rng = Sh.Range("A1:G" & lr) Set Item = rng.Find("Tên SP") If Not Item Is Nothing Then D = Item.Row + 1 arr = Sh.Range("B" & D, "G" & lr).Value For i = 1 To UBound(arr) dk = arr(i, 1) If Not dic.exists(dk) Then a = a + 1 dic.Add dk, a For j = 1 To 6 kq(a, j) = arr(i, j) Next j Else b = dic.Item(dk) kq(b, 4) = kq(b, 4) + arr(i, 4) kq(b, 6) = kq(b, 6) + arr(i, 6) End If tong = tong + arr(i, 6) kq(a + 1, 1) = "TÔNG CÔNG" kq(a + 1, 6) = tong Next i End If Next Sh With Sheets("sheet2") .Range("J16").Resize(1000, 6).ClearContents If a Then .Range("J16").Resize(a + 1, 6).Value = kq .Range("J16").Resize(a + 1, 6).Borders.LineStyle = 1 End With Set dic = Nothing MsgBox "xong" End Sub
Vâng anh, chắc chắn là đượccái này hay đấy ... mà nó có tổng hợp được data ở file bất kỳ đang đóng mà ko biết tên Sheet ko bạn
có nghĩa lấy dữ liệu Files đang đóng mà ko biết trước tên Sheet mà có nhiêu lấy hết
VD vầy: D:\Data.xlsx ... ko biết trong đó có nhiêu Sheet ... xong tổng hợp nó lại
Sư phụ @ptm0412 có riêng một Topic về vấn đề này rồi anh ạ, quan trọng nhất là cấu trúc các sheet phải giống nhau. Hoặc giả sử dữ liệu là các Table nữa thì nối chúng lại với nhau trong PQ cũng sẽ dễ dàng hơn.Thử làm 1 VD cho xem đi
tổng hợp được data ở file bất kỳ đang đóng mà ko biết tên SheetSư phụ @ptm0412 có riêng một Topic về vấn đề này rồi anh ạ, quan trọng nhất là cấu trúc các sheet phải giống nhau. Hoặc giả sử dữ liệu là các Table nữa thì nối chúng lại với nhau trong PQ cũng sẽ dễ dàng hơn.
![]()
Tổng hợp (gộp) nhiều sheet của 1 file Excel, nhiều file trong folder bằng Power Query nâng cao
I. Tổng hợp (gộp) nhiều sheet trong 1 file Thông thường và với trình độ căn bản, khi muốn gộp (tổng hợp) nhiều sheet trên cùng 1 file Excel bằng Power query, các bạn tạo mỗi sheet 1 query con, sau đó Append chúng lại với nhau. Như vậy sẽ có nhiều query con mất công quản lý chúng. Các cách làm...www.giaiphapexcel.com
Anh tải mấy file demo đó về rồi đổi đường dẫn, đổi tên tùy thích là được a. Sau đó chọn Data-> Refresh all là được a.tổng hợp được data ở file bất kỳ đang đóng mà ko biết tên Sheet
dòng trên của Bài số 9
Vậy Trong D:\MyFolder \ ... có 10 file trong đó hãy làm cho Mạnh 1 Button để chọn lấy 1 File bất kỳ ... có cấu trúc dữ liệu như nhau chỉ khác tên Sheet và ko biết trước tên Sheet + số lượng Sheet có trong 1 File
khó sử dụng lắm + chạy chậmThằng này làm được nhiều thứ đó. Nhưng dữ liệu phải chuẩn chứ dữ liệu mà linh ta linh tinh thì vứt.
rảnh đang hỏi sơ bộ vài thứ xem nó siêu việt cỡ nào đó màĐâu phải công cụ mạnh là chạy nhanh đâu bạn nhỉ!
Ưu nhược điểm thì cũng phân tích nhiều rồi anh. Với dữ liệu lớn thì dùng ADO còn theo mệt, chưa kể còn tính toán, tổng hợp, sắp sếp, thiết lập mối quan hệ giữa các bảng
Có thể đặt name đường dẫn fileLàm sao để lấy được đường dẫn Full File Name của Workbook đang chạy code M vậy bạn? Tôi tìm hoài không thấy lệnh.
Mục đích: Gửi File này cho bất cứ ai cũng chạy được. Không phải thay lại Source (Source đang lấy là Full File Name của File excel đang chạy PQ)
Cảm ơn!
Không hiểu có phải bạn hỏi ý này.Cụ thể tôi cần thay cụm này:
Source = Excel.Workbook(File.Contents("D:\Excel\Query\File Test PowerQuery.xlsx"), null, true),
Cụm: "D:\Excel\Query\File Test PowerQuery.xlsx" này chính là Full Name của File Excel đang chạy PQ
Nếu đặt name trong File thì có thể xài công thức để lấy ra cụm trên: nhưng không biết kết hợp thay thế vào như nào
Name là: TenFile =SUBSTITUTE(LEFT(CELL("filename",$A$1),FIND("]",CELL("filename",$A$1),1)-1),"[","")
thêm trường đó để biết dữ liệu lấy từ File nào đó anh.Không hiểu lắm trong List có vài Files mà trên Sheet nó lặp lại nhiều thế
Mở lên thôi nó laod cũng chậm ... nó load cả .Net nữa hèn chi chậm
View attachment 265806
Trong hình của Kiều Mạnh có 6 files, trong đó 2 file gốc và 4 file copy.Không hiểu lắm trong List có vài Files mà trên Sheet nó lặp lại nhiều thế
Mở lên thôi nó laod cũng chậm ... nó load cả .Net nữa hèn chi chậm
có lẻ sức mạnh của nó là nạp dữ liệu vào Data model và khi cần thì phân tích nó thôi ... còn lấy dữ liệu thông thường VD như tổng hợp Sheet + Files mà ko biết tên Sheet thì ADOB làm ok hết + tốc độ sẻ nhanh hơn đấyNói thêm: Trong file ở chủ đề này: https://www.giaiphapexcel.com/diendan/threads/tổng-hợp-nhiều-file-thành-1-file-bằng-power-query.156768/post-1040037
Tên file là dữ liệu của tháng nào đó, và của cửa hàng/ chi nhánh nào đó. Tên sheet là dữ liệu của nhóm Sale nào đó, thì cần có 2 cột tên file và tên sheet để lập báo cáo phân tích các kiểu. Chứ dữ liệu tổng hợp lại để đó thì vô nghĩa.
View attachment 265827
Ngoài ra, sử dụng Power query còn có cái lợi là khi dữ liệu tổng hợp nhiều file nhiều sheet lại mà lớn hơn 1 triệu dòng (thậm chí vài triệu, vài chục triệu) thì có thể không gán xuống sheet mà gán vào data model. VBA, ADO các kiểu không làm được chuyện này.
Đồng ý về điểm tốc độ. Lần đầu tiên mở file sẽ phải load .Net, các lần sau refresh sẽ nhanh hơn 1 chút, nhưng có lẽ vẫn thua ADO.có lẻ sức mạnh của nó là nạp dữ liệu vào Data model và khi cần thì phân tích nó thôi ... còn lấy dữ liệu thông thường VD như tổng hợp Sheet + Files mà ko biết tên Sheet thì ADOB làm ok hết + tốc độ sẻ nhanh hơn đấy
đồng ý với anh cái khúc Em tô đậm thôiĐồng ý về điểm tốc độ. Lần đầu tiên mở file sẽ phải load .Net, các lần sau refresh sẽ nhanh hơn 1 chút, nhưng có lẽ vẫn thua ADO.
Power query còn thêm 1 đặc điểm nữa là sau khi load dữ liệu tương đương với ADO xong, các hàm M của PQ cũng còn có thể làm thêm 1 số việc nữa ví dụ như unpivot, thêm cột conditional column, cột luỹ kế, cột đếm có điều kiện, đếm luỹ kế riêng rẽ từng nhóm, ... Nếu ADO phải rất rành rẽ câu lệnh SQL mới làm được, hoặc không làm được luôn.
Em không rành về ADO, chỉ áp dụng mấy hàm mà các tiền bối đã xây dựng. Nên thấy cấu trúc của ADO hơi khó hiểu, làm trên Power Query thấy đơn giản hơn.đồng ý với anh cái khúc Em tô đậm thôi
còn chỉnh sửa các hàm M em thấy chưa phổ biến lắm ít nhất là thời điểm hiện tại trên GPE này
và người dùng phổ thông rất khó khi vận dụng nó
Còn ADODB câu SQL nó vô cùng lắm ... trên GPE này e rằng chưa có ai dám khẳng định là mình làm được tất cả thuần SQL cho ADODB
Nhiều người dùng phân tích trong đó có tôi thì cũng không thạo nhiều về M mà chỉ biết các tính năng cơ bản có trên các tab của Power Query. Chủ yếu dùng chập dữ liệu từ các file hoặc folder hoặc get data từ các nguồn khác, chứ việc phân tích thì phân tích trên Power Pivot hoặc Power Bi(+R+Python). Cho nên tính năng của Power Query phần lớn người sử dụng nó để chập dữ liệu, chuẩn hoá dữ liệu thôi. Diễn đàn chủ yếu toàn lên hỏi ăn xổi luôn thì toàn hỏi VBA hoặc công thức Excel chứ mấy người hỏi những thứ khác đâu. Cho nên mấy mục này bắt đầu ở diễn đàn thì mới là sơ khai giai đoạn đầu thôi.đồng ý với anh cái khúc Em tô đậm thôi
còn chỉnh sửa các hàm M em thấy chưa phổ biến lắm ít nhất là thời điểm hiện tại trên GPE này
và người dùng phổ thông rất khó khi vận dụng nó
Còn ADODB câu SQL nó vô cùng lắm ... trên GPE này e rằng chưa có ai dám khẳng định là mình làm được tất cả thuần SQL cho ADODB
ADODB chỉ khó nhất cái câu lệnh SQL thôi nó vô cùng lắmEm không rành về ADO, chỉ áp dụng mấy hàm mà các tiền bối đã xây dựng. Nên thấy cấu trúc của ADO hơi khó hiểu, làm trên Power Query thấy đơn giản hơn.
Câu SLQ khó mà cứ chịu khó mày mò tí rồi cũng viết được. Mà đã viết được 1 lần thì lần sau thấy dễ hơn. Cái khó và dễ sai nhất của nó là lồng biến vào câu lệnh phức tạp, thêm bớt các dấu nháy đơn, nháy kép muốn phát khùng mà vẫn bị báo lỗi.ADODB chỉ khó nhất cái câu lệnh SQL thôi nó vô cùng lắm
còn lại không khó lắm chỉ có cái Conn và Rs thôi ... cơ bản mọi cái trên GPE này có hết rồi
quan trọng là có biết vận dụng nó hay không thôi
2 môi trường khác nhau, nếu viết full câu lệnh SQL (giả sử request tới SQL server) thì nó xử lý ở trên SQL server, còn đẩy raw về rồi ETL ở power query thì nó là môi trường của power query kết quả trả về là kết quả cuối cùng mặc dù gọi nhiều bảng nhưng chỉ là query chứ không lưu, còn việc xử lý thì chắc chắn môi trường ở sql server sẽ nhanh hơn power query rồi, còn so với môi trường xử lý khác như Access, ODBC tới database của Foxpro thì không chắc Power query thua đâu khi cần clean data ở dạng nhiều,với SQL server thì connect Power query full SLQ sẽ ngon hơn mà thực tế là vậy người ta sẽ viết thẳng cái code rồi gửi request connect luôn, PQ cho phép điều gửi code lập trình SQL thẳng để request, không biết ADO có làm được điều này không tôi đã thử sử dụng tạo bảng tạm và tính toán trên bảng tạm đó để lấy dữ liệu mong muốn bằng ADO nhưng không connect được chưa kể đến loop, ví dụ với câu đơn giản như vầy ADO sẽ báo lỗi, nếu mà không request được dạng này mà chỉ là mấy câu select bình thường ADO thì không thể so ETL được với power queryHơi lạc ra khỏi chủ đề này (tổng hợp dữ liệu từ nhiều sheet) 1 chút:
- Power query nếu muốn tạo quan hệ 2 bảng thì phải query 2 bảng đơn trước, rồi mới dùng câu lệnh Merge. Nhiều bảng quan hệ với nhau cũng phải lấy hết xuống rồi merge từng cặp. Còn ADO dùng câu lệnh SQL với cú pháp join ... on (left, right hay join tuỳ hoàn cảnh). Một câu lệnh SQL có thể join hết từng ấy bảng, và kết quả chỉ là 1 bảng kết quả cuối cùng.
- Power query dùng Table.Combine đơn thuần cũng phải lấy hết các bảng xuống rồi mới combine, SQL chỉ cần lệnh Union và chỉ kết quả cuối mới đưa xuống. (Hàm tôi viết tổng quát ở những ảnh chụp và trích dẫn bên trên thì không dùng combine, lại phải ứng dụng hàm M theo cách khác.
- SQL nói thật là "vô cùng", thậm chí có thể tạo các bảng ảo và Select trên đó và nhiều thứ khác mà tôi không biết.
Nói chung là người dùng ở 1 trình độ nào đó sẽ thích cái này hơn cái kia, ở trình độ khác thì ngược lại. Thích cái gì cũng nên biết trước ưu nhược điểm của cái đó mà áp dụng cho phù hợp vấn đề đang làm.
Như trên em có nói là em không rành về ADO. Nên em hỏi anh chút. Giả sử dữ liệu 15 ngày đã > 1.2 tr record. Thì ADO có thể collect và group by lại theo các tiêu chí được không anh?Theo tôi thì không so sánh ADO và Power Query (PQ) được vì cách thức hoạt động, chức năng nó khác nhau mặc dù có công đoạn nào đó giống nhau như: kết nối CSDL.
- PQ thì lấy dữ liệu và tích hợp sẳn công cụ phân tích xử lý rất mạnh. Nói chung là làm trọn gói.
- Còn đối với ADO (như cách tôi thường làm) là một lớp trung gian để kết nối với các loại CSDL, thực thi các câu lệnh SQL. Vấn đề là ở việc xử lý các câu lệnh SQL: nếu thực thi hoàn toàn các câu lệnh SQL từ ADO thì tôi chắc chắn không đủ để tổng hợp, truy vấn, phân tích dữ liệu đáp ứng yêu cầu được. Đối với CSDL Access, tôi phải tận dụng sức mạnh Query của nó để tổng hợp ra dữ liệu mình cần, đối với CSDL SQL Server thì viết các store proc, hàm để chạy truy vấn trực tiếp trên Server và ADO chỉ làm cầu nối, gửi các tham số, yêu cầu SQL Server thực thi rồi lấy kết quả về thôi.
Nói tóm lại để kết nối dữ liệu, thực hiện các truy vấn cơ bản thì ADO làm được nhưng chuyên sâu xử lý thì không. Ngược lại thì PQ nó làm được điều này. Nói thực là tôi chỉ biết PQ ở mức cơ bản nhưng chỉ cần đọc tài liệu là có thể hiểu được khả năng của nó.
Name đặt ở đâu cũng được chứ anh. Bản chất như nhau. Kể cả name động đi chăng nữaRồi tôi hiểu tại Sao rồi. Name tôi đặt là trực tiếp trong Name Manager của Excel. Không phải Name đặt tại 1 ô trên Sheet.
Power Query nó không chịu lấy name đặt trực tiếp trong Name Manager mà không thông qua trên Range
2 môi trường khác nhau, nếu viết full câu lệnh SQL (giả sử request tới SQL server) thì nó xử lý ở trên SQL server, còn đẩy raw về rồi ETL ở power query thì nó là môi trường của power query kết quả trả về là kết quả cuối cùng mặc dù gọi nhiều bảng nhưng chỉ là query chứ không lưu, còn việc xử lý thì chắc chắn môi trường ở sql server sẽ nhanh hơn power query rồi, còn so với môi trường xử lý khác như Access, ODBC tới database của Foxpro thì không chắc Power query thua đâu khi cần clean data ở dạng nhiều,với SQL server thì connect Power query full SLQ sẽ ngon hơn mà thực tế là vậy người ta sẽ viết thẳng cái code rồi gửi request connect luôn, PQ cho phép điều gửi code lập trình SQL thẳng để request, không biết ADO có làm được điều này không tôi đã thử sử dụng tạo bảng tạm và tính toán trên bảng tạm đó để lấy dữ liệu mong muốn bằng ADO nhưng không connect được chưa kể đến loop, ví dụ với câu đơn giản như vầy ADO sẽ báo lỗi, nếu mà không request được dạng này mà chỉ là mấy câu select bình thường ADO thì không thể so ETL được với power queryView attachment 265871
Ah, ý tôi hỏi là câu lệnh trên nó có lưu vào bảng tạm #a1 sau đó dùng một câu select khác để gọi cái bảng tạm đó không tôi thử với ADO thì nó lỗi, ADO có thể tạo bảng tạm và gọi lại bảng tạm trong 1 lần connect không, lý do tạo bảng tạm là để tránh việc một câu select có subquery được gọi quá nhiều lần , rồi có thể gửi đoạn loop được không như while begin...end chẳng hạn?Theo như hình của bạn thì thấy PQ nó dùng luôn cú pháp của SQL Server để viết và gửi lệnh luôn, vậy thì tiện nhỉ.
Đối với ADO, muốn thực hiện câu lệnh trên (câu lệnh SQL cơ bản) thì dùng ADO Command và cung cấp parameter @date, @Year thì cũng lấy dữ liệu về được nhé.
Công nhận lỗi, em cũng không hiểu? phải nhờ các tiền bối @excel_lv1.5, @ptm0412 giải thích thêm.Bạn thử lại đi. Theo câu M của bạn thì chỉ áp dụng được Name từ Range, hay tôi không biết cách nhỉ?
fname= Excel.CurrentWorkbook(){[Name="TenFile"]}[Content]{0}[Column1] ,
Trong File có 1 Name là Source đặt trực tiếp trong Name Manager, bạn thử được không nhé
Tôi hiểu điều này. PQ (Power query) làm đơn thuần bằng các step lệnh trên giao diện thì phải lấy về đủ các bảng sau đó thiết lập quan hệ và merge, hoặc combine. Và tôi cũng nói thêm rằng nếu không dùng combine thì dùng hàm M khác để thực hiện. Lúc này phải tự viết trong query advanced editor.2 môi trường khác nhau, nếu viết full câu lệnh SQL (giả sử request tới SQL server) thì nó xử lý ở trên SQL server, còn đẩy raw về rồi ETL ở power query thì nó là môi trường của power query kết quả trả về là kết quả cuối cùng mặc dù gọi nhiều bảng nhưng chỉ là query chứ không lưu,
Tôi ít sài Name để gọi giá trị ngoài worksheet, thông thường tôi sẽ convert nó thành table rồi đẩy thẳng vào power query, đỡ bước tạo Name. Còn lỗi theo tôi nghĩ là do nó không nhận là value như string hay number mà bắt buộc phải là dạng table, record (range, cell)Công nhận lỗi, em cũng không hiểu? phải nhờ các tiền bối @excel_lv1.5, @ptm0412 giải thích thêm.
Như nhìn bảng NameManager thì nó đang chưa hiểu Value của cái hàm này trả về kết quả gì.
View attachment 265877
Anh convert thành table thì bản chất nó sinh ra 1 name "Table1", có tiêu đề. Còn đặt name như @Cá ngừ F1 (là làm theo tôi), không có tiêu đề. Chính vì vậy truy xuất sẽ khác nhau: Name không tiêu đề phải truy xuất "Column1" thay vì tiêu đề.Tôi ít sài Name để gọi giá trị ngoài worksheet, thông thường tôi sẽ convert nó thành table rồi đẩy thẳng vào power query, đỡ bước tạo Name. Còn lỗi theo tôi nghĩ là do nó không nhận là value như string hay number mà bắt buộc phải là dạng table, record (range, cell)
Có thể xem power query (PQ) như cái trình biên dịch, SQL server có thể code thẳng trên giao diện của power query, tôi nghĩ PostGreSQL chắc cũng vậy, việc sử dụng join cũng như merge trong PQ, thì cái này mình phải lựa chọn thôi, tôi ví dụ tôi thường làm SQL server và tôi chắc rằng là SQLserver nó sẽ xử lý nhanh hơn, nên tôi sẽ code full SQL rồi code đưa vào PQ để lấy kết quả cuối luôn, tôi cũng thường connect vào database của foxpro thông qua ODBC để lấy dữ liệu cũ và tôi cũng biết rằng nếu viết full code fox thì sẽ chậm hơn khi load data raw về PQ để transform nên tôi sẽ chọn load về rồi xử lý bằng PQ, vì vậy tôi nghĩ tốc độ xử lý của cái nào ngon hơn thì chọn cái đó thôi, cả 2 đề thực hiện được trên cả PQ, nếu không tính M code thì việc transform bằng những thứ có sẵn trên thanh công cụ PQ thực tế là đơn giản hơn việc ngồi viết full code connectTôi hiểu điều này. PQ (Power query) làm đơn thuần bằng các step lệnh trên giao diện thì phải lấy về đủ các bảng sau đó thiết lập quan hệ và merge, hoặc combine. Và tôi cũng nói thêm rằng nếu không dùng combine thì dùng hàm M khác để thực hiện. Lúc này phải tự viết trong query advanced editor.
Về câu lệnh SQL lấy trực tiếp trên server, thì do tôi không có môi trường SQL server, mà chỉ có môi trường PostGreSQL nên thực hành trên đó để viết tài liệu căn bản. Trong đó tôi chỉ gõ câu lệnh SQL chuẩn bao gồm select lồng, join, groupby, thêm cột đơn giản. Thế là lấy được dữ liệu. Câu SQL đó là câu mà tôi thực hiện trên cửa sổ PostGreSQL thành công, chỉ là cần lấy về Excel để phân tích.
Ảnh sau là trang 132 của tài liệu, câu SQL không phức tạp và không nhiều bảng.
View attachment 265879
Không phải bạn, nó là table đó bạn tại vì cái bước đó nó bỏ qua bước trả về table mà nó trả về giá trị cuối của table thôi, offset trả về range vẫn nhận, chỉ có dạng value là khôngAnh convert thành table thì bản chất nó sinh ra 1 name "Table1", có tiêu đề. Còn đặt name như @Cá ngừ F1 (là làm theo tôi), không có tiêu đề. Chính vì vậy truy xuất sẽ khác nhau: Name không tiêu đề phải truy xuất "Column1" thay vì tiêu đề.
Name định nghĩa cứng trong Name manager, name động bằng hàm offset (hoặc hàm khác) sẽ không được PQ nhận dạng.
- Group by là do cách viết câu lệnh SQL thôi bạn. Tính toán Sum, Count, Average, Min, Max là nhưng cái mặc định trong Group by (Total Query).Như trên em có nói là em không rành về ADO. Nên em hỏi anh chút. Giả sử dữ liệu 15 ngày đã > 1.2 tr record. Thì ADO có thể collect và group by lại theo các tiêu chí được không anh?
Ah, ý tôi hỏi là câu lệnh trên nó có lưu vào bảng tạm #a1 sau đó dùng một câu select khác để gọi cái bảng tạm đó không tôi thử với ADO thì nó lỗi, ADO có thể tạo bảng tạm và gọi lại bảng tạm trong 1 lần connect không, lý do tạo bảng tạm là để tránh việc một câu select có subquery được gọi quá nhiều lần , rồi có thể gửi đoạn loop được không như while begin...end chẳng hạn?
Khi Name là 1 giá trị đơn ở 1 ô trên sheet, tôi biết rằng đó là table, tôi chỉ nói rằng nó là table không tiêu đề, và bị gán tiêu đề là Column1. Khi truy xuất nó là cú pháp truy xuất table, tên field là Column1, record 0Không phải bạn, nó là table đó bạn tại vì cái bước đó nó bỏ qua bước trả về table mà nó trả về giá trị cuối của table thôi, offset trả về range vẫn nhận, chỉ có dạng value là không
Hi anh,Tôi ít sài Name để gọi giá trị ngoài worksheet, thông thường tôi sẽ convert nó thành table rồi đẩy thẳng vào power query, đỡ bước tạo Name. Còn lỗi theo tôi nghĩ là do nó không nhận là value như string hay number mà bắt buộc phải là dạng table, record (range, cell)
Giả sử tên file tạo thành 1 table 1 dòng 1 cột ở I1:I2, tiêu đề là "tên file", thì cũng truy xuất record 0, field là [Tên file]Hi anh,
Nếu anh convert nguồn thành table và đẩy vào query, cụ thể như file ở bài #46 của @hpkhuong, thì để lấy dữ liệu thì phải tạo parameter và invoke function hả anh?
Ổn rồi ạ.Giả sử tên file tạo thành 1 table 1 dòng 1 cột ở I1:I2, tiêu đề là "tên file", thì cũng truy xuất record 0, field là [Tên file]
View attachment 265911
Nếu bảng 2 cột, 3 cột thì truy xuất theo tên field
Nếu bảng 2 dòng, 3 dòng, thì truy xuất theo record 1, record 2 (do bắt đầu từ 0)
Ý tôi là vầy, chắc cũng giống bạn @ptm0412 , ví dụ có dữ liệu from date, to date, tôi sẽ convert nó thành table bấm Ctrl+T , rồi trong M tôi gọi nó ra thôiỔn rồi ạ.
Mà có thể anh @excel_lv1.5 có thêm cách khác. Vì anh có đẩy cái table vào query để làm tham chiếu.
tks bạn rất nhiều!Rất xin lỗi thành viên @maixuanvuong276 vì có những trao đổi hơi nhiều về Topic này, thực tế cũng muốn có một giải pháp tốt hơn về việc tổng hợp này của bạn.
Tôi thử làm lại bằng Power Query.
Bản giải nén File đính kèm về máy (để File TongHop và folder Source tại cùng 1 thư mục).
Giả sử các dữ liệu bạn cần phải tổng hợp ở trong Source (tôi có tạo 4 file Data như cấu trúc bạn gửi ở bài #1), tôi nghĩ rằng các file dữ liệu này cần tách hẳn ra thành File riêng, còn lúc tổng hợp sẽ làm ở 1 File khác.
1. Bạn mở File TongHop
2. Ở sheet Setting, ô bôi đỏ là để chọn tương ứng các File bạn cần tổng hợp.
3. Sau khi chọn File nguồn, sang sheet TongHop, click phải chuột chọn Refresh.