Đố vui về ADO, DAO.

Liên hệ QC
Xin hỏi các bạn là dùng cách nào để có thể xoá toàn bộ dữ liệu của tất cả các sheet ở 1 file nào đó mà không mở file đó không?
 
Trong trường hợp muốn lấy giá trị cao nhất của cột STT thì bạn có thể dùng
"select top 1 stt From [Data$] order by stt desc"

Khi trường cần select khác với trường dùng để sắp xếp thì người ta mới dùng từ chọn TOP

Mã:
"select top 1 caiGiDo From [Data$] order by stt desc"

Khi chỉ cần tìm giá trị lớn nhất thì dùng hàm MAX

Mã:
Select MAX(stt) From [Data$]
 
Xin hỏi các bạn là dùng cách nào để có thể xoá toàn bộ dữ liệu của tất cả các sheet ở 1 file nào đó mà không mở file đó không?

Vọc mãi mà không hiểu sao câu lệnh .DELTE toàn bị lỗi ISAM --> nản , thôi đành dùng cách "chuối củ " này vậy,!<---- +-+-+-++-+-+-+
[GPECODE=vb]
Sub DELETE()
'On Error Resume Next
Dim cnn As Object, lsSQL As String, lrs As Object, Fld As Object
Dim i As Long
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\B.xls" & _
";Extended Properties=Excel 8.0;"

.Open

End With
With lrs
.Open "SELECT * FROM [DATA$]", cnn, 3, 3
.MoveFirst
Do While Not .EOF
For Each Fld In .Fields
Fld.Value = Null
Next Fld
.MoveNext
Loop
End With
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub
[/GPECODE]
lấy luôn dữ liệu file A.xls và file B.xls của câu hỏi bài trước để test!
ặc quên chưa HDR=No,IMEX = 1 ,! <----bác nào test thì nhớ bổ sung nhé!
 
Vọc mãi mà không hiểu sao câu lệnh .DELTE toàn bị lỗi ISAM --> nản , thôi đành dùng cách "chuối củ " này vậy,!<---- +-+-+-++-+-+-+
[GPECODE=vb]
Sub DELETE()
'On Error Resume Next
Dim cnn As Object, lsSQL As String, lrs As Object, Fld As Object
Dim i As Long
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\B.xls" & _
";Extended Properties=Excel 8.0;"

.Open

End With
With lrs
.Open "SELECT * FROM [DATA$]", cnn, 3, 3
.MoveFirst
Do While Not .EOF
For Each Fld In .Fields
Fld.Value = Null
Next Fld
.MoveNext
Loop
End With
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub
[/GPECODE]
lấy luôn dữ liệu file A.xls và file B.xls của câu hỏi bài trước để test!
ặc quên chưa HDR=No,IMEX = 1 ,! <----bác nào test thì nhớ bổ sung nhé!
Lại dùng chiêu "ngoại đạo", câu hỏi là xoá toàn bộ dữ liệu của tất cả các sheet ở 1 file nào đó, nếu như dữ liệu nhiều thì duyệt qua từng dòng thì sẽ rất chậm, ít ra cũng phải dùng giống như bài #118 , nhưng sẽ còn cách nữa phải không các bạn?
 
Lần chỉnh sửa cuối:
Xin hỏi các bạn là dùng cách nào để có thể xoá toàn bộ dữ liệu của tất cả các sheet ở 1 file nào đó mà không mở file đó không?
Để giải bài này em lại đi giải xóa toàn bộ dữ liệu của 1 Sheet nhưng vẫn chưa được. Vậy anh có thể giúp câu lệnh xóa toàn bộ dữ liệu sheet "tb1", file A.xls được không? Em đang nghỉ đến UPDATE toàn bộ thành Null nhưng vẫn chưa được
Xin cảm ơn anh
 
Để giải bài này em lại đi giải xóa toàn bộ dữ liệu của 1 Sheet nhưng vẫn chưa được. Vậy anh có thể giúp câu lệnh xóa toàn bộ dữ liệu sheet "tb1", file A.xls được không? Em đang nghỉ đến UPDATE toàn bộ thành Null nhưng vẫn chưa được
Xin cảm ơn anh

Nếu Update thì Anh nghiên cứu kỹ bài #118 là làm được.
 
Nếu Update thì Anh nghiên cứu kỹ bài #118 là làm được.

Hix em cũng vọc vụ Update này từ sáng mà chưa xong:
Nếu mà 1 File không biết vùng dữ liệu ở đâu, tên tuổi như thế nào ? thì có 2 vấn đề em đang vướng như sau :
*không thể dùng HDR = Yes đươc
* Không lẽ lại liệt kê từ f1,.....fn , ( cái này cũng không đúng, nhỡ dữ liệu nó chỉ năm từ fm đến fn ) thì sao ?
-->^^ anh thử gợi ý vụ update này thêm được không ?
 
Hix em cũng vọc vụ Update này từ sáng mà chưa xong:
Nếu mà 1 File không biết vùng dữ liệu ở đâu, tên tuổi như thế nào ? thì có 2 vấn đề em đang vướng như sau :
*không thể dùng HDR = Yes đươc
* Không lẽ lại liệt kê từ f1,.....fn , ( cái này cũng không đúng, nhỡ dữ liệu nó chỉ năm từ fm đến fn ) thì sao ?
-->^^ anh thử gợi ý vụ update này thêm được không ?

Nếu không biết bao nhiêu cột thì mình lấy tên cột, đưa tên cột đó vào 1 chuổi truy vấn là được. Nhưng hướng này hơi khó và mất thời gian chạy hơn. Bạn thử nhé.
 
Nếu không biết bao nhiêu cột thì mình lấy tên cột, đưa tên cột đó vào 1 chuổi truy vấn là được. Nhưng hướng này hơi khó và mất thời gian chạy hơn. Bạn thử nhé.

Em thấy vừa khó, vừa khoai, vừa khó nhai hix --> anh test thử xem cách dùng UPDATE để xoá em viết đã ok chưa ?
[GPECODE=vb]
Sub DELETE()
'On Error Resume Next
Dim cnn As ADODB.Connection, rsSchema As ADODB.Recordset, rst As ADODB.Recordset
Dim source As String, TableName As String
Dim i As Long, szFld As String
Set cnn = New ADODB.Connection
source = Application.GetOpenFilename
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & source & _
";Extended Properties=""Excel 8.0;HDR=No;"";"

.Open
End With
Set rst = New ADODB.Recordset
Set rsSchema = cnn.OpenSchema(adSchemaTables)
While Not rsSchema.EOF
TableName = rsSchema.Fields("TABLE_NAME").Value
With rst
.Open "SELECT * FROM [" & TableName & "]", cnn, 3, 3
For i = 1 To .Fields.Count
szFld = szFld & " F" & i & "= Null"
Next
.Close
End With
rst.Open "UPDATE [" & TableName & "] SET " & Replace(Trim(szFld), " ", ", "), cnn, 3, 1
rsSchema.MoveNext
szFld = vbNullString
Wend
rsSchema.Close: Set rsSchema = Nothing: Set rst = Nothing
cnn.Close: Set cnn = Nothing
End Sub
[/GPECODE]
ps: còn cách thứ 2 không dùng update , ^^ anh phải gợi ý thêm 1 ít thì em mới có hướng để đi , không thì cũng bó tay -+*/
 
Em thấy vừa khó, vừa khoai, vừa khó nhai hix --> anh test thử xem cách dùng UPDATE để xoá em viết đã ok chưa ?
[GPECODE=vb]
Sub DELETE()
'On Error Resume Next
Dim cnn As ADODB.Connection, rsSchema As ADODB.Recordset, rst As ADODB.Recordset
Dim source As String, TableName As String
Dim i As Long, szFld As String
Set cnn = New ADODB.Connection
source = Application.GetOpenFilename
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & source & _
";Extended Properties=""Excel 8.0;HDR=No;"";"

.Open
End With
Set rst = New ADODB.Recordset
Set rsSchema = cnn.OpenSchema(adSchemaTables)
While Not rsSchema.EOF
TableName = rsSchema.Fields("TABLE_NAME").Value
With rst
.Open "SELECT * FROM [" & TableName & "]", cnn, 3, 3
For i = 1 To .Fields.Count
szFld = szFld & " F" & i & "= Null"
Next
.Close
End With
rst.Open "UPDATE [" & TableName & "] SET " & Replace(Trim(szFld), " ", ", "), cnn, 3, 1
rsSchema.MoveNext
szFld = vbNullString
Wend
rsSchema.Close: Set rsSchema = Nothing: Set rst = Nothing
cnn.Close: Set cnn = Nothing
End Sub
[/GPECODE]
ps: còn cách thứ 2 không dùng update , ^^ anh phải gợi ý thêm 1 ít thì em mới có hướng để đi , không thì cũng bó tay -+*/
Kết quả như mong đợi, còn cách không dùng update thì nếu gợi ý là ra liền, nên không thể gợi ý :), bạn chịu khó chút nữa là được.

P/s: Trình độ ADO của bạn càng lúc càng thâm hậu rồi đó.
 
Cái này có thấy qua lâu lắm rồi. Bây giờ lười tìm lại quá. Hình như là dùng lệnh DROP thì phải.

Nhớ mang máng có vụ cãi vả về lệnh này. Theo tiêu chuẩn thì lệnh bôi dữ liệu table của SQL là TRUNCATE, trong khi đó lệnh DROP TABLE sẽ xoá cả table luôn. Nhưng cụ Excel engine làm việc ngược ngạo, không cho dùng lệnh truncate, và lệnh drop của cụ chỉ bôi dữ liệu chứ không xoá sheet.
 
Kết quả như mong đợi, còn cách không dùng update thì nếu gợi ý là ra liền, nên không thể gợi ý :), bạn chịu khó chút nữa là được.

P/s: Trình độ ADO của bạn càng lúc càng thâm hậu rồi đó.
ado ko được em định dùng DAO, query delete xem có được ko? Nhưng máy em 64bits >ko hiểu sao ko chạy được DAO 3.6,nên em chưa test được? Toàn báo lỗi run time. 46,nản đi ngủ luôn!
 
Cái này có thấy qua lâu lắm rồi. Bây giờ lười tìm lại quá. Hình như là dùng lệnh DROP thì phải.

Nhớ mang máng có vụ cãi vả về lệnh này. Theo tiêu chuẩn thì lệnh bôi dữ liệu table của SQL là TRUNCATE, trong khi đó lệnh DROP TABLE sẽ xoá cả table luôn. Nhưng cụ Excel engine làm việc ngược ngạo, không cho dùng lệnh truncate, và lệnh drop của cụ chỉ bôi dữ liệu chứ không xoá sheet.

Chính xác là phải dùng DROP TABLE trong trường hợp này.
 
Chính xác là phải dùng DROP TABLE trong trường hợp này.

Theo gợi ý của anh : em đưa ra lời giải như sau :
[GPECODE=vb]
Sub DELETE()
Dim rsSchema As ADODB.Recordset
Dim FileName As String, TableName As String
FileName = Application.GetOpenFilename(",*.xls")
With New ADODB.Connection
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & FileName & _
";Extended Properties=""Excel 12.0;HDR=No;"";"
.Open
Set rsSchema = .OpenSchema(adSchemaTables)
While Not rsSchema.EOF
TableName = rsSchema.Fields("TABLE_NAME").Value
.Execute " DROP TABLE [" & TableName & "]"
rsSchema.MoveNext
Wend
.Close
End With
End Sub
[/GPECODE]
 
Lần chỉnh sửa cuối:
Chính xác là phải dùng DROP TABLE trong trường hợp này.
Nếu xác định tên Table để xóa dùng DAO thì với Excell 2003 là
[GPECODE=vb]Sub DELETE_DAO_2003()
Dim db As DAO.Database
Dim tdf As TableDef
Dim t As ADOX.Table
Dim FileName As String, TableName As String
FileName = Application.GetOpenFilename(",*.xls")
Set cnn = New ADODB.Connection
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & FileName & _
";Extended Properties=""Excel 8.0;HDR=no;"";"
.Open

Set db = OpenDatabase(FileName, False, True, "Excel 8.0;")
For Each tdf In db.TableDefs
.Execute " DROP TABLE [" & tdf.Name & "]"
Next
Set db = Nothing
.Close
End With
End Sub[/GPECODE]
Kết quả chạy tốt. Nhưng với Excel 2010 là
[GPECODE=vb]Sub DELETE_DAO_2010()
Dim db As DAO.Database
Dim tdf As TableDef
Dim t As ADOX.Table
Dim FileName As String, TableName As String
FileName = Application.GetOpenFilename(",*.xlsx")
Set cnn = New ADODB.Connection
With cnn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & FileName & _
";Extended Properties=""Excel 12.0;HDR=No;"";"
.Open

Set db = OpenDatabase(FileName, False, True, "Excel 12.0;")
For Each tdf In db.TableDefs
.Execute " DROP TABLE [" & tdf.Name & "]"
Next
Set db = Nothing
.Close
End With
End Sub[/GPECODE]
Bào lỗi lại dòng Set db = OpenDatabase(FileName, False, True, "Excel 12.0;")
LoiDAO.JPG
Vậy xin hỏi các anh chi phải sửa câu lênh trên như thế nào. Em xin cảm ơn
 
Lần chỉnh sửa cuối:
N
Bào lỗi lại dòng Set db = OpenDatabase(FileName, False, True, "Excel 12.0;")

Vậy xin hỏi các anh chi phải sửa câu lênh trên như thế nào. Em xin cảm ơn

Hôm trước dùng DAO trên Excel 2010, tôi thấy chẳng cần phải sửa lại dòng này, cứ để "Excel 8.0;" nó vẫn chạy
Bạn thử để nguyên vậy xem thế nào
Set db = OpenDatabase(FileName, False, True, "Excel 8.0;")
 
Hôm trước dùng DAO trên Excel 2010, tôi thấy chẳng cần phải sửa lại dòng này, cứ để "Excel 8.0;" nó vẫn chạy
Bạn thử để nguyên vậy xem thế nào
Set db = OpenDatabase(FileName, False, True, "Excel 8.0;")
Nếu như vậy thì nó lỗi như sau Sư phụ ạ
LoiEX2010.JPG
 
Ví dụ tôi có 2 Workbook A.xls và B.xls, làm thế nào ở WB A.xls tôi có thể ghi dữ liệu vào WB B.xls như hình bên dưới.

WB A.xls:

2.jpg

WB B.xls

3.jpg

Xin cảm ơn.
 

File đính kèm

  • ChuyenDL.rar
    15.1 KB · Đọc: 35
Lần chỉnh sửa cuối:
Nhưng với Excel 2010 là
[GPECODE=vb]Sub DELETE_DAO_2010()
Dim db As DAO.Database
Dim tdf As TableDef
Dim t As ADOX.Table
Dim FileName As String, TableName As String
FileName = Application.GetOpenFilename(",*.xlsx")
Set cnn = New ADODB.Connection
With cnn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & FileName & _
";Extended Properties=""Excel 12.0;HDR=No;"";"
.Open

Set db = OpenDatabase(FileName, False, True, "Excel 12.0;")
For Each tdf In db.TableDefs
.Execute " DROP TABLE [" & tdf.Name & "]"
Next
Set db = Nothing.Close
End With
End Sub[/GPECODE]
Bào lỗi lại dòng Set db = OpenDatabase(FileName, False, True, "Excel 12.0;")
View attachment 103235
Vậy xin hỏi các anh chi phải sửa câu lênh trên như thế nào. Em xin cảm ơn

Anh chỉ cần chỉnh Excel 12.0 thành Excel 8.0 là được.

Mã:
Set db = OpenDatabase(FileName, False, True, "Excel 8.0;")
 
Web KT

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

Back
Top Bottom