2017-11-29 3 views
0

vbaには、特定のセルに新しい値を保存するたびに、メッセージボックスに古い値セルに記憶されていると私はすぐ下保存した新しい値を何であったか、コードの出力ウィンドウは下の写真の中で次のように来ることvbaを使用してデータベーステーブルにアクセスするためのexcelでメッセージボックスの表示データをエクスポートするには

Option Explicit 

Dim OldVals As New Dictionary 

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim myCell As Range 

    For Each myCell In Target 
     If OldVals.Exists(myCell.Address) Then 
      MsgBox "New value of " & Replace(myCell.Address, "$", "") & " is " & myCell.Value & "; old value was " & OldVals(myCell.Address) 
     Else 
      MsgBox "No old value for " + Replace(myCell.Address, "$", "") 
     End If 
     OldVals(myCell.Address) = myCell.Value 
    Next myCell 

End Sub 

ためのコードです - enter image description here

エクスポートしたいvbaを使用してアクセスデータベーステーブルにメッセージボックスに表示された値

しかし、私はエクセルシートのセルの値をエクスポートして保存するコードを書いています。コードは

Const TARGET_DB = "\Database3.accdb" 
    Sub PushTableToAccess() 
    Dim cnn As ADODB.Connection 
    Dim MyConn 
    Dim rst As ADODB.Recordset 
    Dim i As Long, j As Long 
    Dim Rw As Long 

    Sheets("Sheet1").Activate 
    Rw = Range("A1").End(xlDown).Row 

    Set cnn = New ADODB.Connection 
    MyConn = ThisWorkbook.Path & Application.PathSeparator & TARGET_DB 

    With cnn 
    .Provider = "Microsoft.ACE.OLEDB.12.0" 
    .Open MyConn 
    End With 



    Set rst = New ADODB.Recordset 
    rst.CursorLocation = adUseServer 
    rst.Open Source:="Table1", ActiveConnection:=cnn, _ 
    CursorType:=adOpenDynamic, LockType:=adLockOptimistic, _ 
    Options:=adCmdTable 

    For i = 2 To Rw 
     rst.AddNew 
     For j = 1 To 3 
      rst(j) = Cells(i, j).Value 
     Next j 
     rst.Update 
    Next i 


    rst.Close 
    cnn.Close 
    Set rst = Nothing 
    Set cnn = Nothing 

    End Sub 

上記のコードは、Excelテーブルのすべての値をエクスポートしてデータベーステーブルに保存します。

しかし、両方のコードを結合する方法がわからないので、最初のコードはいつでも古い値と新しい値を表示し、OKボタンをクリックするとメッセージボックスに表示された値をエクスポートして保存します。(たとえば、A1の新しい値は7、古い値は88)を使用してデータベーステーブル1にアクセスします。

答えて

0

Excelワークブックのすべての変更の監査/ログ機能を作成したいと思うようです。

変更を識別するコードとデータベースに情報を書き込むコードの2つのコードがありますが、これを組み合わせてください。結果として得られる機能は、ユーザーがデータベースに行うすべての変更を書き込むことになります。

あなたが持っているコードは、特定のVBAステートメントに関する十分なガイダンスを提供する必要があります。私はこの解決方法をこのアプローチに限定します。

ユーザーがワークシートを開いた、あなたはワークブックのオープンイベントでデータベース接続を作成する必要があります持っている全体の時間の間、データベース接続が必要になりますと:

Public cnn As ADODB.Connection 
Public MyConn 

Private Sub Workbook_Open() 
    Set cnn = New ADODB.Connection 
    MyConn = ThisWorkbook.Path & Application.PathSeparator & TARGET_DB 
    With cnn 
     .Provider = "Microsoft.ACE.OLEDB.12.0" 
     .Open MyConn 
    End With 
End Sub 

次にあなたが変更イベントに継続:

Private Sub Worksheet_Change(ByVal Target As Range) 

    '.... (your code to get the change) 

    Set rst = New ADODB.Recordset 

    rst.AddNew      ' allocate new record 
    rst(j) = Cells(i, j).Value  ' populate the record (this must be your code) 
    rst.Update      ' update/insert record 
    rst.Close      ' done record. 
End Sub 

最後に、Workbook_BeforeCloseイベントでデータベースを閉じます。

関連する問題