①MYSQLのODBCドライバー(32ビット版)をインストし、ユーザDSNにOBCD接続を設定。
※【detaile】ボタンを押し以下を追加。文字化けしないように・・・(多分これでOK)
charsetにsjis cp932
Initial statementにset character set sjis cp932
※sjisを使うと特定の文字データで失敗することがある。例えば㈱等
②MDBファイルを開き、指示に従いOFFCIDE365のACCDBファイルにコンバート。ACCESSがエラるけど(゚ε゚)キニシナイ!!。
③以下のマクロをVBAに作成して実行し、テーブルをODBC接続でMYSQLにエクスポートする。※リンクテーブルは失敗するかもしれない。
Attribute VB_Name = "ODBCエクスポート"
Option Compare Database
Dim DSN As String
Dim データベース名 As String
Dim ユーザID As String
Dim パスワード As String
Dim odbcSet As String
Dim サーバー As String
Public Sub テーブルをMYSQLのデータベースへエクスポートする()
Dim テーブル名 As String
Dim tbldef As TableDef
Dim 追加したテーブル() As String
Dim 追加できなかったテーブル() As String
Dim 既に存在していたテーブル() As String
'----------------------------
DSN = "ODBC接続名"
データベース名 = "データベース名"
ユーザID = "ユーザID"
パスワード = "パスワード"
サーバー = "サーバー名"
'----------------------------
odbcSet = "ODBC;DSN=" & DSN & ";UID=" & ユーザID & ";PWD=" & パスワード & ";"
Call テーブル差し戻し
For Each tbldef In CurrentDb.TableDefs
テーブル名 = tbldef.Name
Dim nn As Integer
' MSテーブルを除く
If Left(テーブル名, 2) <> "ms" Then
If Left(tbldef.Name, 6) <> "オリジナル_" And Left(tbldef.Connect, 4) <> "ODBC" Then
On Error Resume Next
Err.Clear
DoCmd.TransferDatabase acExport, "ODBC データベース", odbcSet, _
acTable, テーブル名, テーブル名, False
Select Case Err.Number
Case 0:
Call テーブル差し替え(テーブル名)
Call 配列に追加(追加したテーブル, テーブル名)
Case 3146:
'既にある
MsgBox Err.Description
Call テーブル差し替え(テーブル名)
Call 配列に追加(既に存在していたテーブル, テーブル名)
Case Else:
Call 配列に追加(追加できなかったテーブル, テーブル名)
End Select
'
End If
End If
DoEvents
Next
MsgBox "終了" & vbCrLf & "【追加したテーブル】:" & vbCrLf & Join(追加したテーブル, ",") & vbCrLf & "【追加できなかったテーブル】:" & vbCrLf & Join(追加できなかったテーブル, ",") & vbCrLf & "【既に存在していたテーブル】:" & vbCrLf & Join(既に存在していたテーブル, ",")
End Sub
Private Sub テーブル差し替え(テーブル名)
'
On Error Resume Next
CurrentDb.TableDefs(テーブル名).Name = "オリジナル_" & テーブル名
'DoCmd.TransferDatabase acLink, "ODBC データベース", odbcSet, _
' acTable, テーブル名, テーブル名
Dim dbs As Database
Set dbs = CurrentDb
Dim tdf As TableDef
Set tdf = dbs.CreateTableDef(テーブル名)
tdf.Connect = odbcSet
tdf.SourceTableName = テーブル名
dbs.TableDefs.Append tdf
dbs.TableDefs.Refresh
Set dbs = Nothing
End Sub
Public Sub テーブル差し戻し()
'
On Error Resume Next
Err.Clear
Dim テーブル名 As String
For Each tbldef In CurrentDb.TableDefs
If Left(tbldef.Name, 6) = "オリジナル_" Then
テーブル名 = Mid(tbldef.Name, 7)
DoCmd.DeleteObject acTable, テーブル名
tbldef.Name = テーブル名
End If
Next
End Sub
Public Sub テーブルチェック()
'
Dim テーブル名 As String
Dim tbldef As TableDef
For Each tbldef In CurrentDb.TableDefs
テーブル名 = tbldef.Name
' MSテーブルを除く
If Left(テーブル名, 2) <> "ms" Then
MsgBox tbldef.Name & vbCrLf & tbldef.Connect
End If
Next
End Sub
Private Sub 配列に追加(aaa() As String, tbl As String)
On Error Resume Next
Err.Clear
Dim nn As Integer
nn = 0
nn = UBound(aaa)
If nn = 0 Then
nn = nn + 1
ReDim Preserve aaa(nn)
aaa(0) = tbl
Else
If aaa(nn) = "" Then
aaa(nn) = tbl
Else
nn = 0
nn = UBound(aaa)
nn = nn + 1
ReDim Preserve aaa(nn)
aaa(UBound(aaa)) = tbl
End If
End If
End Sub
ところが、DoCmd.TransferDatabaseは、テーブルにプライマリーキーを付けないという恐ろしい仕様になっているので、UPDATEやDELETE操作がうまくいかない。
このため、SQLツールでちょっとデータをいじると、即!"指定されたテーブルから削除できませんでした。" というエラー メッセージに出会うことになってしまう。
⓸以下のマクロをVBAに作成し、実行してテーブルやリンクテーブルを先のOBCD接続に変更する。(後日予定)