Đố vui về ADO, DAO.

Liên hệ QC
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

  • Insert.xlsx
    7.8 KB · Đọc: 9
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: 109
  • 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
 
Web KT
Back
Top Bottom