大家好,我們今日繼續講解VBA資料庫解決方案的第24講內容:利用VBA,把工作表中提供的數據在數據表中刪除。在上一講中,我們講了利用rsADO.addnew 和 rsADO.Update 語句實現在數據表添加記錄的方法,今日我們講解,如何在記錄集中刪除記錄。也是在有重複記錄的數據表中刪除記錄的方法,如果有重複的數據將一併刪除。
實例:我們仍是利用之前的資料庫中的數據進行處理,數據如下:
我們要把上面3月份的記錄要全部刪除,為什麼要刪除呢?或許是我們是錄入錯誤吧,也或許是數據需要重新再確認,總之我們要刪除這些已經錄入的記錄,好在我們在ECXEL表格中還有這些記錄,需要按這些記錄來刪除數據表中的記錄。也許在職場中的你很熟悉上述的場景吧。
下面是EXCEL工作表中還存在的記錄:
下面我們就解決如何刪除這些記錄,代碼如下:
Sub mynzCreateDataTable_2() ' 第24講利用VBA把工作表中提供的數據在數據表中刪除
Dim cnADO As New ADODB.Connection
Dim rsADO As ADODB.Recordset
Dim strPath, strSQL, strTable As String
strPath = ThisWorkbook.Path & "\mydata2.accdb"
strTable = "19年銷售情況"
cnADO.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath
strSQL = "SELECT * FROM " & strTable
Set rsADO = New ADODB.Recordset
rsADO.Open strSQL, cnADO, 1, 3
'匯報給用戶記錄數
MsgBox "刪除前記錄數為:" & rsADO.RecordCount
Sheets("Sheet4").Select
'刪除記錄
t = 2
Do While Cells(t, 1) <> ""
GG = ""
rsADO.MoveFirst
For m = 1 To rsADO.RecordCount
SC = ""
For i = 0 To rsADO.Fields.Count - 1
If rsADO.Fields(i) = Sheets("Sheet4").Cells(t, i + 1) Then
SC = SC & "OK"
Else
SC = SC & "NOT"
End If
Next i
If InStr(SC, "NOT") = 0 Then
rsADO.Delete
rsADO.Update
GG = "OK"
End If
rsADO.MoveNext
Next m
If GG <> "OK" Then MsgBox "第" & t & "行數據沒有找到,無法刪除"
t = t + 1
Loop
'匯報給用戶最後的記錄數
MsgBox "刪除後記錄數為:" & rsADO.RecordCount
rsADO.Close
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
End Sub
代碼截圖:
代碼講解:
1 Dim cnADO As New ADODB.Connection
Dim rsADO As ADODB.Recordset
Dim strPath, strSQL, strTable As String
strPath = ThisWorkbook.Path & "\mydata2.accdb"
strTable = "19年銷售情況"
cnADO.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath
strSQL = "SELECT * FROM " & strTable
Set rsADO = New ADODB.Recordset
rsADO.Open strSQL, cnADO, 1, 3
'匯報給用戶記錄數
MsgBox "刪除前記錄數為:" & rsADO.RecordCount
Sheets("Sheet4").Select
仍是用前期綁定的方法建立ADO,打開連接和記錄集
2 t = 2
Do While Cells(t, 1) <> ""
rsADO.MoveFirst
For m = 1 To rsADO.RecordCount
SC = ""
GG = ""
For i = 0 To rsADO.Fields.Count - 1
If rsADO.Fields(i) = Sheets("Sheet4").Cells(t, i + 1) Then
SC = SC & "OK"
Else
SC = SC & "NOT"
End If
Next i
If InStr(SC, "NOT") = 0 Then
rsADO.Delete
rsADO.Update
GG = "OK"
End If
rsADO.MoveNext
Next m
If GG <> "OK" Then MsgBox "第" & t & "行數據沒有找到,無法刪除"
t = t + 1
Loop
上述代碼中,用t記錄了當前工作表的行數,一直循環到空值出現,然後,針對每一行的數據,在數據表中校驗,如果完成相同,那麼刪除,如何判斷呢,我們用了兩個標識,一個是SC,如果每個值都相同,那麼SC中不會出現「NOT」,在最後我們判斷SC中如果沒有「NOT」,那麼我們刪除,否則向下運行。而GG的標識則是提示是否有數據沒有找到,如果沒有找到,那麼提示某行沒有找到。
在刪除數據的時候用了
rsADO.Delete
rsADO.Update
這是刪除某個數據常用的方法。
3 '匯報給用戶最後的記錄數
MsgBox "刪除後記錄數為:" & rsADO.RecordCount
rsADO.Close
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
在最後提示給用戶刪除的結果並釋放內存。
下面看我們程序的運行:
首先會提示當前數據的數量:
如果沒有找到數據,則有提示:
我們增加後最後一行的測試:
最後會提示有一條沒有刪除:
今日內容回向:
1 如何刪除記錄集中的數據?
2 如何根據工作表中提供的數據刪除數據表中的數據?