返回列表 上一主題 發帖

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

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

TOP

回復 13# ML089
之前曾經將 Excel 檔案上傳放置於 Google Chrome 個人檔案紀錄內,
提供多位作業人員隨時記錄及修正,記憶中好像也不曾有發生異狀隻情事。

以往在職前實作的資料處理,幾乎都記錄於 Clipper, MS SQL、
以及 PostgreSQL 上。因極少接觸 Office所以只有在練習時才
會去試圖操作 Access,但不是很熟。
其實資料庫的作業處理模式都是很雷同的,很容易舉一反三。。

2014年機票記錄.rar (79.06 KB)

TOP

回復 12# c_c_lai


謝謝你,說明的很清楚。(PS 我記得上次我已經回覆過,我好像有老人癡呆症了 哈哈)

EXCEL資料多人同時使用的介紹很少,或應該用ACCESS吧
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復  c_c_lai

我發現stillfish00大真得很細心,上次timer的事也是他幫忙的

我想問 使用ACCESS 資料 ...
ML089 發表於 2013-12-11 09:33

以往早期 dBase/dBaseII 在資料存取時,需考慮多使用者 (Multi User) 之資料存取的鎖定與釋放,
以避免檔案被鎖死 (Dead Lock),後期演變的 Access/Clipper 等資料庫在 I/O 上已有改進及處理。
且都遵行 ANSI SQL 的標準規範。所以目前一般程式人員 (Programmer) 均有一共識,即在處理
有關資料庫作業,一執行完畢,便隨手關閉資料庫。如此,塞車的瓶頸問題便行而降低。   
現今要考量的,是資料的實際能處理儲存量的多寡,索引的執行速度,最大的儲存資料筆數等。
為何有些企業會去考量採用 MS SQL、更勝者會去評估 PosgreSQL、MySQL、Informix、InterBase、
Oracle 等知名專業資料庫研發廠商,亦是此道理。
也真謝謝 stillfish00大大,他真得很細心,這也許是當局者迷吧!

TOP

回復 10# c_c_lai

我發現stillfish00大真得很細心,上次timer的事也是他幫忙的

我想問 使用ACCESS 資料檔時,可以多人同時存取嗎?(突然想起以前用DBASE的一些資料鎖定存取問題,問得有點籠統請勿介意)

我跑一些結構分析,以前是看TXT檔,現在也多了ACCESS的MDB可以使用,看到你這篇讓我在想使用MDB處理會比TXT檔存取快嗎?
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 9# stillfish00
太感謝你了!我原本一直在找原因(百思不解),
但千想萬想就是沒注意到一字之差 (紀 -> 記),
再次言謝,本程式終於能於 Office 2003、
Office 2007、2010 順利地自如作業了。

TOP

回復 1# c_c_lai
accdb 中,表單名稱變了所以查不到,
機票記錄<>機票紀錄。

TOP

將data放在Access,為何不直接在Access完成?
aa7551 發表於 2013-12-9 18:34

我之所以要同時處裡 Excel 工作表單與 Access 資料庫的道理是希望
竊由此範例去讓人了解、應用、透過 ADO 如何去處理工作表單與
Access 資料庫的實作。
這原本是一位網友的提問,想透過這個議題讓她了解兩造的處理方式,
並同時能去理解如何處理雙工的作業。

TOP

將data放在Access,為何不直接在Access完成?

TOP

回復 5# c_c_lai
  1. Private Sub DeleteData_Click()
  2.     Dim nCode As Range, ret As Boolean
  3.    
  4.     With Sheets("data")
  5.         Set nCode = .[B:B].Find(CallID.Text, , , 1)
  6.         .Rows(Val(Mid(nCode.Address, 4))).EntireRow.Delete Shift:=xlUp
  7.     End With
  8.    
  9.     ret = ExcelData.Value
  10.     ExcelData.Value = False
  11.    
  12.     closeRS
  13.     OpenDB
  14.    
  15.     strSQL = "DELETE FROM 機票紀錄 WHERE 名字 = '" & CallID.Text & "'"
  16.     cmd.CommandText = strSQL
  17.    
  18.     cmd.ActiveConnection = cnn
  19.     cmd.Execute
  20.     cnn.Close
  21.    
  22.     Confirm.Enabled = True
  23.     ExcelData.Value = ret
  24.     ResetData_Click
  25. End Sub

  26. Sub ResetData_Click()
  27.     CallID.Text = ""
  28.     RecordExisted.Caption = ""
  29.     Confirm.Enabled = True
  30.     DataCear
  31. End Sub

  32. Private Sub DataCear()
  33.     DeptNo.Text = ""
  34.     DateTime.Text = ""
  35.     CreditDate.Text = ""
  36.     License1.Text = ""
  37.     LicenseFee1.Text = "0"
  38.     License2.Text = ""
  39.     LicenseFee2.Text = "0"
  40.     cabin.Text = ""
  41.     ticketfee.Text = "0"
  42.     totalfee.Text = "0"
  43.     routinefrom.Text = ""
  44.     routineto.Text = ""
  45.     contents.Text = ""
  46.     remarks.Text = ""
  47. End Sub

  48. Private Sub SaveData_Click()
  49.     Dim totalRows As Long, ret As Boolean
  50.     Dim nCode As Range
  51.    
  52.     ret = ExcelData.Value
  53.     ExcelData.Value = True
  54.             
  55.     With Sheets("data")
  56.         '  寫入 Sheets("data")
  57.         If editMode = True Then
  58.             Set nCode = Sheets("data").[B:B].Find(CallID.Text, , , 1)
  59.             
  60.             With nCode
  61.                 .Offset(, -1) = DeptNo.Text
  62.                 .Offset(, 2) = CreditDate.Text
  63.                 .Offset(, 3) = routinefrom.Text
  64.                 .Offset(, 4) = routineto.Text
  65.                 .Offset(, 5) = contents.Text
  66.                 .Offset(, 6) = cabin.Text
  67.                 .Offset(, 7) = License1.Text
  68.                 .Offset(, 8) = LicenseFee1.Text
  69.                 .Offset(, 9) = License2.Text
  70.                 .Offset(, 10) = LicenseFee2.Text
  71.                 .Offset(, 11) = ticketfee.Text
  72.                 .Offset(, 12) = totalfee.Text
  73.                 .Offset(, 13) = remarks.Text
  74.             End With
  75.         Else
  76.             With Sheets("data")
  77.                 strSQL = "SELECT * FROM [data$] WHERE [名字] ='" & CallID.Text & "'"
  78.             
  79.                 '  Now extract data
  80.                 closeRS
  81.                 OpenDB
  82.                
  83.                 rs.Open strSQL, cnn, 1, 3     '  adOpenKeyset, adLockOptimistic
  84.                
  85.                 If rs.RecordCount = 0 Then  ' 先判斷資料是否已經存在,如果不存在,則 ...
  86.                     Set nCode = .Range("B" & .Range("B" & Rows.Count).End(xlUp).Row + 1)
  87.                     
  88.                     With nCode
  89.                         .Offset(, 0) = CallID.Text
  90.                         .Offset(, -1) = DeptNo.Text
  91.                         .Offset(, 1).NumberFormat = "m/d/yyyy hh:mm:ss"
  92.                         .Offset(, 1) = Format(DateTime.Text, "m/d/yyyy hh:mm:ss")
  93.                         .Offset(, 2) = CreditDate.Text
  94.                         .Offset(, 3) = routinefrom.Text
  95.                         .Offset(, 4) = routineto.Text
  96.                         .Offset(, 5) = contents.Text
  97.                         .Offset(, 6) = cabin.Text
  98.                         .Offset(, 7) = License1.Text
  99.                         .Offset(, 8) = LicenseFee1.Text
  100.                         .Offset(, 9) = License2.Text
  101.                         .Offset(, 10) = LicenseFee2.Text
  102.                         .Offset(, 11) = ticketfee.Text
  103.                         .Offset(, 12) = totalfee.Text
  104.                         .Offset(, 13) = remarks.Text
  105.                     End With
  106.                 End If
  107.             End With
  108.         End If
  109.         
  110.         ExcelData.Value = False
  111.         '  Now extract data
  112.         closeRS
  113.         OpenDB
  114.             
  115.         '  寫入 Access 資料庫
  116.         If editMode = True Then
  117.             strSQL = "Update 機票紀錄 SET 名字 = '" & CallID.Text & "', 單位 = '" & DeptNo.Text & _
  118.                      "', 刷卡日期 = '" & CreditDate.Text & "', 行程日期從 = '" & routinefrom.Text & _
  119.                      "', 行程日期到 = '" & routineto.Text & "', 行程內容 = '" & contents.Text & _
  120.                      "', 艙等 = '" & cabin.Text & "', 簽證內容1 = '" & License1.Text & "', 簽證費用1 = " & _
  121.                      LicenseFee1.Text & ", 簽證內容2 = '" & License2.Text & "', 簽證費用2 = " & LicenseFee2.Text & _
  122.                      ", 機票費用 = " & ticketfee.Text & ", 總計 = " & totalfee.Text & ", 備註 = '" & _
  123.                      remarks.Text & "' WHERE 名字 = '" & CallID.Text & "';"
  124.         Else
  125.             strSQL = "INSERT INTO 機票紀錄 (單位,名字,日期,刷卡日期,行程日期從,行程日期到,行程內容," & _
  126.                      "艙等,簽證內容1,簽證費用1,簽證內容2,簽證費用2,機票費用,總計,備註) VALUES ('" & DeptNo.Text & "','" & _
  127.                      CallID.Text & "','" & DateTime.Text & "','" & CreditDate.Text & "','" & routinefrom.Text & "','" & _
  128.                      routineto.Text & "','" & contents.Text & "','" & cabin.Text & "','" & License1.Text & "'," _
  129.                      & LicenseFee1.Text & ",'" & License2.Text & "'," & LicenseFee2.Text & "," & ticketfee.Text & "," & _
  130.                      totalfee.Text & ",'" & remarks.Text & "') ;"
  131.         End If
  132.         '  Sheets("data").[A20] = strSQL     '  檢查 strSQL 語法內容是否正確
  133.         cmd.CommandText = strSQL
  134.    
  135.         cmd.ActiveConnection = cnn
  136.         cmd.Execute
  137.         cnn.Close
  138.         
  139.         Confirm.Enabled = True
  140.         SaveData.Enabled = False
  141.         ResetData.Enabled = False
  142.         ExcelData.Value = ret
  143.         ResetData_Click
  144.     End With
  145. End Sub
複製代碼

TOP

        靜思自在 : 愛不是要求對方,而是要由自身的付出。
返回列表 上一主題