返回列表 上一主題 發帖

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

本帖最後由 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

回復 21# c_c_lai


您好:

你做的機票作業,做的很好。 ;P
不過我開啟都不能始用....

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

回復 25# c_c_lai


您好:
謝謝您的機票作業,請問我是否可以改為把名字用選項方式輸入.....然後自動帶入"單位"這個欄位。
就像我"機票"裡面的名字....會自動帶入"單位"。

請問SQL是登入到ACCESS的意思嗎??  可是我用都不行~~

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

回復 28# c_c_lai


  您好:

我的意思是說:如果選擇SQL DATA方式 輸入資料....他的儲存明細表應該是在ACCESS吧....可是我開啟ACCESS明細表,必沒有我輸入的資料。

我會想用到ACCESS資料庫裡面是方便查詢,而且可以一直增加年度...譬如明年是2014年用完,我還可以在ACCESS明細表直接在加上2015年度就可以了。

這樣我就不用每年想要如何去做,而且我打算今年把表格搞定好把所有的缺點和優點整合出來。  以後也可以提供其他網友做使用。  

另外真的很感謝 c_c_lai 幫助才能完成表格。

TOP

回復  c_c_lai


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


Private Sub DeleteData_Click()
    Dim nCode As Range, ret As Boolean
   
    With Sheets("data")
        Set nCode = .[B:B].Find(CallID.Text, , , 1)
        .Rows(Val(Mid(nCode.Address, 4))).EntireRow.Delete Shift:=xlUp
    End With
   
    ret = ExcelData.Value
    ExcelData.Value = False
   
    closeRS
    OpenDB
   
    strSQL = "DELETE FROM 機票記錄 WHERE 名字 = '" & CallID.Text & "'"
    cmd.CommandText = strSQL
   
    cmd.ActiveConnection = cnn
    cmd.Execute
    cnn.Close
   
    Confirm.Enabled = True
    ExcelData.Value = ret
    ResetData_Click
End Sub


請問是改這邊嗎?

TOP

        靜思自在 : 並非有錢魷是快樂,問心無愧心最安。
返回列表 上一主題