返回列表 上一主題 發帖

[發問] Excel工作表單與Access資料庫的VBA互動問題

回復 14# c_c_lai
2014年機票記錄:
本程式之簽證費用、機票費用的加總計算處理我已經將它
加入了 (利用字典物件的處理),使用者於瞭解 Excel 表單處理、
以及 Access 的資料存取後,便可從程式中將它們予以分開,
而只擷取使用者其本身需求的部分。 目前程式包含 A、B 兩部分:
A、純粹 Excel 工作表單 (本身) 儲存作業,資料儲存於工作表單中;
B、將所有處理資料結果儲存至 Access 資料庫中,方便日後存取作業。

TOP

我將 acdx 大大於 2013-12-11 16:52 提問的
"如何讓ComboBox可以用滑鼠滾動?" 解決方案
加以應用加入到 "簽證內容1"、"簽證內容2"
內,可作為範例引用,如尚有更佳的處理方法
尚請各位大大指教!
2014年機票記錄.rar (84.95 KB)

TOP

本帖最後由 c_c_lai 於 2013-12-26 10:53 編輯

回復 19# JEAN
我就是一時忘了當初是誰提問的,實在
太好了!
當初妳的提問是 "機票",我看了之後便
試著將它改成 工作表單、以及 Access 資料庫
都能執行的方式 (同步示範如何作業)。舉例來說:
如果單純地只想在 Excel 做輸入畫面,儲存時將
資料儲存到  Access 資料庫,那麼便將 Excel "data" 儲存
資料的部分移除,只保留儲存 Access 資料庫的程式碼。
反之、亦然。妳一定會問為何是綜合的,這純粹是為了
測試、及瞭解,如何使用 Excel 應用 ADO 處理資料問題,
以及如何同時處理 Access 資料庫的讀取、查詢、刪除、以及
寫入的語法應用而做出來的範例。所以才將妳當初的提問
均寫在 "機票作業" 、以及 "data" 內之故。如此、亦回復了
工作表單 "機票" 的處裡提問。這麼說明是否解答了妳的問題?

TOP

本帖最後由 c_c_lai 於 2013-12-26 10:50 編輯

回復 19# JEAN
至於 "機票作業"裡面的表格都不能用
請參考附件:
機票記錄明細表.rar (11.43 KB)
機票記錄明細表檔案.rar (17.9 KB)
如果妳那端是開啟 Access MDF 的檔案 (Office 2003) :
  1. Sub OpenDB()
  2.     If ExcelData.Value = True Then    '  [data$]
  3.         Set cnn = CreateObject("ADODB.Connection")
  4.         Set rs = CreateObject("ADODB.Recordset")
  5.         Set cmd = CreateObject("ADODB.Command")
  6.     Else                              '  機票紀錄
  7.         Set cnn = New ADODB.Connection
  8.         Set rs = New ADODB.Recordset
  9.         Set cmd = New ADODB.Command
  10.     End If

  11.     With cnn
  12.         If .State = 1 Then .Close    '  adStateOpen
  13.         
  14.         If ExcelData.Value = True Then
  15.             .ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & _
  16.                                 ActiveWorkbook.Path & Application.PathSeparator & ActiveWorkbook.Name
  17.         Else
  18.             '  .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & _
  19.             '                    ThisWorkbook.Path & Application.PathSeparator & "機票記錄明細表.mdb" & ";"
  20.             '  For Microsoft.ACE.OLEDB.12.0,you need Microsoft Office 12.0 Access Database Engine to be installed.
  21.             .ConnectionString = "Provider=Microsoft.Ace.OLEDB.12.0;" & "Data Source=" & _
  22.                               ThisWorkbook.Path & Application.PathSeparator & "機票記錄明細表檔案.accdb" & ";"
  23.         End If
  24.         .Open
  25.     End With
  26. End Sub
複製代碼
則將上列程式碼之 Else 的部分改成如下:
  1.         Else
  2.            .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & _
  3.                              ThisWorkbook.Path & Application.PathSeparator & "機票記錄明細表.mdb" & ";"
  4.              '  For Microsoft.ACE.OLEDB.12.0,you need Microsoft Office 12.0 Access Database Engine to be installed.
  5.             '   .ConnectionString = "Provider=Microsoft.Ace.OLEDB.12.0;" & "Data Source=" & _
  6.             '                   ThisWorkbook.Path & Application.PathSeparator & "機票記錄明細表檔案.accdb" & ";"
  7.         End If
複製代碼
即可。
此程式碼可以處理 MDF (For Excel 2003) 或者是 ACCDB (For Excel 2007、2010) 等資料庫格式。

TOP

回復 22# JEAN
一、 將 2014年機票記錄.xls、機票記錄明細表.mdb (抑或是 機票記錄明細表檔案.accdb)
     全部都放置於同一目錄下。 例如: 我為了方便測試起見,而將它們全數放在一個名為
     "2014年機票記錄" D 磁碟機的次目錄下。
二、 如果妳那端是開啟 Access MDF 的檔案 (Office 2003),哪麼妳必須先將 21# 所說的
     程式碼 (Else 部分) 先行修正。
     目前我是預設開啟的是 Access ACCDB 的資料庫,如果要使用 Access MDF 的檔案,請將
     ACCDB 的部分予以 Mark 起來,而將原本 Mark 之 MDF 的部分打開 (移除 Mark ' ),
     如此即可使用 MDF 的檔案了。
     (兩種資料庫我都一齊放置於 D:\2014年機票記錄\ 目錄下,以方便測試及觀察資料變化)
三、 點選該次目錄 D:\2014年機票記錄\2014年機票記錄.xls 便可執行。

TOP

回復 22# JEAN

TOP

回復 22# JEAN

TOP

回復  c_c_lai


您好:
謝謝您的機票作業,請問我是否可以改為把名字用選項方式輸入.....然後自動帶入 ...
JEAN 發表於 2013-12-27 13:32

當然可行,只要是 VBA 語法能處裡的,幾乎都有實現之可能。
另外我摘錄了 SQL 一詞的解釋:
結構化查詢語言(Structured Query Language,縮寫為SQL),一種程式語言,用於資料庫中的標準資料查詢語言,IBM公司最早使用在其開發的資料庫系統中。1986年10月,美國國家標準學會(ANSI)對SQL進行規範後,以此作為關聯式資料庫管理系統的標準語言(ANSI X3. 135-1986),1987年得到國際標準組織的支援下成為國際標準。不過各種通行的資料庫系統在其實踐過程中都對SQL規範作了某些編改和擴充。所以,實際上不同資料庫系統之間的SQL不能完全相互通用。
看完了這段說明,你應該便能了解到 SQL 它扮演的只是一般程式語言與資料庫間的一個介面語言。例如:
本程式碼裡的:
  1.     If ExcelData.Value = True Then
  2.         '  strSQL = "Select Distinct [簽證內容] From [簽證項目$] Order by [簽證內容]"
  3.         strSQL = "Select * From [簽證項目$] Order by [簽證內容]"
  4.     Else
  5.         '  strSQL = "Select Distinct 簽證內容 From 簽證項目 Order by 簽證內容"
  6.         strSQL = "Select * From 簽證項目 Order by 簽證內容"
  7.     End If
  8.    
  9.     '  closeRS
  10.     OpenDB
  11.   
  12.     rs.Open strSQL, cnn, 1, 3     '  adOpenKeyset, adLockOptimistic
  13.     If rs.RecordCount > 0 Then
  14.        .
  15.        .
  16.     End If
  17.       .
複製代碼
等與資料庫存取有關語法皆屬之。

TOP

回復 26# JEAN
又、妳說用都不行?
此話怎說?
妳是指直接點選 "機票記錄明細表.mdb" 都無法進入到 Access 嗎?

TOP

本帖最後由 c_c_lai 於 2013-12-27 18:03 編輯

回復 30# JEAN
這個是刪除資料錄的程式碼,
其內容是首先會刪除 Sheets("data") 內對應的被刪除資料,
接著、回頭又繼續去刪除儲存在 Access 的對應的資料,以保持兩者資料同步之故。
首先、妳幫我檢查一項動作:
A、  先勾選  "SQL Data"。然後在 "名字" 欄隨便輸入一名字、如: LuLu。
B、  輸完 LuLu 後,點選 "輸入確定" 按鈕,接著點選 "簽證內容1"、或者是
         "簽證內容2",然後瞧瞧裡面有沒有 "簽證選項",如果答案是 "Yes",
        那便要恭喜妳已找到(連結到) Access 資料庫了。
C、  最後妳才告訴我,妳實際想做的是甚麼?

TOP

        靜思自在 : 【時日莫空過】一個人在世間做了多少事,就等於壽命有多長。因此必須與時間競爭,切莫使時日空過。
返回列表 上一主題