Đố vui về ADO, DAO. (1 người xem)

Liên hệ QC

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

Cái này cho vào hàm iif, kết hợp phép toán +,-,* là ra.
Đại loại ví dụ như sau:


BẠn test thử nhé, xin lỗi vì chưa kiểm tra.
Em thì em có cách giải quyết khác(nó đơn giản hơn nhiều), nhưng chờ mng giả xem thế nào. Cái của bác em cũng không giám chắc đúng hay ko, nhưng nếu như có thêm chục điều kiện nữa thì iif nó cứ dài loằng ngoằng và khó control lắm ạ.
 
Vấn đề này sử dụng cú pháp Range trong SQL có lẽ hợp lý hơn
 
Tiện đây em cũng xin góp vui 1 bài toán về Tính tiền điện.
Các bạn coi file để rõ bài toán.

Xin thử code này.

Mã:
Sub GPE()    Dim Query As String
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
     With cn
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
        ThisWorkbook.FullName _
        & ";Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";"
        .Open
    End With
    
    Query = "SELECT A.f1, Sum(f6 * B.f3) "
    Query = Query & "From (Select *, iif(B.f2 >= A.f2,A.f2 - B.f1,B.f2 - B.f1) as f6 From [A2:B6] as A "
    Query = Query & "Left Join [D2:F6] as B on A.f2 > B.f1 ) as C Group by A.f1"
    rs.Open Query, cn
    Range("K2").CopyFromRecordset rs
    rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing
End Sub
 
Xin thử code này.

Mã:
Sub GPE()    Dim Query As String
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
     With cn
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
        ThisWorkbook.FullName _
        & ";Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";"
        .Open
    End With
    
    Query = "SELECT A.f1, Sum(f6 * B.f3) "
    Query = Query & "From (Select *, iif(B.f2 >= A.f2,A.f2 - B.f1,B.f2 - B.f1) as f6 From [A2:B6] as A "
    Query = Query & "Left Join [D2:F6] as B on A.f2 > B.f1 ) as C Group by A.f1"
    rs.Open Query, cn
    Range("K2").CopyFromRecordset rs
    rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing
End Sub
Đúng rùi bạn, bạn có bài nào hay đưa lên để mng cùng thử sức.
 
Xin thử code này.

Mã:
Sub GPE()    Dim Query As String
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
     With cn
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
        ThisWorkbook.FullName _
        & ";Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";"
        .Open
    End With
    
    Query = "SELECT A.f1, Sum(f6 * B.f3) "
    Query = Query & "From (Select *, iif(B.f2 >= A.f2,A.f2 - B.f1,B.f2 - B.f1) as f6 From [A2:B6] as A "
    Query = Query & "Left Join [D2:F6] as B on A.f2 > B.f1 ) as C Group by A.f1"
    rs.Open Query, cn
    Range("K2").CopyFromRecordset rs
    rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing
End Sub

Bạn có thể giải thích sơ qua cái Query trong code trên không vậy. Cảm ơn bạn
 
Em xin góp vui 1 bài toán nữa: Thông báo khi nhập dữ liệu trùng
Bài này đã có trên GPE và em thấy bài toán này dùng ADO hay nhất nên đưa vào topic này để mng cùng thư giãn ạ. Yêu cầu chi tiết nằm trong file.
 

File đính kèm

Bạn có thể giải thích sơ qua cái Query trong code trên không vậy. Cảm ơn bạn
Giải thích như thế này:

Mình join 2 bản lại với nhau với điều kiện A.f2 > B.f1 để tạo ra 1 bảng ví dụ:
với MR là B và Value là 126 thì bảng mới sẽ có 2 giá trị:
[TABLE="class: grid, width: 500"]
[TR]
[TD]MR[/TD]
[TD]Value[/TD]
[TD]From[/TD]
[TD]To[/TD]
[TD]Cost[/TD]
[/TR]
[TR]
[TD]B[/TD]
[TD]126[/TD]
[TD]0[/TD]
[TD]100[/TD]
[TD]2000[/TD]
[/TR]
[TR]
[TD]B[/TD]
[TD]126[/TD]
[TD]100[/TD]
[TD]200[/TD]
[TD]1600[/TD]
[/TR]
[/TABLE]

Tiếp theo đó dùng công thức iif(B.f2 >= A.f2,A.f2 - B.f1,B.f2 - B.f1) để ra 1 cột phụ:

[TABLE="class: grid, width: 500"]
[TR]
[TD]MR[/TD]
[TD]Value[/TD]
[TD]From[/TD]
[TD]To[/TD]
[TD]Cost[/TD]
[TD]f6[/TD]
[/TR]
[TR]
[TD]B[/TD]
[TD]126[/TD]
[TD]0[/TD]
[TD]100[/TD]
[TD]2000[/TD]
[TD]100[/TD]
[/TR]
[TR]
[TD]B[/TD]
[TD]126[/TD]
[TD]100[/TD]
[TD]200[/TD]
[TD]1600[/TD]
[TD]26[/TD]
[/TR]
[/TABLE]


Rùi cuối cùng tính toán lại Cost * f6 và dùng GROUP để trả về tổng của B.
 
Bài này có đuợc sử dụng thêm bảng phụ k bạn? Nếu k sử dụng bảng phụ thì truy vấn hơi dài mà yêu cầu report nhiều tháng hơn thì khó mà làm được. Ý bạn là chỉ cần ra như kết ủa mẫu hay muốn tổng quát?

ủa bạn hiểu được đề bài rồi à ? mình nhìn vào chả hiểu gì . hic . Phần Capacity của từng thành viên tính bằng công thức gì vậy ? Ô F3 = 31/12/2030 là ý nghĩa gì ? +-+-+-++-+-+-+
 
ủa bạn hiểu được đề bài rồi à ? mình nhìn vào chả hiểu gì . hic . Phần Capacity của từng thành viên tính bằng công thức gì vậy ? Ô F3 = 31/12/2030 là ý nghĩa gì ? +-+-+-++-+-+-+

Em nghĩ chú trọng tới yêu cầu chưsố liệu giả định k quan trọng lắm. Hj.
Hình như có vấn đề về bảng kết quả. Nhưng em vẫn quan tâm tới phuơng pháp giải bài này
 
Em nghĩ chú trọng tới yêu cầu chưsố liệu giả định k quan trọng lắm. Hj.
Hình như có vấn đề về bảng kết quả. Nhưng em vẫn quan tâm tới phuơng pháp giải bài này

đừng xưng em với tôi , tôi còn trẻ lắm . Bạn có thể cho tôi biết ô K2 tính bằng công thức gì để ra 42 vậy ?
 
Em xin góp vui 1 bài toán nữa: Thông báo khi nhập dữ liệu trùng
Bài này đã có trên GPE và em thấy bài toán này dùng ADO hay nhất nên đưa vào topic này để mng cùng thư giãn ạ. Yêu cầu chi tiết nằm trong file.

Bình thường thì tôi dị ứng với cách nói chuyện bở rồ, đia... lắm. Nhưng phải nhìn nhận là cái này rất là thú vị. Bạn cho biết tại sao bài toán này dùng ADO hay nhất rồi chúng ta sẽ cố giải.
 
đừng xưng em với tôi , tôi còn trẻ lắm . Bạn có thể cho tôi biết ô K2 tính bằng công thức gì để ra 42 vậy ?

Công thức tính như thế này:

Depat_1 bao gồm 2 members: Nguyen Van A và Nguyen Van D
Nguyen Van A làm full trong tháng 4 (Month - Apr-2016) - Bạn có thể nhìn vào period 1-Jan-2016 >> 1-May-2016
>>> Capacity của ông Nguyen Van A tháng 4 là 21 (21 ngày làm việc không tính t7 + cn)
Nguyen Van D làm full tháng 4 (Period 1-Jan-2016 -> 30-Apr-2016)
>>> Capacity của ông Nguyen Van D tháng 4 là 21

Capacity Dept_1 tháng 4 = (Nguyen Van A + Nguyen Van D) = 21 + 21 = 42

Đây là bài toán cụ thể mình đang làm (Resource Management Tool) của công ty mình.
Resource forecast cho 6 tháng tiếp theo.
 
Bình thường thì tôi dị ứng với cách nói chuyện bở rồ, đia... lắm. Nhưng phải nhìn nhận là cái này rất là thú vị. Bạn cho biết tại sao bài toán này dùng ADO hay nhất rồi chúng ta sẽ cố giải.
Em chưa hiểu điều gì khiến a dị ứng. Còn về vd "bài toán này dùng ADO là hay nhất" thì nó chỉ là ý kiến chủ quan của em. Mục đích em đưa bài này lên chỉ để mng giải trí, thư giãn thui ạ.
 
Mình sử dung code sau đề lấy dữ liệu từ Excel lên Form VB6 .TextBox mà nó sai khúc nào báo lỗi Read-only

Bạn nào biết khắc phục lỗi chỉ dùm
xin cảm ơn
Mã:
Sub GetData()
    Dim cn As Object, rs As Object
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    cn.Provider = "Microsoft.ACE.OLEDB.12.0"
    cn.ConnectionString = "Data Source= " & App.path & "D:\XX.xlsm; Extended Properties=""Excel 12.0;HDR=Yes;"";"
    cn.CursorLocation = 3
    cn.Open
    rs.Open "SELECT * FROM [Sheet1$U23:U23]", cn, 3, 1
    Set Text1.DataSource = rs ''Gan len TextBox
    cn.Close
End Sub
 

File đính kèm

  • Capture.PNG
    Capture.PNG
    5.8 KB · Đọc: 48
Mình sử dung code sau đề lấy dữ liệu từ Excel lên Form VB6 .TextBox mà nó sai khúc nào báo lỗi Read-only

Bạn nào biết khắc phục lỗi chỉ dùm
xin cảm ơn
Mã:
Sub GetData()
    Dim cn As Object, rs As Object
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    cn.Provider = "Microsoft.ACE.OLEDB.12.0"
    cn.ConnectionString = "Data Source= " & App.path & "D:\XX.xlsm; Extended Properties=""Excel 12.0;HDR=Yes;"";"
    cn.CursorLocation = 3
    cn.Open
    rs.Open "SELECT * FROM [Sheet1$U23:U23]", cn, 3, 1
    Set Text1.DataSource = rs ''Gan len TextBox
    cn.Close
End Sub
Em k dám chắc nhưng em thấy k hợp lý ở chỗ table của a có mỗi cell U23 mà anh lại để HDR là yes, cái thứ 2 nữa là data source ấy, sao lại phải có app.path nhỉ. Đó là ý kiến của em thui nhé
 
Em chưa hiểu điều gì khiến a dị ứng. Còn về vd "bài toán này dùng ADO là hay nhất" thì nó chỉ là ý kiến chủ quan của em. Mục đích em đưa bài này lên chỉ để mng giải trí, thư giãn thui ạ.

[chưa hiểu điều gì khiến a dị ứng]
Tôi không thích nói chuyện với những người dùng từ giao thiệp bằng tiếng Anh. VD chào thì nói là Hi, cám ơn thì nói là thanks, bạn thì nói là bro... Có 2 lý do: 1 là tôi thích nói tiếng Việt, 2 là có những lúc người ta dùng sai ngữ cảnh tôi chả hiểu là người ta khen hay chửi tôi (điểm này tôi đã từng chứng minh rồi)

[bài toán này dùng ADO là hay nhất]
ADO có cái bất lợi của nó. Chỉ khi nào lượng lợi áp đảo lượng bất lợi thì giải pháp mới được gọi là "hay". Muốn hay nhất thì tỉ số lợi/bất lợi phải là cao nhất.
Tôi hỏi bạn thấy nó hay chỗ nào là vì tôi không muốn chủ quan. Có thể bạn nhìn thấy một số lợi mà tôi không thấy.
 
[chưa hiểu điều gì khiến a dị ứng]
Tôi không thích nói chuyện với những người dùng từ giao thiệp bằng tiếng Anh. VD chào thì nói là Hi, cám ơn thì nói là thanks, bạn thì nói là bro... Có 2 lý do: 1 là tôi thích nói tiếng Việt, 2 là có những lúc người ta dùng sai ngữ cảnh tôi chả hiểu là người ta khen hay chửi tôi (điểm này tôi đã từng chứng minh rồi)

[bài toán này dùng ADO là hay nhất]
ADO có cái bất lợi của nó. Chỉ khi nào lượng lợi áp đảo lượng bất lợi thì giải pháp mới được gọi là "hay". Muốn hay nhất thì tỉ số lợi/bất lợi phải là cao nhất.
Tôi hỏi bạn thấy nó hay chỗ nào là vì tôi không muốn chủ quan. Có thể bạn nhìn thấy một số lợi mà tôi không thấy.
Em thấy dùng ADO thì code nó dễ viết và đơn giản hơn ạ.
 
ADO là con dao 2 lưỡi, tuỳ theo từng CSDL để làm, nếu xài không khéo thì toi luôn, xài trên excel nên cẩn thận nhiều nhiều
Vâng, em cúng không biết nhiều về ADO, em chỉ thấy bài toán nào áp dụng đc ADO thì em dùng thui ạ.
 

File đính kèm

Em thấy dùng ADO thì code nó dễ viết và đơn giản hơn ạ.

Chuyện dễ viết vfa đơn giản nó cũng chủ quan. Vì ở đây mọi người cho là dùng cái này trông nó "chiến" và "chuyên nghiệp" cho nên họ chịu khó viết rõ ràng. Nếu ta chịu khó nhìn các giải pháp khác dưới định kiến đó thì cũng sẽ thấy nó đơn giản và dễ viết.

Ở diễn đàn này, hầu hết các người viết code chỉ chú trọng tốc độ. Việc viết cho dễ hiểu dễ chỉnh sửa hầu như bị xem là thứ yếu. Việc viết theo từng khối độc lập (task/layer isolation) hầu như không xảy ra.

Nếu thích ADO thì nên viết hẳn một (hoặc một nhóm) hàm chuyên nhận tham số, trả về recordset. Sau đó chỉ việc gọi hàm, nạp tham số đại khái gồm workbook và câu sql string. Kết quả trả về ghi thẳng vào range. Như vậy, vấn đề chỉ còn là quan sát đầu vào, phân tích đầu ra, viết câu sql. Khoẻ ru.

Thời buổi bây giờ MS Office đã qua đến phiên bản 2016. Thay vì lẩn quẩn ở mấy cái trò này, đi nghiên cứu các loại kết nối dữ liệu mới có phải sướng hơn không? Chẳng hạn như một trường hợp mà bạn HLMT đã từng nói qua, 2016 dùng PowerQuery lấy dữ liệu khoẻ ru.

ADO là con dao 2 lưỡi, tuỳ theo từng CSDL để làm, nếu xài không khéo thì toi luôn, xài trên excel nên cẩn thận nhiều nhiều

Thường thường dùng Active Object là chuyện bất đắc dĩ. Làm việc thường xuyên thì cần phải biết những bất lợi của nó để đề phòng.
 
Để lấy tất cả dữ liệu từ 1 sheet khác có tên là Sheet1 trong workbook với phiên bản 2003 hoặc 2007.
Xin hỏi: Tôi viết code như thế nào cho nó ngắn gọn nhất mà ở Sheet2 khi chạy code vẫn lấy được dữ liệu cho dù dùng phiên bản nào?
 
Lần chỉnh sửa cuối:
Để lấy tất cả dữ liệu từ 1 sheet khác có tên là Sheet1 trong workbook với phiên bản 2003 hoặc 2007.
Xin hỏi: Tôi viết code như thế nào cho nó ngắn gọn nhất mà ở Sheet2 khi chạy code vẫn lấy được dữ liệu cho dù dùng phiên bản nào?
Tôi có thể viết trong vòng 4 dòng code (190 kí tự, không kể cách trắng) để ra được kết quả
 
Lần chỉnh sửa cuối:
Gia đình GPE giúp em bài tập này ạ: em có file tính giá thành cà phê như đính kèm. Từ sheet Nguon em vẫn dùng VBA lấy dữ liệu qua sheet Dich, em đang học ADO nên muốn dùng ADO để làm mà loay hoay mãi chưa xong.
 

File đính kèm

Gia đình GPE giúp em bài tập này ạ: em có file tính giá thành cà phê như đính kèm. Từ sheet Nguon em vẫn dùng VBA lấy dữ liệu qua sheet Dich, em đang học ADO nên muốn dùng ADO để làm mà loay hoay mãi chưa xong.
Bạn thử code này
Mã:
Sub ADOTest()
Dim i As Integer, query As String
Application.ScreenUpdating = False
For i = 4 To 16
    query = query + "select f1,f2,'" & Sheets("Nguon").Cells(2, i) & "',f" & i & " from [Nguon$A4:P273]" & Chr(10) & "union all " & Chr(10)
Next
    query = Left(query, Len(query) - 11)
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
     With cn
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";"
        .Open
    End With
    rs.Open query, cn
    Range("F4").CopyFromRecordset rs
    rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing
Application.ScreenUpdating = True
End Sub
 
Cám ơn bạn quanluu1989, thuật toán đơn giản nhưng ý tưởng mới quan trọng. Bạn trả lời nhanh và ý tưởng cũng nhanh, bạn quả là cao thủ
 
Bạn thử code này
Mã:
 Sub ADOTest()
 Dim i As Integer, query As String
 Application.ScreenUpdating = False
 For i = 4 To 16
     query = query + "select f1,f2,'" & Sheets("Nguon").Cells(2, i) & "',f" & i & " from [Nguon$A4:P273]" & Chr(10) & "union all " & Chr(10)
 Next
     query = Left(query, Len(query) - 11)
     Set cn = CreateObject("ADODB.Connection")
     Set rs = CreateObject("ADODB.Recordset")
      With cn
         .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";"
         .Open
     End With
     rs.Open query, cn
     Range("F4").CopyFromRecordset rs
     rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing
 Application.ScreenUpdating = True
 End Sub
Có thể rút gọn lại code trên thành 8 dòng code. Nhưng vẫn ra kết quả giong nhau.
 
Chào gia đình GPE, Em có file data khách hàng gửi là file .DBF nhưng trước giờ em chỉ quen làm với excel, anh chị giúp em tạo code để kết nối tới dữ liệu dạng foxpro này ạ . Cám ơn gia đình
 
Chào gia đình GPE, Em có file data khách hàng gửi là file .DBF nhưng trước giờ em chỉ quen làm với excel, anh chị giúp em tạo code ADO để kết nối tới dữ liệu dạng foxpro để trích xuất dữ liệu ra excel được không ạ . Cám ơn gia đình
 
Các bạn nên vào mục hỏi đáp về ADO căn bản để thảo luận nhé. Ở đây sẽ chuyên về câu đố nhé.
 
Cám ơn anh, nảy giờ em hỏi lung tung ở mấy topic khác, hix
 
Để lấy tất cả dữ liệu từ 1 sheet khác có tên là Sheet1 trong workbook với phiên bản 2003 hoặc 2007.
Xin hỏi: Tôi viết code như thế nào cho nó ngắn gọn nhất mà ở Sheet2 khi chạy code vẫn lấy được dữ liệu cho dù dùng phiên bản nào?
Có thể ít có người quan tâm về câu đố này quá nhỉ
 
Mạnh cũng thử Góp vui một tí coi

I/ Có 50 File ở 50 Folder khác nhau ..và Ổ dĩa khác nhau VD: 25 Folder ở ổ E:\ và 25 Folder ở ổ D:\

1/ VD: E:\mm\1.xls
2/ VD: E:\mm\kk\2.xlsx
3/ VD: E:\hh\mm\kk\3.xls
.......................................
1/ VD: D:\mm\4.xls
2/ VD: D:\mm\kk\5.xlsb
3/ VD: D:\hh\mm\kk\6.xlsm
.......................................

II/ Có chung cấu trúc cần tổng Hợp như sau

1/ Tên Sheet cần tổng hợp là GPE

2/ Vùng dữ liệu cần tổng hợp là [A2:J100]

3/ Sử dụng ADO tổng hợp tất cả các file trên gán nối tiếp kết quả xuống 1 Sheet

4/ Không Sử dụng Array(file1,file2,file3 ......... To 50...........) để duyệt Files

5/ Không sử dụng cột phụ trên Sheet lấy đường dẫn của File xong chạy For Next ....

Rất mong các Bạn tham gia code chơi

xin cảm ơn
 
Lần chỉnh sửa cuối:
em nghe nói có khai báo
Mã:
"Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}"
xài được trên 2 phiên bản nhưng mà nó bị hạn chế quá , chắc không phải đáp án của anh nên không trả lời sớm . --=0--=0
Cái khai báo này có sài được trong office 2016 hay win10 không anh, em sài foxpro kết nối với excel, nhưng bị vướng chỗ này không kết nối được!!!
 
Cái khai báo này có sài được trong office 2016 hay win10 không anh, em sài foxpro kết nối với excel, nhưng bị vướng chỗ này không kết nối được!!!
mình chỉ biết xài excel thôi nhé bạn , những thứ cao cấp như foxpro (nghe tên là thấy bờ-rồ) mình không biết bạn ơi . -+*/-+*/
 
Mạnh cũng thử Góp vui một tí coi

I/ Có 50 File ở 50 Folder khác nhau ..và Ổ dĩa khác nhau VD: 25 Folder ở ổ E:\ và 25 Folder ở ổ D:\

1/ VD: E:\mm\1.xls
2/ VD: E:\mm\kk\2.xlsx
3/ VD: E:\hh\mm\kk\3.xls
.......................................
1/ VD: D:\mm\4.xls
2/ VD: D:\mm\kk\5.xlsb
3/ VD: D:\hh\mm\kk\6.xlsm
.......................................

II/ Có chung cấu trúc cần tổng Hợp như sau

1/ Tên Sheet cần tổng hợp là GPE

2/ Vùng dữ liệu cần tổng hợp là [A2:J100]

3/ Sử dụng ADO tổng hợp tất cả các file trên gán nối tiếp kết quả xuống 1 Sheet

4/ Không Sử dụng Array(file1,file2,file3 ......... To 50...........) để duyệt Files

5/ Không sử dụng cột phụ trên Sheet lấy đường dẫn của File xong chạy For Next ....

Rất mong các Bạn tham gia code chơi

xin cảm ơn

Không biết code này có đảm bảo yêu cầu của anh kieu manh ko?

Mã:
Dim FSO As Object, FileItem As Object, cn As Object, rs As Object, SubFolder As Object


Sub kieumanh(SourceFolderName As String, IncludeSubfolders As Boolean)
Dim query As String
Const ExcelExtension As String = "|xls|xlsb|xlsm|xlsx|"
Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")


For Each FileItem In .GetFolder(SourceFolderName).Files
    If InStr(ExcelExtension, "|" & .GetExtensionName(FileItem.Path) & "|") Then
        If Left(FileItem.Name, 1) <> "~" And FileItem.Path <> ThisWorkbook.FullName Then
            With cn
                .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileItem.Path & ";Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";"
                .Open
            End With
            query = " SELECT  * FROM [GPE$A2:J200]"
            rs.Open query, cn
            Range("A" & Range("A65000").End(3).Row + 1).CopyFromRecordset rs
            rs.Close: cn.Close
        End If
    End If
Next FileItem
    If IncludeSubfolders Then
        For Each SubFolder In .GetFolder(SourceFolderName).SubFolders
        kieumanh SubFolder.Path, True
        Next SubFolder
    End If
End With
    Set rs = Nothing: Set cn = Nothing
    Set FileItem = Nothing
    Set FSO = Nothing
End Sub


Sub run()
    Range("A2:J" & Range("A65000").End(3).Row).Clear
    Call kieumanh("E:\", True)
    Call kieumanh("D:\", True)
End Sub
 
Lần chỉnh sửa cuối:
mình chỉ biết xài excel thôi nhé bạn , những thứ cao cấp như foxpro (nghe tên là thấy bờ-rồ) mình không biết bạn ơi . -+*/-+*/
Hic, fox nó đã bị bỏ rơi lâu rồi, các diễn đàn về fox từ từ cũng mất dần, em lạc hậu nên vẫn còn sài nó, nó vẫn còn hỗ trợ tốt trong một số trường hợp excel không làm được, nên em mới tạo liên kết giữa fox và excel, chắc có lẽ phải hài lòng với win 7 và excel 2013, thanks anh !!!
 
em nghe nói có khai báo
Mã:
"Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}"
xài được trên 2 phiên bản nhưng mà nó bị hạn chế quá , chắc không phải đáp án của anh nên không trả lời sớm . --=0--=0
BẠn cứ mạnh dạn gửi câu trả lời, chủ yếu là học hỏi kinh nghiệm lẫn nhau thôi mà bạn.
 
BẠn cứ mạnh dạn gửi câu trả lời, chủ yếu là học hỏi kinh nghiệm lẫn nhau thôi mà bạn.
ủa thì chuỗi đặt là
Mã:
cn.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & ThisWorkbook.FullName
có phải ý anh hỏi là : dùng chuỗi kết nối nào cho cả 2 phiên bản 2003 với 2007 ?
 
ủa thì chuỗi đặt là
Mã:
cn.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & ThisWorkbook.FullName
có phải ý anh hỏi là : dùng chuỗi kết nối nào cho cả 2 phiên bản 2003 với 2007 ?
Ý nói là viết hết cái sub, coi mức độ nó dài đến thế nào ý.
 
Ý nói là viết hết cái sub, coi mức độ nó dài đến thế nào ý.
à thì ra ý anh là thi viết code cho ngắn nhất , vậy thì em rớt từ ngoài vòng gửi xe rồi , không có hi vọng , nhưng thôi kệ có nhiêu nhậu nhiêu
Mã:
Public Sub hello()
Dim cn As Object
Set cn = CreateObject("adodb.connection")
cn.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & ThisWorkbook.FullName
Sheet1.Range("A1").CopyFromRecordset cn.Execute("select * from [Sheet2$]")
End Sub
 
Không biết code này có đảm bảo yêu cầu của anh kieu manh ko?

Mã:
Dim FSO As Object, FileItem As Object, cn As Object, rs As Object, SubFolder As Object


Sub kieumanh(SourceFolderName As String, IncludeSubfolders As Boolean)
Dim query As String
Const ExcelExtension As String = "|xls|xlsb|xlsm|xlsx|"
Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")


For Each FileItem In .GetFolder(SourceFolderName).Files
    If InStr(ExcelExtension, "|" & .GetExtensionName(FileItem.Path) & "|") Then
        If Left(FileItem.Name, 1) <> "~" And FileItem.Path <> ThisWorkbook.FullName Then
            With cn
                .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileItem.Path & ";Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";"
                .Open
            End With
            query = " SELECT  * FROM [GPE$A2:J200]"
            rs.Open query, cn
            Range("A" & Range("A65000").End(3).Row + 1).CopyFromRecordset rs
            rs.Close: cn.Close
        End If
    End If
Next FileItem
    If IncludeSubfolders Then
        For Each SubFolder In .GetFolder(SourceFolderName).SubFolders
        kieumanh SubFolder.Path, True
        Next SubFolder
    End If
End With
    Set rs = Nothing: Set cn = Nothing
    Set FileItem = Nothing
    Set FSO = Nothing
End Sub


Sub run()
    Range("A2:J" & Range("A65000").End(3).Row).Clear
    Call [B]kieumanh("E:\", True)[/B]
    Call [B]kieumanh("D:\", True)[/B]
End Sub
Sáng tới giờ mình xuống Sài Gòn chơi ... mới về coi ....thấy không chạy được Vì lấy cả D hay E sao ....Mà trong Hai ổ đó có quá nhiều Folder nó duyệt hoài hay sao .... nếu để y trang vậy chạy là lỗi code

Nếu lấy 1 Foder thì Ok VD: D:\mm\*.xls"
 
à thì ra ý anh là thi viết code cho ngắn nhất , vậy thì em rớt từ ngoài vòng gửi xe rồi , không có hi vọng , nhưng thôi kệ có nhiêu nhậu nhiêu
Mã:
Public Sub hello()
Dim cn As Object
Set cn = CreateObject("adodb.connection")
[COLOR=#ff0000][B]cn.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ="[/B][/COLOR] & ThisWorkbook.FullName
Sheet1.Range("A1").CopyFromRecordset cn.Execute("select * from [Sheet2$]")
End Sub
Cái dòng màu đỏ Mạnh thấy chạy hay lỗi trên một số máy lắm và lấy lên nó hay Lỗi Font....Nếu hỏi mình Tại sao ....Tịt --=0
--=0--=0

VD: Font Gốc =Thông ............. Nó Sang Th?ng
 
Lần chỉnh sửa cuối:
Sáng tới giờ mình xuống Sài Gòn chơi ... mới về coi ....thấy không chạy được Vì lấy cả D hay E sao ....Mà trong Hai ổ đó có quá nhiều Folder nó duyệt hoài hay sao .... nếu để y trang vậy chạy là lỗi code

Nếu lấy 1 Foder thì Ok VD: D:\mm\*.xls"
Thật ra em mới chỉ test trên 1 folder (ổ E) với nhiều subfolders thôi. Tại vì anh bảo để trong 50 folder khác nhau mà ko rõ nhưng folder đó có chung đặc điểm gì không nên em phải đọc cả ổ ạ.
 
Thật ra em mới chỉ test trên 1 folder (ổ E) với nhiều subfolders thôi. Tại vì anh bảo để trong 50 folder khác nhau mà ko rõ nhưng folder đó có chung đặc điểm gì không nên em phải đọc cả ổ ạ.
Thì cấu trúc Folder nó lộn xộn như bài 240 đó

1/ VD: E:\mm\1.xls
2/ VD: E:\ma\kk\2.xlsx
3/ VD: E:\hh\mm\kk\3.xls
.......................................
1/ VD: D:\mm\4.xls
2/ VD: D:\mm\kk\5.xlsb
3/ VD: D:\hh\mm\kk\6.xlsm

Viết đơn giản thôi mà thay vì ta thường hay sử dụng Array(...) gán vao mãng thì ta dụng cách khác ngắn gọn và hay hơn thôi .....
Nếu 1 vài File thì Array Ok ... nhiều file thì thấy Gớm
 
Lần chỉnh sửa cuối:
Cái dòng màu đỏ Mạnh thấy chạy hay lỗi trên một số máy lắm và lấy lên nó hay Lỗi Font....Nếu hỏi mình Tại sao ....Tịt --=0
--=0--=0

VD: Font Gốc =Thông ............. Nó Sang Th?ng
Mình không đặt nặng vấn đề font, miễn sao lấy được dữ liệu thôi.
 
Thì cấu trúc Folder nó lộn xộn như bài 240 đó

1/ VD: E:\mm\1.xls
2/ VD: E:\ma\kk\2.xlsx
3/ VD: E:\hh\mm\kk\3.xls
.......................................
1/ VD: D:\mm\4.xls
2/ VD: D:\mm\kk\5.xlsb
3/ VD: D:\hh\mm\kk\6.xlsm

Viết đơn giản thôi mà thay vì ta thường hay sử dụng Array(...) gán vao mãng thì ta dụng cách khác ngắn gọn và hay hơn thôi .....
Nếu 1 vài File thì Array Ok ... nhiều file thì thấy Gớm
Ý anh ở đây là đã biết trước đường dẫn của các file?
 
Ý anh ở đây là đã biết trước đường dẫn của các file?
đúng rồi đó ....vấn đề là duyệt file gán vào mãng làm sao cho nó gọn lại và không sử dụng cách mà trên GPE hay xài là Array(file1,file2,... To 50) vậy thôi hay lấy đường dẫn lên Sheet xong duyệt Files
 
Vậy thì viết như thế nào cho nó chạy với các máy? Xét version là điều không thể tránh?
Hôm thấy code Anh Hải khai báo thấy chạy Tốt ...Nhưng chỉ Office 2007 là Lỗi
Còn xét theo Ver thì chạy Tuốt ....Chờ Bạn khai phá cách viết mới cho Mạnh Học với
 
Hôm thấy code Anh Hải khai báo thấy chạy Tốt ...Nhưng chỉ Office 2007 là Lỗi
Còn xét theo Ver thì chạy Tuốt ....Chờ Bạn khai phá cách viết mới cho Mạnh Học với
Nếu không xét vấn đền font thì tôi viết như sau:

PHP:
Sub DoVui()
    With CreateObject("ADODB.Connection")
        .Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & ThisWorkbook.FullName
        Sheet2.[a2].CopyFromRecordset .Execute("Select * From [Sheet1$]")
    End With
    
End Sub
 
Nếu không xét vấn đền font thì tôi viết như sau:

PHP:
Sub DoVui()
    With CreateObject("ADODB.Connection")
        .Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & ThisWorkbook.FullName
        Sheet2.[a2].CopyFromRecordset .Execute("Select * From [Sheet1$]")
    End With
    
End Sub
Hay...xúc tích ngắn gọn ...Bạn chỉ cho cách xử lý Font đi
Xin cảm ơn
 
Nếu không xét vấn đền font thì tôi viết như sau:

PHP:
Sub DoVui()
    With CreateObject("ADODB.Connection")
        .Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & ThisWorkbook.FullName
        Sheet2.[a2].CopyFromRecordset .Execute("Select * From [Sheet1$]")
    End With
    
End Sub
Sao mình thử chạy code này mà nó báo lỗi nhỉ?
Capture.jpg
 
To quangluu1989
Sao rồi nghĩ ra cách làm bài #240 chưa vậy
 
Vẫn còn nhiều, còn có thể rút gọn được nữa.

Vậy tôi viết như sau tổng 307 kí tự không tính cách trắng:

Mã:
Sub ADO_DoVui()


    Dim v As String
    v = Application.Version
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & ";Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
        Sheet2.[a1].CopyFromRecordset .Execute("Select * From [Sheet1$]")
    End With
    
End Sub

Tôi nghĩ còn có thể rút gọn được nữa.
 
Mình có bài toán này, mong GPE tư vấn giúp mình câu truy vấn để ra được kết quả như trong file đính kèm. Cảm ơn.

Capture.jpg
 

File đính kèm

... câu truy vấn của mình dài quá, mình thấy ko tối ưu nên muốn tham khảo thêm các câu truy vấn của các bạn.

Đối với lập trình, chuyện tối ưu còn tuỳ theo quan điểm. Bạn muốn câu truy vấn ngắn, hay muốn nó hoạt động hiệu quả về tốc độ hay về tài nguyên, hay muốn nó dễ hiểu dễ sửa.

Riêng quan điểm của tôi, khi viết một câu lệnh truy vấn, dài/ngắn là điều kiện cuối cùng mà tôi trông tới.
 
Đối với lập trình, chuyện tối ưu còn tuỳ theo quan điểm. Bạn muốn câu truy vấn ngắn, hay muốn nó hoạt động hiệu quả về tốc độ hay về tài nguyên, hay muốn nó dễ hiểu dễ sửa.

Riêng quan điểm của tôi, khi viết một câu lệnh truy vấn, dài/ngắn là điều kiện cuối cùng mà tôi trông tới.
Cảm ơn bạn đã góp ý. Vấn đề của mình là truy vấn không tối ưu (chạy rất chậm), dữ liệu có 60 dòng thui mà cũng mất khoảng 1s, 100 dòng mất 2.5s.
 
Mình có bài toán này, mong GPE tư vấn giúp mình câu truy vấn để ra được kết quả như trong file đính kèm. Cảm ơn.

View attachment 165692
Mình đã thay đổi truy vấn, tốc độ được cải thiện rất nhiều rùi (100 dòng dữ liệu mất 0.02s, chỉ thay đổi subquery thành table để join thui mà khác hẳn, hic), vậy bạn nào có nhã hứng tham gia giải bài toán này nha.
 
Lần chỉnh sửa cuối:
Các bạn giúp mình xử lý sự cố ADO này ạ: ADO tổng hợp công nợ chạy trên excel 2003 hoàn toàn bình thường, khi mình save as thành đuôi .xlsm thì báo lổi như sau:
The Microsoft Access database engine could not find the object 'PSNC'. Make sure the object exists and that you spell its name and the path name correctly. if 'PSNC' is not a local object, check your network connection or contact the server administator
Mình thử kiểm tra vùng PSNC thấy vẫn tồn tại bình thường, không hiểu sao lại báo lổi như thế

Cám ơn các bạn
 
Chỉnh sửa lần cuối bởi điều hành viên:
Các bạn giúp mình xử lý sự cố ADO này ạ: ADO tổng hợp công nợ chạy trên excel 2003 hoàn toàn bình thường, khi mình save as thành đuôi .xlsm thì báo lổi như sau:
The Microsoft Access database engine could not find the object 'PSNC'. Make sure the object exists and that you spell its name and the path name correctly. if 'PSNC' is not a local object, check your network connection or contact the server administator
Mình thử kiểm tra vùng PSNC thấy vẫn tồn tại bình thường, không hiểu sao lại báo lổi như thế

Cám ơn các bạn
Xem lại trong code mà bạn khai báo cái đường dẫn, phải thay đổi từ PSNC.xls sang PSNC.xlsm
 
Cám ơn bác Hai Lúa, mình đã tìm ra vấn đề, do sheet chứa vùng PSNC đặt tên là tmp, mình đoán có lẽ trùng tên với đường dẫn nào của của object ADO
 
2 cách dùng ADO mà tôi biết (có thể có các cách khác tôi không biết)

1. Dùng ADO Exlensions của DDLS (ADOX) để đọc Catalog

Mã:
Sub GetSheetNames1()

Dim cn As ADODB.Connection
Dim cat As ADOX.Catalog
Dim t As ADOX.Table

Set cn = New ADODB.Connection
cn.Open "Provider=MSDASQL.1;Data Source=Excel Files;" _
& "Initial Catalog=C:\Junks\Test Book.xls"
Set cat = New ADOX.Catalog
Set cat.ActiveConnection = cn
For Each t In cat.Tables
Debug.Print t.Name
Next t
Set cat = Nothing
cn.Close
Set cn = Nothing
End Sub

2. Dùng hàm OpenSchema và tham số adSchemaTables để load schema vào một string rồi parse string đó để lấy tên sheet

Mã:
Sub GetSheetNames2()

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

Set cn = GetExcelConnection("C:\Junks\Test Book.xls")
Set rs = cn.OpenSchema(adSchemaTables)

Do While Not rs.EOF
    strTable = rs.Fields("table_name").Value
    If Right$(strTable, 1) = "$" Then ' sheet name
        strWorksheetList = strWorksheetList & vbCrLf & strTable
    Else ' range name
        strRangeList = strRangeList & vbCrLf & strTable
    End If
    rs.MoveNext
Loop
Debug.Print "Worksheets:" & strWorksheetList & vbCrLf & vbCrLf & "Ranges:" & strRangeList
End Sub

Private Function GetExcelConnection(ByVal Path As String, _
    Optional ByVal Headers As Boolean = True) As Connection
    Dim strConn As String
    Dim objConn As ADODB.Connection
    Set objConn = New ADODB.Connection
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
              "Data Source=" & Path & ";" & _
              "Extended Properties=""Excel 8.0;HDR=" & _
              IIf(Headers, "Yes", "No") & """"
    objConn.Open strConn
    Set GetExcelConnection = objConn
End Function

Cả 2 cách đều lấy tên sheet theo thứ tự abc. Làm thế nào để biết sheet đầu tiên thì tôi lười quá chưa nghĩ ra.

Theo tôi biết, Catalog và Schema đọc tên sheet từ ISAM table cho nên bắt buộc phải theo thứ tự index của ISAM.

Cho em hỏi các anh đánh dấu mục nào trong References để cho code không bị lỗi
Dim cat As ADOX.Catalog
Em xin chân thành cảm ơn
 
Cho em hỏi các anh đánh dấu mục nào trong References để cho code không bị lỗi
Dim cat As ADOX.Catalog
Em xin chân thành cảm ơn

Thử vầy xem
Mã:
Public Sub Check_ADOX()
    Rem Microsoft ADO Ext. 2.8 for DDL and Security
    On Error GoTo Thoat
    ThisWorkbook.VBProject.References.AddFromGuid _
    GUID:="{00000600-0000-0010-8000-00AA006D2EA4}", Major:=2, Minor:=8
Thoat:
End Sub
 
còn dụ này nữa nếu kết nối file 2003 thì ok
mà kết nối file 2010 thì báo lỗi
Mã:
Sub LayTenSheet2010()   
   
    Dim Dbs  As Object, db As Object, tbl As Object
    Set Dbs = CreateObject("DAO.DBEngine.36")
    Set db = Dbs.OpenDatabase("D:\test.xlsx", False, True, "Excel 12.0;")
    For Each tbl In db.TableDefs
        If Right(tbl.Name, 1) = "$" Or Right(tbl.Name, 2) = "$'" Then
            MsgBox tbl.Name
        End If
    Next tbl
    db.Close
    Set Dbs = Nothing: Set db = Nothing: Set tbl = Nothing
End Sub
lỗi tại dòng này
Set db = Dbs.OpenDatabase("D:\test.xlsx", False, True, "Excel 12.0;")
với thông báo là
could not find installable isam
không biết lỗi đây là thiếu file nào? xin được giải thích dùm, xin chân thành cảm ơn tất cả các thành viên GPE
 
còn dụ này nữa nếu kết nối file 2003 thì ok
mà kết nối file 2010 thì báo lỗi
Mã:
Sub LayTenSheet2010()   
   
    Dim Dbs  As Object, db As Object, tbl As Object
    Set Dbs = CreateObject("DAO.DBEngine.36")
    Set db = Dbs.OpenDatabase("D:\test.xlsx", False, True, "[COLOR=#ff0000]Excel 12.0[/COLOR];")
    For Each tbl In db.TableDefs
        If Right(tbl.Name, 1) = "$" Or Right(tbl.Name, 2) = "$'" Then
            MsgBox tbl.Name
        End If
    Next tbl
    db.Close
    Set Dbs = Nothing: Set db = Nothing: Set tbl = Nothing
End Sub
lỗi tại dòng này
Set db = Dbs.OpenDatabase("D:\test.xlsx", False, True, "Excel 12.0;")
với thông báo là
could not find installable isam
không biết lỗi đây là thiếu file nào? xin được giải thích dùm, xin chân thành cảm ơn tất cả các thành viên GPE
Phi thử test là thay màu đỏ thành Excel 8.0 coi nó chạy đc không nhé
 
Lần chỉnh sửa cuối:
Tạo mã tự tăng có tiền tố ?

Mời các anh chị tham gia 1 câu hỏi nhỏ sau đây:
Tôi có 1 bảng cần Insert dữ liệu vào cột [Ma]
Nguyên tắc Insert :
tham số truyền vào lấy từ cột [Nhom]
hàm sẽ có dạng
Mã:
public sub Insert (nhom as string)
............................................
end sub

6ef131da2986657757d5422e3bf17adc.png


lấy ví dụ khi ta gọi
Mã:
Insert "A"
kết quả sẽ chèn vào cột [Ma] giá trị là "A004"

khi ta gọi
Mã:
Insert "B"
Kết quả sẽ chèn vào cột [Ma] giá trị là "B003"

khi ta gọi
Mã:
Insert "C"
Kết quả sẽ chèn vào cột [Ma] giá trị là "C001"
Chỉ sử dụng chuỗi truy vấn , không liên quan gì đến các hàm VBA đâu nha.
xin mời các anh chị. --=0--=0
 

File đính kèm

Dùng LIKE để lọc (WHERE) các dòng bắt đầu bằng 'A' hoặc 'B', ... (mã muón tìm)
Dùng MAX để lấy trị lớn nhất
Dùng RIGHT JOIN với 0 để phòng trường hợp chưa có mã (chả có dòng nào)
Dùng phép tách chuỗi để lấy phần số (dùng IIF để mặc định là 0 nếu NULL)
Cộng 1

Bài này cũng giống như hỏi cách đi từ SG đến Nam vang bằng đường bay qua biển. Gần thì bay chuyến Phú quốc, xa thì đến Băng Cốc
 
Bài này cũng giống như hỏi cách đi từ SG đến Nam vang bằng đường bay qua biển. Gần thì bay chuyến Phú quốc, xa thì đến Băng Cốc

anh ơi địa danh Nam vang nằm ở đâu vậy ? chắc không nằm trong nước Việt Nam rồi +-+-+-++-+-+-+
và ý nghĩ của câu này là gì ? em ngu muội không hiểu ra được .
 
Nếu không nghe từ cam Nam vang bao giờ thì chắc là dân ở khoảng Bình định trở lên.
Đối với người SG, Nam vang nó xa theo không gian thì ít mà xa về thời gian thì nhiều. Cũng như Vọng các vậy.
 
Nếu không nghe từ cam Nam vang bao giờ thì chắc là dân ở khoảng Bình định trở lên.
Đối với người SG, Nam vang nó xa theo không gian thì ít mà xa về thời gian thì nhiều. Cũng như Vọng các vậy.

trước hết thì làm xong bài trên cái đã
Mã:
"insert into [Sheet1$B3:B] (f1) " & _
" select '" & nhom & "' & right('000' & (0 & right(max(f1),3)) + 1, 3) " & _
" from [Sheet1$B3:B] where f1 like '" & nhom & "%'"

em ở sát Sì Gòn, nhưng mà tuổi còn trẻ quá, không biết mấy địa danh đó. Nếu vui lòng anh có thể kể đôi điều thú vị về những chuyện anh nói ở trên không ?
Nói theo kiểu ông bà hay nói là : anh ăn muối chắc nhiều hơn em ăn cơm. Bởi vậy người trẻ thích nghe chuyện của các bậc tiền bối . --=0--=0
 
trước hết thì làm xong bài trên cái đã
Mã:
"insert into [Sheet1$B3:B] (f1) " & _
" select '" & nhom & "' & right('000' & (0 & right(max(f1),3)) + 1, 3) " & _
" from [Sheet1$B3:B] where f1 like '" & nhom & "%'"

'A' và 'B' thì được nhưng kể từ 'C' code sẽ bị vấn đề vì query chả truy ra được dòng nào.

Có 2 cách làm:
1. Join nó với một cái gì đó để luôn luôn có ít nhất 1 dòng
2. Dùng hàm NZ hoặc iif(IsNull(Max( ...) để đặt mã khởi đầu
 
Đính chính cho bài #286 và #288:

Cách Join với một cái gì đó không dùng được ở đây (hàm MAX). Tôi nhầm với hàm COUNT.
 
'A' và 'B' thì được nhưng kể từ 'C' code sẽ bị vấn đề vì query chả truy ra được dòng nào.

Có 2 cách làm:
1. Join nó với một cái gì đó để luôn luôn có ít nhất 1 dòng
2. Dùng hàm NZ hoặc iif(IsNull(Max( ...) để đặt mã khởi đầu

sẽ bị vấn đề thật ư ? em trẻ tuổi chứ không nông cạn anh ạ --=0--=0
Nếu nhìn kỹ sẽ thấy 2 lệnh sau đây khác xa nhau về mặt ý nghĩa
Mã:
'000' & right(max(f1),3) + 1


Mã:
'000' & [COLOR=#ff0000][SIZE=3][B](0 &[/B][/SIZE][/COLOR] right(max(f1),3)[B][SIZE=3][COLOR=#ff0000])[/COLOR][/SIZE][/B] + 1

lệnh thứ nhất sẽ trả về chuỗi '000' khi hàm Max trả về NULL
Tuy dùng cỗ máy Access để xử lý dữ liệu nhưng ADO trên Excel có những luật riêng, điển hình là ở đây
lệnh '&' nối chuỗi được phép diễn ra giữa kí tự 0 và trị NULL
dẫn đến việc hàm max trả về NULL thì kết quả của đoạn code thứ 2 sẽ trả về '0001'
và có vẻ như Excel không có hàm NZ
Em ra bài này vì tình cờ có người nhờ tạo mã theo luật tương tự, nhưng sử dụng trên SQL Server.
Tất nhiên đối với SQL Server không thể nối chuỗi khi 1 trong 2 hạng tử là NULL, mà phải sử dụng thêm hàm ISNULL
 
ờ đúng rồi, tôi lại quên nữa, Access không trọng về kiểu lắm cho nên khi cần sẽ tự động ép kiểu null thành "".

NZ được thêm vào trong Access 2007. Microsoft làm thế sau khi họ thêm hàm Coalesce vào T-SQL 2005 để làm gọn trường hợp IfNull, bà con la lên đòi hàm tương tự cho Access.
(hình như những tay chuyên nghiệp T-SQL nói là Coalesce chạy chậm. Thực tế thì hàm này chỉ mục đích giúp cho câu gọn hơn, vì SQL tiêu chuẩn không có hàm IIF, phải dùng CASE)
 
còn dụ này nữa nếu kết nối file 2003 thì ok
mà kết nối file 2010 thì báo lỗi
Mã:
Sub LayTenSheet2010()   
   
    Dim Dbs  As Object, db As Object, tbl As Object
    Set Dbs = CreateObject("DAO.DBEngine.[COLOR=#FF0000]36[/COLOR]")
    Set db = Dbs.OpenDatabase("D:\test.xlsx", False, True, "Excel 12.0;")
    For Each tbl In db.TableDefs
        If Right(tbl.Name, 1) = "$" Or Right(tbl.Name, 2) = "$'" Then
            MsgBox tbl.Name
        End If
    Next tbl
    db.Close
    Set Dbs = Nothing: Set db = Nothing: Set tbl = Nothing
End Sub
lỗi tại dòng này
Set db = Dbs.OpenDatabase("D:\test.xlsx", False, True, "Excel 12.0;")
với thông báo là
could not find installable isam
không biết lỗi đây là thiếu file nào? xin được giải thích dùm, xin chân thành cảm ơn tất cả các thành viên GPE

Bạn Phi thay chỗ .36 màu đỏ =.120 xem có được không nhé.
 
1/Sao mình đọc từ bài 1 tới bài cuối mà ko thấy ai xài DAO lấy dữ liệu File đóng nhỉ ...thấy mấy bài DAO toàn lấy Tên Sheet ....còn lại là toàn ADO

2/ Phải chăng sử DAO lấy dữ liệu File đóng tốc độ chậm hơn ADO hay gì gì đó mà thấy ít bạn xài ???

3/ Tại sao thấy trên mạng thấy họ hay sử dụng DAO để lấy và ghi dữ liệu từ Excel vào Access nhỉ ...phải chăng sử dụng DAO trong trường hợp này viết code nó đơn giản hơn , dễ hơn mà ko phức tạp và khai báo lằng nhằng như ADO ???

4/ Thấy trên Internet hắn nói sử dụng ADO khi lấy và ghi dữ liệu qua mạng [ LAN & Internet] cho tốc độ nhanh hơn DAO ...ko biết hắn nói vậy có đúng ko ???

Vài điều thắc mắc chưa hiểu lắm ....Mong các Bạn Hiểu sâu hơn chuyên hơn chỉ dùm ...xin cảm ơn
 

1/Sao mình đọc từ bài 1 tới bài cuối mà ko thấy ai xài DAO lấy dữ liệu File đóng nhỉ ...thấy mấy bài DAO toàn lấy Tên Sheet ....còn lại là toàn ADO

Vì DAO cũ rồi. Xài ADO hợp thời trang hơn.
Đây là nói thời trang. Việc cái nào tốt hơn là việc khác.
Có một vài công việc mad DAO làm được mà ADO (+ADOX) không làm được, và ngược lại. Tuy nhiên, những công việc ấy không quan trọng lắm đối với nhu cầu của các bạn ở đây, cho nên có thể tạm coi như cả hai đều như nhau.

2/ Phải chăng sử DAO lấy dữ liệu File đóng tốc độ chậm hơn ADO hay gì gì đó mà thấy ít bạn xài ???

Khong hẳn đúng lắm. Cỗ máy ACE hay JET đều làm việc với ADO và DAO như nhau. Chỉ khi cần nối với các CSDL khác như SQL Server, mySQL mới cho thấy ADO làm việc dễ hơn.
(đây là tạm hiểu cái "file đóng" mà bạn muốn nói là xls, txt, csv. Chứ mdb thì là chuyện khác)

3/ Tại sao thấy trên mạng thấy họ hay sử dụng DAO để lấy và ghi dữ liệu từ Excel vào Access nhỉ ...phải chăng sử dụng DAO trong trường hợp này viết code nó đơn giản hơn , dễ hơn mà ko phức tạp và khai báo lằng nhằng như ADO ???

DAO là căn bản của Access. Code có từ đời thủa rồi.
Chuyện khai báo lằng nhằng là vấn đề chủ quan. Vì các bạn quen xài tới đâu code tới đó cho nên mới xảy ra chuyện lằng nhằng. Nhừng ngừoi dùng nhiều có các hàm thư viện, lúc cần thì import cả module, chả lằng nhằng chút nào.
Ngược lại, nếu gọi Stored Procedure thì cách nạp tham số của ADO dễ hơn.

4/ Thấy trên Internet hắn nói sử dụng ADO khi lấy và ghi dữ liệu qua mạng [ LAN & Internet] cho tốc độ nhanh hơn DAO ...ko biết hắn nói vậy có đúng ko ???

Có thể. Vì DAO chủ yếu cho máy chính. Lấy dữ liệu qua mạng là kỹ thuật Client-Server, sở trường của ADO. Tuy nhiên, dữ liệu chuyển qua mạng còn nhiều yếu tố khác, khó khẳng định 100% nếu khong rõ cấu trúc từng trường hợp.
 
Bạn @quanluu1989 giúp tiếp giùm mình hoàn thiện file giá thành ở #228 với, code trước bạn giúp mình tổng hợp xuất NVL từ file giá thành nhưng có một vấn đề là có những NVL định mức = 0 (một số thành phẩm trong bảng định mức không sử dụng loại NVL này nên số lượng SX = 0) nhưng vẫn được liệt kê trong bảng tổng hợp, có cách nào bỏ những dòng này bằng ADO luôn không, cám ơn bạn nhiều
 
Em mạnh dạn đưa câu trả lời lần 2 dựa trên gợi ý anh HLMT. Anh xem và góp ý nhé
Mã:
Sub ChuyenDL()
    On Error GoTo Handle
    Dim cnn As Object, lsSQL As String, lrs As Object
    Dim WbOpen As Workbook, Sh As Worksheet
    Set cnn = CreateObject("ADODB.Connection")
    Set lrs = CreateObject("ADODB.Recordset")
    Application.ScreenUpdating = False
    Set WbOpen = Application.Workbooks.Open(ThisWorkbook.Path & "\B.xls")
    With WbOpen
        For Each Sh In .Worksheets
            If Sh.Name = "SheetB" Then
                Sh.Range("A1:C1").NumberFormat = "@"
                Sh.Range("A1:D1").NumberFormat = "0"
                Exit For
            End If
        Next
        .Save
        .Close
    End With
    Application.ScreenUpdating = True
    With cnn
        .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=" & ThisWorkbook.FullName & _
                ";Extended Properties=""Excel 8.0;HDR=No;Imex=2"";"
        .Open
    End With
    lsSQL = "INSERT INTO [SheetB$](f2,f4) IN '" & ThisWorkbook.Path & _
            "\B.xls ' 'Excel 8.0;' SELECT f2,f3 FROM [DataA$A1:D16]"
    lrs.Open lsSQL, cnn, 3, 1
    Set lrs = Nothing
    cnn.Close: Set cnn = Nothing
    Exit Sub
Handle:
    MsgBox Err.Description
End Sub
Nếu insert trên B.xls từ file A.xls đóng thì cú pháp của cấu insert thế naofaf bác?
 
Chào các bạn trẽ.
Cuối tuần mời các bạn giải trí với bài tập đơn giản như sau:
Tôi có bảng dữ liệu Nhật ký điểm danh các học sinh của 1 lớp. Nhờ các bạn giúp thống kê tính toán xem các học sinh đã nghỉ những ngày nào bằng code ADO, hoặc bất cứ công cụ nào có thể cho ra được kết quả.
Cảm ơn các bạn --=0--=0

dsvang-png.181433
 

File đính kèm

  • dsvang.png
    dsvang.png
    22.2 KB · Đọc: 110
  • diemdanh.xlsb
    diemdanh.xlsb
    8.7 KB · Đọc: 12
Chào các bạn trẽ.
Cuối tuần mời các bạn giải trí với bài tập đơn giản như sau:
Tôi có bảng dữ liệu Nhật ký điểm danh các học sinh của 1 lớp. Nhờ các bạn giúp thống kê tính toán xem các học sinh đã nghỉ những ngày nào bằng code ADO, hoặc bất cứ công cụ nào có thể cho ra được kết quả.
Cảm ơn các bạn --=0--=0

dsvang-png.181433
Thử như sau, bạn test hộ nhé:

select t3.f1,t3.F2 from (SELECT distinct t2.F1, t1.F2 FROM [Sheet1$B2:C15] as t1, [Sheet1$I2:I5] as t2) t3 LEFT JOIN [Sheet1$B2:C15] t4 ON (T3.F2 = t4.F2) and (T3.F1 = t4.F1) where t4.F1 is null
 

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

Back
Top Bottom