把數據表中對應工作表的數據首先刪除,然後導入數據

數據庫 Excel 跳槽那些事兒 VBA專家 2019-06-30

大家好,我們今日繼續講解VBA數據庫解決方案的第28講內容:利用VBA,把數據表中對應工作表的數據首先刪除,然後向數據表中導入工作表數據。數據庫的講解已經持續一段時間了,從對簡單數據庫的認識到利用VBA對數據庫的操作,我們一步步的走來,估計大家已經學到了很多知識。最近的內容主要是操作,我把我可能想到的各種情況給大家介紹講解,這些都是我們在實際的工作中會遇到的情況,只要大家掌握了代碼,並結合一下自己的工作實際,很快就會寫出自己的代碼。當然要想改代碼必須對代碼有全面的理解。

今日給大家講的情況是:數據庫錄入錯了,但關鍵的字段沒有錯誤,這時我們怎麼處理呢?這時的處理方案是:首先要刪除之前錄入的數據,然後修改數據並再次錄入。

實例:我們在錄入員工信息時,不小心把民族給錄入錯誤,如下面的工作表:

把數據表中對應工作表的數據首先刪除,然後導入數據

第2行到第5行,人員的民族應該為漢,不小心錄入了回族,這時改怎麼處理呢?這就是我這節要面對的解決方案:先刪除,再導入正確的。怎麼做到呢:看下面的代碼:

Sub mynzCreateDataTable_6() '第28講利用VBA,根據工作表的數據,在數據表中先刪除已有的數據,然後添加記錄

Dim cnADO, rsADO As Object

Dim strPath, strTable, strWhere, strSQL, strMsg As String

Set cnADO = CreateObject("ADODB.Connection")

Set rsADO = CreateObject("ADODB.Recordset")

strPath = ThisWorkbook.Path & "\mydata2.accdb"

strTable = "員工信息"

cnADO.Open "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & strPath

'彙報給用戶記錄數

strSQL = "SELECT * FROM " & strTable

rsADO.Open strSQL, cnADO, 1, 3

MsgBox "當前記錄數為:" & rsADO.RecordCount

rsADO.Close

'打開數據表中存在的員工編號相同的記錄

strSQL = "DELETE FROM " & strTable & " A WHERE EXISTS(" _

& "SELECT * FROM [Excel 12.0;Database=" & _

ThisWorkbook.FullName & "].[" & ActiveSheet.Name & "$" _

& Range("a1").CurrentRegion.Address(0, 0) & "] " _

& "WHERE 員工編號=A.員工編號)"

cnADO.Execute strSQL '把這些記錄刪除

'下面將添加記錄

strSQL = "INSERT INTO " & strTable & " SELECT * FROM [Excel 12.0;Database=" _

& ThisWorkbook.FullName & ";].[" & ActiveSheet.Name & "$" _

& Range("A1").CurrentRegion.Address(0, 0) & "]"

cnADO.Execute strSQL

MsgBox "紀錄添加成功。", vbInformation, "添加紀錄"

'彙報給用戶記錄數

strSQL = "SELECT * FROM " & strTable

rsADO.Open strSQL, cnADO, 1, 3

MsgBox "最後的記錄數為:" & rsADO.RecordCount

'釋放內存

rsADO.Close

cnADO.Close

Set rsADO = Nothing

Set cnADO = Nothing

End Sub

代碼截圖:

把數據表中對應工作表的數據首先刪除,然後導入數據

代碼解讀:代碼共分三部分,第一部分仍是建立連接記錄集一直到MsgBox "當前記錄數為:" & rsADO.RecordCount 後關閉了記錄集的連接,這部分和前幾講的內容是一致的,不再過多的講解,

第二部分:

'打開數據表中存在的員工編號相同的記錄

strSQL = "DELETE FROM " & strTable & " A WHERE EXISTS(" _

& "SELECT * FROM [Excel 12.0;Database=" & _

ThisWorkbook.FullName & "].[" & ActiveSheet.Name & "$" _

& Range("a1").CurrentRegion.Address(0, 0) & "] " _

& "WHERE 員工編號=A.員工編號)"

cnADO.Execute strSQL '把這些記錄刪除

'下面將添加記錄

strSQL = "INSERT INTO " & strTable & " SELECT * FROM [Excel 12.0;Database=" _

& ThisWorkbook.FullName & ";].[" & ActiveSheet.Name & "$" _

& Range("A1").CurrentRegion.Address(0, 0) & "]"

cnADO.Execute strSQL

MsgBox "紀錄添加成功。", vbInformation, "添加紀錄"

這部分中,先要打開已經有的記錄,然後刪除,接著,在此導入正確的記錄。我們要理解的是:strSQL = "DELETE FROM " & strTable & " A WHERE EXISTS(" _

& "SELECT * FROM [Excel 12.0;Database=" & _

ThisWorkbook.FullName & "].[" & ActiveSheet.Name & "$" _

& Range("a1").CurrentRegion.Address(0, 0) & "] " _

& "WHERE 員工編號=A.員工編號)"

這條SQL語句的意思是刪除一些記錄,什麼記錄呢?就是在數據表strTable中兩者員工編號相同的記錄。然後,ADO 執行SQL命令:cnADO.Execute strSQL 。

在此導入記錄就相對簡單了:同樣

strSQL = "INSERT INTO " & strTable & " SELECT * FROM [Excel 12.0;Database=" _

& ThisWorkbook.FullName & ";].[" & ActiveSheet.Name & "$" _

& Range("A1").CurrentRegion.Address(0, 0) & "]"

然後執行。

這裡我們介紹一下Execute命令和INSERT INTO 命令的意義:

1.Execute 方法可以執行指定SQL 語句.

2 INSERT INTO 語句用於向表格中插入新的行。

第三部分的代碼是從彙報給用戶記錄數,同時要釋放內存。這部分就不再多說了。

下面看看我們程序的運行情況:

我們首先修正EXCEL工作表中的記錄為正確的值:

把數據表中對應工作表的數據首先刪除,然後導入數據

然後運行,首先會提示當前的記錄數:

把數據表中對應工作表的數據首先刪除,然後導入數據

然後,後臺刪除記錄,添加記錄,提示給我們:

把數據表中對應工作表的數據首先刪除,然後導入數據

最後反饋處理完成的記錄:

把數據表中對應工作表的數據首先刪除,然後導入數據

我們這時可以再看看數據庫中的記錄,點擊:

把數據表中對應工作表的數據首先刪除,然後導入數據

可以看到我們修改完成。

今日內容迴向:

1 如何修改已經存在的記錄?

2 除了上述方案,完成本講的內容,你是否還有其他的方案?

相關推薦

推薦中...