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

  • Thread starter Bình_OverAC
  • Ngày gửi
B

Bình_OverAC

Over Abnormal / Crazy
14/5/04
846
10
18
42
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
 
Khóa học Quản trị dòng tiền
T

Tuanktcdcn

Lão già ham vui
18/6/04
549
52
28
47
Hà Nội
www.bluesofts.net
- 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
 
B

Bình_OverAC

Over Abnormal / Crazy
14/5/04
846
10
18
42
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.
 
levanduyet

levanduyet

Welcome
16/10/04
537
19
18
HCM
my.opera.com
Bình_OverAC nói:
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

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
 
B

Bình_OverAC

Over Abnormal / Crazy
14/5/04
846
10
18
42
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.
 
levanduyet

levanduyet

Welcome
16/10/04
537
19
18
HCM
my.opera.com
Hu hu hu

Bình_OverAC nói:
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.
Để 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
 
T

Tuanktcdcn

Lão già ham vui
18/6/04
549
52
28
47
Hà Nội
www.bluesofts.net
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
 
B

Bình_OverAC

Over Abnormal / Crazy
14/5/04
846
10
18
42
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.
 
levanduyet

levanduyet

Welcome
16/10/04
537
19
18
HCM
my.opera.com
Bình_OverAC nói:
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.
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
 
W

workman

Guest
22/7/05
372
2
0
51
Ho Chi Minh
Bình_OverAC nói:
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.

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.
 
B

Bình_OverAC

Over Abnormal / Crazy
14/5/04
846
10
18
42
Nha Trang
levanduyet nó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à.
Cảm ơn anh Duyệt, bây giờ thì em đã hiểu rồi.

workman nói:
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.

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.
 
B

Bình_OverAC

Over Abnormal / Crazy
14/5/04
846
10
18
42
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.
 
levanduyet

levanduyet

Welcome
16/10/04
537
19
18
HCM
my.opera.com
Bình_OverAC nói:
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.

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
 
T

Tuanktcdcn

Lão già ham vui
18/6/04
549
52
28
47
Hà Nội
www.bluesofts.net
Bình_OverAC nói:
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.

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.
 

Xem nhiều

Webketoan Zalo OA