Các thủ tục cơ bản với ADO Excel?

Thảo luận trong 'Ứng dụng Excel' bắt đầu bởi Bình_OverAC, 13 Tháng ba 2006.

4,047 lượt xem

  1. Bình_OverAC

    Bình_OverAC Over Abnormal / Crazy

    Bài viết:
    845
    Đã được thích:
    7
    Nơi ở:
    Nha Trang
    Thưa các bác,

    Em đang học ADO Excel nhưng mà mệt người quá. Google, microsoft ... em search đủ chổ hết mà đọc hỏng hiểu gì hết. Mong các bác giúp em với em muốn hiểu được các thủ tục cơ bản:

    - Addnew (cái này em làm được nhưng cũng hỏng hiểu)
    - Seek
    - Edit
    - Insert
    - Sort

    chân thành cảm ơn các bác

    Bình_OverAC
     
    #1
  2. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    - Addnew để tạo ra một Record (tạm thời)
    - Edit để sửa Record tại bản ghi hiện thời
    - Update để chấp nhận sự thay đổi hay thêm mới bởi Edit và Addnew
    - Seek để tìm tới một Record theo điều kiện (có thể dùng *, ?)
    - Insert để chèn một bản ghi mới
    - Sort sắp xếp
     
    #2
  3. Bình_OverAC

    Bình_OverAC Over Abnormal / Crazy

    Bài viết:
    845
    Đã được thích:
    7
    Nơi ở:
    Nha Trang
    Bác Tuân ơi.
    Bác cho em một số ví dụ được không ạh!
    Cụ thể là seek
    - Trước khi dò phải làm gì?
    - Set field dò tìm ?
    - Set trị dò tim?
    - Những giá trị dò sẽ được lưu vào đâu?

    Em đọc mấy cái ví dụ của Microsoft thấy mong lung quá.
    Cảm ơn bác.
     
    #3
  4. levanduyet

    levanduyet Welcome

    Bài viết:
    535
    Đã được thích:
    11
    Giới tính:
    Nam
    Nơi ở:
    HCM
    Em hãy tìm kiếm với từ khóa "Excel" + "ADO". Nó sẽ cho em ra một trang (nếu anh nhớ không lầm) trong trang web của Microsoft. Nó nói rất kỹ về vụ này, ngay cả các bug nữa.
    Thân,
    LVD
     
    #4
  5. Bình_OverAC

    Bình_OverAC Over Abnormal / Crazy

    Bài viết:
    845
    Đã được thích:
    7
    Nơi ở:
    Nha Trang
    Em đã đọc nhiều mà ứng dụng không được anh Duyệt ơi.
    Thế nên em mới hỏi, em muốn biết xem các properities, method trong các ví dụ đó nó làm ăn thế nào? anh Duyệt trả lời cụ thể giúp em với.
     
    #5
  6. levanduyet

    levanduyet Welcome

    Bài viết:
    535
    Đã được thích:
    11
    Giới tính:
    Nam
    Nơi ở:
    HCM
    Hu hu hu

    Để giải thích cụ thể cho em thì thật là khó.
    Thực tế, anh cũng đọc từ trên internet, nếu anh search được mà thôi.
    Thân,
    LVD
     
    #6
  7. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
  8. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Bình tham khảo ví dụ của mình dưới đây, nếu không rõ chỗ nào thì mình giải thích.

    Function GetConnMDB(ByVal cFileName As String) As ADODB.Connection
    On Error GoTo loi:
    'Open the ADO connection to the Excel workbook
    Dim oconn As ADODB.Connection
    Set oconn = New ADODB.Connection
    oconn.Open "provider=microsoft.jet.oledb.4.0; data source=" & cFileName
    Set GetConnMDB = oconn
    loi:
    Set oconn = Nothing
    If err.Number <> 0 Then Set GetConnMDB = Nothing
    End Function

    Function GetRS(ByVal cVung As String, ByVal oconn As ADODB.Connection) As ADODB.Recordset
    On Error GoTo loi:
    'Get the table name from the dropdown
    Dim sTableName As String
    sTableName = cVung
    'Get the recordset
    Dim oRS As ADODB.Recordset
    Set oRS = New ADODB.Recordset
    On Error GoTo loi:
    oRS.Open sTableName, oconn, adOpenStatic, adLockOptimistic
    Set GetRS = oRS
    loi:
    Set oRS = Nothing
    If err.Number <> 0 Then Set GetRS = Nothing
    End Function

    Sub LoadDataToSheet()
    Dim oconn As ADODB.Connection
    Dim oRS As ADODB.Recordset

    Set oconn = GetConnMDB("CHUNGTU.MDB")
    cSQL = "Select * from Dmhang"
    Set oRS = GetRS(cSQL, oconn)
    Range("A1").CopyFromRecordset oRS
    End Sub

    Sub NHAP()
    Dim oconn As ADODB.Connection
    Dim oRS As ADODB.Recordset
    Dim WS As Worksheet
    Set WS = Worksheets("phieuchi")
    cFile = "CHUNGTU.MDB"
    Set oconn = GetConnMDB(cFile)
    cSQL = "NHATKY"
    Set oRS = GetRS(cSQL, oconn)

    oRS.AddNew

    oRS.Fields("NGAYCT").Value = DateValue(WS.Range("W9").Value & "/" & WS.Range("Q9").Value & "/" & WS.Range("AC9").Value)
    oRS.Fields("SOHIEUCT").Value = WS.Range("AI6").Value
    oRS.Fields("DIENGIAI").Value = WS.Range("G16").Value
    oRS.Fields("DVKH").Value = WS.Range("L14").Value
    oRS.Fields("SLGTIEN").Value = WS.Range("G17").Value
    oRS.Fields("TYGIA").Value = WS.Range("X17").Value
    oRS.Fields("LOAITIEN").Value = WS.Range("O17").Value
    oRS.Fields("ttIEN").Value = WS.Range("G17").Value * WS.Range("X17").Value
    oRS.Fields("NOTK").Value = WS.Range("AJ11").Value
    oRS.Fields("COTK").Value = WS.Range("AJ12").Value
    oRS.Fields("DTCF").Value = WS.Range("I16").Value

    oRS.Update

    MsgBox "Ok!"
    Set oRS = Nothing
    Set oconn = Nothing
    Set WS = Nothing

    End Sub
     
    #8
  9. Bình_OverAC

    Bình_OverAC Over Abnormal / Crazy

    Bài viết:
    845
    Đã được thích:
    7
    Nơi ở:
    Nha Trang
    Cảm ơn bác về đoạn code.
    Nhờ bác giúp em giải thích 2 hằng số này với, giá trị và công dụng:
    "adOpenStatic", "adLockOptimistic"

    Nếu có các đoạn về edit, seek nữa thì hay quá.
    Cảm ơn bác.
     
    #9
  10. levanduyet

    levanduyet Welcome

    Bài viết:
    535
    Đã được thích:
    11
    Giới tính:
    Nam
    Nơi ở:
    HCM
    Bình ơi,
    Em đọc bài ADO căn bản trong trang web của anh, có giải thích về vấn đề này mà.
    Thân,
    LVd
     
    #10
  11. workman

    workman Thành viên hoạt động

    Bài viết:
    372
    Đã được thích:
    0
    Nơi ở:
    Ho Chi Minh
    Tôi không rành VBA lắm, nhất là ADO Excel. Thôi thì củ chuối 1 chút nhé, dùng tạm những gì tôi biết trong Access vậy.

    Trước khi dò bằng Seek bạn phải có một chỉ mục (index). Nếu chưa có index thì phải tạo index trong table của bạn. Cái index này chính là field dò tìm mà bạn đề cập.

    Khi set giá trị dò tìm, ta phải dùng TEXT, ví dụ "=", hoặc ">"

    Thường thì tôi dùng seek đi chung với NoMatch.
     
    #11
  12. Bình_OverAC

    Bình_OverAC Over Abnormal / Crazy

    Bài viết:
    845
    Đã được thích:
    7
    Nơi ở:
    Nha Trang
    Cảm ơn anh Duyệt, bây giờ thì em đã hiểu rồi.

    Hiện giờ em đang dò bằng cách dùng SQL lấy ra một recordset với các record thỏa mản điều kiện search, và làm việc với nó. Cách này hơi :banana: nhưng thây kệ, khi nào có cách hay hơn sẽ làm lại. Cảm ơn các bác. Bác workman giải thích rỏ hơn giúp em cái Seek và NoMatch với và cả Index nữa.
     
    #12
  13. Bình_OverAC

    Bình_OverAC Over Abnormal / Crazy

    Bài viết:
    845
    Đã được thích:
    7
    Nơi ở:
    Nha Trang
    Thưa các bác, em đang tiếp tục làm việc với ADO đây và bây giờ lại là một vướn mắc khác. Bây giờ em lại cần phải update dử liệu đối với record mà em làm việc.

    Mã:
    Recordset.field("field1").value = value1
    Recordset.update
    Thông qua một chuyên gia khác, em được tư vấn là, đối với một số data source không cho phép update và trong đó có Excel. Nhưng bây giờ dữ liệu của em lại nằm trên Excel, biết làm sao bây giờ. Các bác giúp em với.
     
    #13
  14. levanduyet

    levanduyet Welcome

    Bài viết:
    535
    Đã được thích:
    11
    Giới tính:
    Nam
    Nơi ở:
    HCM
    Bình ơi, em lại đi vào "vết xe củ" của anh rồi !!! Tại sao lại phải Excel? Em cứ đưa qua Access đi rồi lọc và đưa lại. Nếu em search "ADO + Excel" thì em sẽ thấy rất nhiều "bug"...vậy anh đề nghị em xuất dữ liệu từ Excel qua Access rồi từ đó mà lọc và xuất về lại Excel nếu em thích Excel. Thật sự ra anh muốn viết bài về vấn đề này nhưng...anh nghĩ không nên!
    Thân,
    LVD
     
    #14
  15. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Khi bạn đã kết nối được với Excel Sheet/Range thông qua Connection thì mọi chuyện gần như là như nhau (Delete/Edit/Addnew,Update...). Tuy nhiên với Excel.xls bạn lưu ý một số vấn đề sau:
    + Khi bạn dùng Update thì file.xls không được mở đồng thời thời bởi Excel, nếu có mở thì không đươc dùng lệnh Save của Excel.
    Ví dụ: Trong Excel bạn mở file Ketoan.xls, trong môi trường VBE bạn dùng ADO và dùng lệnh Update. Lúc này file Ketoan.xls vẫn nhận giá trị, nhưng bạn không nhìm thấy nó vì sự kiện (Event) Change của Excel không nhận. Nếu bạn lại dùng Save của Excel thì Excel chỉ Save những cái mà Event Change của nhận được->Giá trị mà bạn Update không ghi lại, nếu bạn Close lại và không Save thì Ok!
    Tốt nhất là khi đã làm việc với CSDL Excel bằng ADO thì CSDL này không được mở. Lúc đó mọi chuyện diễn ra bình thường.

    + Với ADO, CSDL Excel không cho phép mở đồng thời trên nhiều máy tính.
     
    #15

Chia sẻ trang này