①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接続に変更する。(後日予定)
参考
http://phpjavascriptroom.com/?t=mysql&p=index