Accessで お仕事 VBA
目次
・Access VBA の使い方サイト
・テキストをインポート
・外部データベースにリンクしてテーブルを更新
・外部データベースのリンクを更新してテーブルを更新
・テーブル名の変更と、テーブル構造のコピー
Access VBA の使い方サイト
Access VBA を使ってみようと思って、初心者向けの本を2冊購入して読んでみました。しかし、私は Excel VBA を知っていたからですが、いずれも分かりにくく、かつ、余り役に立つものではありませんでした。
(私が批判したのは、右に掲げた本ではありません。念のため。)
ネットをググって見たら、もっとためになって、分かりやすいサイトがたくさんありました。
Excel VBA を知っている人なら、やりたいことをネットで検索すれば、本を購入する必要はないかもしれませんね。
Access a Go! Go!
http://web.archive.org/web/20151215135710/http://www.happy2-island.com/access
コマンド別に、端的な事例が書かれていて、そのまま使えます。
初心者備忘録
http://www.ka-net.org/office.html
実務面で必要になる実用的なコード例が、うまくまとまっています。
基礎から始めるAccessVBA講座
http://www.geocities.jp/cbc_vbnet/
AccessVBA基礎編
http://www.geocities.jp/cbc_vbnet/top/nyumon.html
DoCmdオブジェクト(基礎編)
http://www.geocities.jp/cbc_vbnet/kisuhen/docmd.html
テキストファイルをVBAでインポートする方法
http://www.geocities.jp/cbc_vbnet/tips/txtimport.html
充実した内容です。このサイトに目を通せば、書籍を購入しなくてよい?
Access VBA 初心者入門講座
http://vba.officehp.com/
初心者向けの内容が、画面を使って紹介されています。
Access VBAテクニック
http://www.moug.net/tech/acvba/
使えるかもしれないテクニックが、多数掲示されています。ざっと目を通しておくとよいでしょう。
AccessVBA入門
http://www.mccoy.jp/chie/zaitaku/access/vba/
Access VBA 入門講座
http://accessvba.pc-users.net/
AccessVBA講座編
http://www.serpress.co.jp/access/
閉じる時に最適化する - オプション設定をVBAで操作する
http://www.accessclub.jp/supbeg/110.html
オプション設定「閉じる時に最適化する」をVBAで変更する : Access裏技Tips
http://www.accessclub.jp/urawaza/73.html
テキストをインポート
テキスト・ファイルとして出力される月報ファイルを、Accessで処理する例です。
VBA で、以下の処理をしています。
1.前月の内容のテーブルを削除します。(VBA で SQL を定義して実行 )
2.Access のデータベースを最適化 します。
(Access データベースは、2G 以上になると、更新できなくなります。)
3.テキスト・ファイル(区切り記号付き)をインポートの定義を使って、インポート します。
テキスト・ファイルを指定するのに、「ファイルを開くダイアログ 」を、使います。
注:固定長テキスト・ファイルをAccessにインポートすると、項目の頭の「空白」は削除されてしまいます。(固定長なら削除されません。)
このため、私は、前もってテキスト・ファイルの「 」を「$」に変換しておきます。そして、Access にインポートした後で、更新クエリを使って、「$」を「 」に戻しています。
注:「ファイルを開くダイアログ」については、下記も参考になります。
No9073.ActiveXコントロール(Comdlg32.ocx)の追加
http://www.accessclub.jp/bbs/0020/beginers9073.html
ファイルを開くダイアログボックスを表示する
http://www.serpress.co.jp/winapi/no009.html
4.定義済みのクエリ(更新)を、VBA で実行 します。
Option Compare Database
Option Explicit
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Declare Function AccessibleChildren Lib "oleacc" (ByVal paccContainer As IAccessible, ByVal iChildStart As Long, ByVal cChildren As Long, ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long
'「system32」フォルダ内の「oleacc.dll」ファイルを参照する必要があります。
Declare Function AccessibleObjectFromWindow Lib "oleacc" (ByVal hWnd As Long, ByVal dwId As Long, riid As Any, ByRef ppvObject As IAccessible) As Long
Declare Function IIDFromString Lib "ole32" (ByVal lpsz As Long, lpiid As Any) As Long
Const CHILDID_SELF = 0&
Const OBJID_CLIENT = &HFFFFFFFC
Const ROLE_SYSTEM_PANE = &H10
Const ROLE_SYSTEM_PUSHBUTTON = &H2B
Dim インポートするファイルのパス As String
Dim 現在のパス As String
Dim Excelアプリケーション As Object 'Excel 参照用
Dim 開始日時 As Variant
Dim 終了日時 As Variant
'**********************************************************
Sub 前月データを削除してDBを最適化 ()
'http://www.ka-net.org/office/of18.html
'初心者備忘録 の下記のコードを、そのまま使わせていただいています。
'開いているデータベースを最適化する(Access 2010 VBA)
'「system32」フォルダ内の「oleacc.dll」ファイルを参照する必要があります。
Dim accApp As IAccessible
Dim accBackstage As IAccessible
Dim accBtnCompactAndRepair As IAccessible
Dim accBtnFile As IAccessible
Dim accRibbon As IAccessible
Dim IID(0 To 3) As Long
Call 削除クエリを実行
Call 指定秒待つ(30)
Set accRibbon = Application.CommandBars("Ribbon")
Set accBtnFile = GetAcc(accRibbon, "ファイル タブ", ROLE_SYSTEM_PUSHBUTTON)
If accBtnFile Is Nothing Then Exit Sub
Call accBtnFile.accDoDefaultAction(CHILDID_SELF) 'ファイルタブボタンクリック
DoEvents
Call IIDFromString(StrPtr("{618736E0-3C3D-11CF-810C-00AA00389B71}"), IID(0))
If AccessibleObjectFromWindow(Application.hWndAccessApp, OBJID_CLIENT, IID(0), accApp) <> 0& Then Exit Sub
Set accBackstage = GetAcc(accApp, "Backstage ビュー", ROLE_SYSTEM_PANE) 'Backstage
If accBackstage Is Nothing Then Exit Sub
Set accBtnCompactAndRepair = GetAcc(accBackstage, "データベースの最適化/修復", ROLE_SYSTEM_PUSHBUTTON)
If accBtnCompactAndRepair Is Nothing Then Exit Sub
Call accBtnCompactAndRepair.accDoDefaultAction(CHILDID_SELF) 'データベースの最適化/修復ボタンクリック
End Sub
'**********************************************************
'**********************************************************
Sub 当月データを処理 ()
'http://www.ken3.org/backno/hosoku/ETC_021.html
'三流プログラマー Ken3のHPで教えていただいたままです。
'ファイルを開くダイアログを使えるように、エクセルオブジェクトを作成します
Set Excelアプリケーション = CreateObject("Excel.Application")
Excelアプリケーション.Visible = False '小細工でExcelを見えなくする
現在のパス = CurrentProject .Path
' Stop
ChDrive 現在のパス
ChDir 現在のパス
ChDrive 現在のパス
ChDir 現在のパス
インポートするファイルのパス = Excelアプリケーション.GetOpenFilename ("テキストファイル,*.txt")
開始日時 = Now ' 開始時刻を変数に格納します。
Call テキストファイルをインポート
Call 先頭のドルを空白に
Call 品番PDCの有効日変更
終了日時 = Now
MsgBox "処理時間は、" _
& Format (終了日時 - 開始日時, "hh時間nn分ss秒") & " でした。"
End Sub
'**********************************************************
Private Sub 先頭のドルを空白に()
'警告ダイアログをOFF
DoCmd .SetWarnings False
'クエリを実行する
DoCmd .OpenQuery "☆1先頭の「$」を「 」に"
'警告ダイアログをON(戻す)
DoCmd .SetWarnings True
End Sub
Private Sub 品番PDCの有効日変更()
'警告ダイアログをOFF
DoCmd .SetWarnings False
'クエリを実行する
DoCmd .OpenQuery "☆3品番PDCの有効日-変更"
'警告ダイアログをON(戻す)
DoCmd .SetWarnings True
End Sub
Private Sub テキストファイルをインポート()
' http://okwave.jp/qa/q1691138.html
' Access にマクロでテキストファイルをインポートする
' インポートするレイアウトに合ったテーブルがあること
' インポート定義があること
' (定義の作り方は、ファイル→外部データの取り込み→インポート→設定で定義を作成)
' あとは、以下のコードを変更
' DoCmd .TransferText acImportFixed , "定義名", "データを格納するテーブル名", "C:\..テキストのパス....txt", False, ""
'警告ダイアログをOFF
DoCmd .SetWarnings False
DoCmd .TransferText acImportDelim , "品番PDCインポート定義", "品番PDCデータ", インポートするファイルのパス, False, ""
'警告ダイアログをON(戻す)
DoCmd .SetWarnings True
End Sub
Private Sub 削除クエリを実行()
Dim 削除クエリ As String
削除クエリ = "DELETE * FROM [品番PDCデータ];"
'警告ダイアログをOFF
DoCmd .SetWarnings False
DoCmd .RunSQL 削除クエリ
'警告ダイアログをON(戻す)
DoCmd .SetWarnings True
End Sub
Private Function GetAcc(myAcc As IAccessible, myAccName As String, myAccRole As Long) As IAccessible
Dim ReturnAcc As IAccessible
Dim ChildAcc As IAccessible
Dim List() As Variant
Dim Count As Long
Dim i As Long
If (myAcc.accState(CHILDID_SELF) <> 32769) And _
(myAcc.accName(CHILDID_SELF) = myAccName) And _
(myAcc.accRole(CHILDID_SELF) = myAccRole) Then
Set ReturnAcc = myAcc
Else
Count = myAcc.accChildCount
If Count > 0& Then
ReDim List(Count - 1&)
If AccessibleChildren(myAcc, 0&, ByVal Count, List(0), Count) = 0& Then
For i = LBound(List) To UBound(List)
If TypeOf List(i) Is IAccessible Then
Set ChildAcc = List(i)
Set ReturnAcc = GetAcc(ChildAcc, myAccName, myAccRole)
If Not ReturnAcc Is Nothing Then Exit For
End If
Next
End If
End If
End If
Set GetAcc = ReturnAcc
End Function
Private Sub 指定秒待つ(待ち時間 As Integer)
DoEvents ' Sleep しているときに、画面を書き換えできるように、OS に制御を渡す。
Sleep (待ち時間 * 1000)
End Sub
解説:
DoCmd オブジェクト のメソッドを使用して、Visual Basic から Microsoft Office Access の アクションを実行できます。
アクションによって、ウィンドウを閉じる、フォームを開く、コントロール の値を設定する、などのタスクを実行します。
メソッドとは、特定のオブジェクトに対して適用されるステートメントや関数に似たプロシージャです。たとえば、Debug オブジェクトに対して Print メソッドを使うと、指定した値をイミディエイト ウィンドウに表示できます。
アクションとは、マクロを構成する基本単位です。アクションはそれぞれ独立したコマンドであり、複数のアクションを連続して実行することで一連の作業を自動化できます。ほかのマクロ言語では、コマンドと言うこともあります。
コントロールとは、アプリケーションを制御するときに使用するテキスト ボックス、チェック ボックス、スクロール バー、またはコマンド ボタンなどの GUI (graphical user interface) オブジェクトです。コントロールを使用して、データや選択肢の一覧を表示したり、コマンドを実行したり、ユーザー インターフェイスの体裁を整えたりします。
備考
たとえば、DoCmd オブジェクトの OpenForm
メソッドを使用してフォームを開いたり、Hourglass メソッドを使用してマウス ポインターを砂時計アイコンに変えたりすることができます。
DoCmd オブジェクトのほとんどのメソッドは引数を持っています。
引数は必ず指定しなければならないものと、省略可能なものがあります。
省略可能な引数を省略すると、引数は各メソッド固有の既定値を取ります。
たとえば、OpenForm メソッドは 7 つの引数を使用しますが、必ず指定する必要があるのは最初の引数 FormName だけです。
次の使用例では、カレント データベースの [社員] フォームを開きます。
大阪支社の社員だけがフォームに含まれます。
DoCmd .OpenForm "社員", , ,"[在籍支社] = '大阪支社'"
次の使用例では、フォーム ビューでフォームを開き、新しいレコードに移動します。
Sub ShowNewRecord()
DoCmd .OpenForm "Employees", acNormal
DoCmd .GoToRecord , , acNewRec
End Sub
DoCmd オブジェクトのメソッド
名前 説明
AddMenu Visual Basic で "AddMenu/メニューの追加" アクションを実行します。
ApplyFilter ApplyFilter メソッドは、Visual Basic で "ApplyFilter /フィルターの実行" アクションを実行します。
Beep Visual Basic で "Beep/警告音" アクションを実行します。
BrowseTo BrowseTo メソッドは、Visual Basic で "参照先" アクションを実行します。
CancelEvent Visual Basic で "CancelEvent/イベントのキャンセル" アクションを実行します。
ClearMacroError MacroError オブジェクトに格納されているエラーについての情報を削除します。
Close Visual Basic で "Close/閉じる" アクションを実行します。
CloseDatabase カレント データベースを閉じます。
CopyDatabaseFile カレント プロジェクトに接続されたデータベースを SQL Server データベース ファイルにコピーしてエクスポートします。
CopyObject Visual Basic で "CopyObject/オブジェクトのコピー" アクションを実行します。
DeleteObject Visual Basic で "DeleteObject/オブジェクトの削除" アクションを実行します。
DoMenuItem Access に対して適切なメニューまたはツールバー コマンドが表示されます。
Echo Visual Basic で "Echo/エコー" アクションを実行します。
FindNext FindNext メソッドは、Visual Basic で "FindNext/次を検索" アクションを実行します。
FindRecord Visual Basic で "FindRecord/レコードの検索" アクションを実行します。
GoToControl Visual Basic で "GoToControl/コントロールの移動" アクションを実行します。
GoToPage Visual Basic で "GoToPage/ページの移動" アクションを実行します。
GoToRecord Visual Basic で "GoToRecord/レコードの移動" アクションを実行します。
Hourglass Visual Basic で "Hourglass/砂時計ポインター" アクションを実行します。
LockNavigationPane LockNavigationPane アクションを使用すると、ナビゲーション ウィンドウに表示されているデータベース オブジェクトをユーザーが削除できないように指定できます。
Maximize Visual Basic で "Maximize/最大化" アクションを実行します。
Minimize Visual Basic で "Minimize/最小化" アクションを実行します。
MoveSize Visual Basic で "MoveSize/サイズ変更" アクションを実行します。
NavigateTo NavigateTo メソッドを使用すると、ナビゲーション ウィンドウでのデータベース オブジェクトの表示を制御できます。
OpenDataAccessPage Visual Basic で "OpenDataAccessPage/データアクセスページを開く" アクションを実行します。
OpenDiagram Visual Basic で "OpenDiagram/ダイアグラムを開く" アクションを実行します。
OpenForm Visual Basic で "OpenForm/フォームを開く" アクションを実行します。
OpenFunction Microsoft SQL Server データベースのユーザー定義関数を開き、Access で表示します。
OpenModule Visual Basic で "OpenModule/モジュールを開く" アクションを実行します。
OpenQuery Visual Basic で "OpenQuery/クエリを開く" アクションを実行します。
OpenReport Visual Basic で "OpenReport/レポートを開く" アクションを実行します。
OpenStoredProcedure Visual Basic で "OpenStoredProcedure/ストアドプロシージャを開く" アクションを実行します。
OpenTable Visual Basic で "OpenTable/テーブルを開く" アクションを実行します。
OpenView OpenView メソッドは、Visual Basic で "OpenView /フィルターの実行" アクションを実行します。
OutputTo Visual Basic で "OutputTo/出力" アクションを実行します。
PrintOut Visual Basic で "PrintOut/印刷" アクションを実行します。
Quit Microsoft Access を終了します。引数 Options の指定によって、終了の前にデータベース オブジェクトを保存することができます。
RefreshRecord RefreshRecord メソッドは、Visual Basic から RefreshRecord マクロ操作を実行します。
Rename Visual Basic で "Rename/名前の変更" アクションを実行します。
RepaintObject Visual Basic で "RepaintObject/オブジェクトの再描画" アクションを実行します。
Requery Visual Basic で "Requery/再クエリ" アクションを実行します。
Restore Visual Basic で "Restore/元のサイズに戻す" アクションを実行します。
RunCommand 組み込みコマンドを実行します。
RunDataMacro Visual Basic から名前付きデータ マクロを実行するには、RunDataMacro メソッドを使用します。
RunMacro Visual Basic で "RunMacro/マクロの実行" アクションを実行します。
RunSavedImportExport 保存済みのインポート仕様またはエクスポート仕様を実行します。
RunSQL Visual Basic で "RunSQL/SQL の実行" アクションを実行します。
Save Visual Basic で "Save/オブジェクトの保存" アクションを実行します。
SearchForRecord SearchForRecord メソッドを使用して、テーブル、クエリ、フォーム、またはレポート内の特定のレコードを検索することができます。
SelectObject Visual Basic で "SelectObject/オブジェクトの選択" アクションを実行します。
SendObject Visual Basic で "SendObject/オブジェクトの送信" アクションを実行します。
SetDisplayedCategories ナビゲーション ウィンドウのタイトル バーの [カテゴリに移動 ] の下に表示するカテゴリを指定します。
SetFilter アクティブなデータシート、フォーム、レポート、またはテーブル内のレコードにフィルターを適用するには、SetFilter メソッドを使用します。
SetMenuItem Visual Basic で "SetMenuItem/メニューの設定" アクションを実行します。
SetOrderBy アクティブなデータシート、フォーム、レポート、またはテーブルに並べ替えを適用するには、SetOrderBy メソッドを使用します。
SetParameter BrowseTo 、OpenForm 、OpenQuery 、OpenReport 、または RunDataMacro メソッドで使用されるパラメーターを作成するには、SetParameter メソッドを使用します。
SetProperty Visual Basic で "SetProperty /プロパティの設定" アクションを実行します。
SetWarnings Visual Basic で "SetWarnings/メッセージの設定" アクションを実行します。
ShowAllRecords Visual Basic で "ShowAllRecords/全レコードの表示" アクションを実行します。
ShowToolbar Visual Basic で "ShowToolbar/ツールバーの表示" アクションを実行します。
SingleStep マクロの実行を一時中断して [マクロのシングル ステップ ] ダイアログ ボックスを表示します。
TransferDatabase Visual Basic で "TransferDatabase/データベース変換" アクションを実行します。
TransferSharePointList TransferSharePointList メソッドは、Windows SharePoint Services 3.0 サイトのデータをインポートまたはリンクするために使用します。
TransferSpreadsheet Visual Basic で "TransferSpreadsheet/ワークシート変換" アクションを実行します。
TransferSQLDatabase 指定された SQL Server データベース全体を別の SQL Server データベースに転送します。
TransferText Visual Basic で "TransferText/テキスト変換" アクションを実行します。
DoCmd オブジェクトでは、次のアクションに対応するメソッドはサポートされていません。
"AddMenu/メニューの追加"
"MsgBox/メッセージボックス" MsgBox 関数を使用します。
"RunApp/アプリケーションの実行" Shell 関数を使用して他のアプリケーションを実行します。
"RunCode/プロシージャの実行" 関数を Visual Basic で直接実行します。
"SendKeys/キー送信" SendKeys ステートメントを使用します。
"SetValue/値の代入" 値を Visual Basic で直接設定します。
"StopAllMacros/全マクロの中止"
"StopMacro/マクロの中止"
メニューとは、メニュー バーのメニュー名をクリックすると表示されるコマンドの一覧のことです。ツール バーをクリックすると表示されるコマンド一覧もあります。
ツール バーとは、コマンドを実行するのに使用するボタンやオプションを含むバーのことです。ツール バーを表示するには、Alt キーを押し、次に Shift キーを押しながら F10 キーを押します。
データベース オブジェクトとは、テーブル、クエリ、フォーム、レポート、ページ、マクロ、およびモジュールなどのオブジェクトを含むアクセス データベースのことです。Access プロジェクトには、フォーム、レポート、ページ、マクロ、およびモジュールなどのオブジェクトが含まれます。
マクロとは、1 つまたは複数のアクションをまとめて記述したものです。作業を自動的に行うために使用します。
DoCmd .SetWarnings メソッド は、Visual Basic で "SetWarnings/メッセージの設定" アクションを実行します。
構文
式 .SetWarnings(WarningsOn )
式 DoCmd オブジェクトを表す変数。
パラメーター
名前 必須/オプション データ型 説明
WarningsOn 必須 バリアント型 (Variant) システム メッセージの表示をオンにするには、True (-1) を使います。
システム メッセージの表示をオフにするには False (0) を使います。
備考
SetWarnings メソッドを使用すると、システム メッセージのオンとオフを切り替えることができます。
Visual Basic でシステム メッセージの表示をオフにした後は、オンに戻しておく必要があります。オフにしたままだと、Ctrl + Break キーを押した場合や、Visual Basic がブレークポイントに到達した場合でも、システム メッセージの表示はオフのままです。
システム メッセージの表示をオンにするマクロを、アクセス キーやカスタム メニュー コマンドに割り当てておくと、Visual Basic でシステム メッセージの表示がオフにされても、キー操作やメニュー コマンドでオンにすることができます。
ブレークポイントとは、Function プロシージャまたは Sub プロシージャのコード中で、Visual Basic が実行を中断する行です。
マクロとは、1 つまたは複数のアクションを自動的に実行させるための仕組みです。マクロは Visual Basic for Applications プログラミング言語で記述します。
次の例では、システム メッセージの表示をオフにします。
DoCmd .SetWarnings False
DoCmd .OpenQuery メソッド は、Visual Basic で "OpenQuery/クエリを開く" アクションを実行します。
構文
式 .OpenQuery(QueryName , View , DataMode )
式 DoCmd オブジェクトを表す変数です。
パラメーター
名前 必須/オプション データ型 説明
QueryName 必須 バリアント型 (Variant) カレント データベースのクエリの有効な名前を表す文字列式を指定します。
OpenQuery メソッドを含む Visual Basic コードをライブラリ データベースで実行すると、この名前のクエリが、最初にライブラリ データベースで、次にカレント データベースで検索されます。
View オプション AcView クエリを開くときのビューを、AcView クラスの定数で指定します。
既定値は acViewNormal です。
DataMode オプション AcOpenDataMode クエリを開くときのデータ入力モードを、AcOpenDataMode クラスの定数で指定します。
既定値は acEdit です。
クエリとは、テーブル内に格納されているデータについての問い合わせ、またはデータに対して処理を実行するための要求のことです。クエリを使って複数のテーブルからデータを取り出して、そのデータをフォームまたはレポートのデータのソースとして使用できます。
文字列式とは、1 つの文字列として評価される式のことです。文字列を返す関数、バリアント型 (Variant) の文字列 (VarType 関数の文字列が 8) を返す関数、リテラル文字列、文字列定数、文字列変数、またはバリアント型 (Variant) 文字列などを組み合わせて構成できます。
ライブラリ データベースとは、ほかのアプリケーションから呼び出すことができるプロシージャとデータベース オブジェクトの集まりのことです。ライブラリ データベースのアイテムを使用するには、最初にカレント データベースからライブラリ データベースへの参照を設定する必要があります。
備考
OpenQuery メソッドを使用すると、選択クエリまたは、クロス集計クエリを、データシート ビュー、デザイン ビュー、印刷プレビューのいずれかで開くことができます。
このアクションでは、アクション クエリが実行されます。
クエリを開くときのデータ入力モードを選択することもできます。
メモ
このメソッドは、Access データベース環境でのみ使用できます。Access プロジェクト環境 (.adp) で使用する場合は、OpenView メソッド、または OpenStoredProcedure メソッドを参照してください。
選択クエリとは、テーブルに格納されているデータに関する問い合わせを行い、データを変更せずに、データシートの形式で結果セットを返すクエリです。
クロス集計クエリとは、レコードに対して合計、平均、カウント、またはその他の集計を計算してから、データシートの左端で縦方向に、およびデータシートの上端で横方向に、2 種類の情報によって結果をグループ化するクエリです。
データシート ビューとは、テーブル、フォーム、クエリ、ビュー、またはストアド プロシージャのデータを行/列形式で表示するビューのことです。データシート ビューでは、フィールドの編集、データの追加と削除、およびデータの検索を行うことができます。
デザイン ビューとは、データベース オブジェクトのデザインを表示するビューのことです。テーブル、クエリ、フォーム、レポート、およびマクロで使用できます。デザイン ビューでは、新しいデータベース オブジェクトの作成や、既存のオブジェクトのデザイン変更を行うことができます。
印刷プレビューとは、文書の印刷時のイメージを画面に表示することです。
アクション クエリとはデータのコピーや変更を行うクエリのことです。アクション クエリには、追加クエリ、削除クエリ、テーブル作成クエリ、および更新クエリがあります。ナビゲーション ウィンドウでは、アクション クエリの名前の横に感嘆符 (!) が表示されます。
次の例では、[年次売上高] クエリをデータシート ビューで開きます。ユーザーはレコードを表示することはできますが、編集したり追加することはできません。
DoCmd .OpenQuery "Sales Totals Query", , acReadOnly
DoCmd .TransferText メソッド は、Visual Basic で "TransferText/テキスト変換" アクションを実行します。
構文
式 .TransferText(TransferType , SpecificationName , TableName , FileName , HasFieldNames , HTMLTableName , CodePage )
式 DoCmd オブジェクトを表す変数。
パラメーター
名前 必須/オプション データ型 説明
TransferType オプション AcTextTransferType 変換の種類を指定します。
データのインポート、エクスポート、およびリンクができるのは、区切りテキスト ファイル、固定幅テキスト ファイル、または HTML ファイルです。
既定値は acImportDelim です。Microsoft Access プロジェクト (.adp) では、acImportDelim 、acImportFixed 、acExportDelim 、acExportFixed 、または acExportMerge のみサポートされています。
SpecificationName オプション バリアント型 (Variant) 作成してカレント データベースに保存したインポートまたはエクスポートの定義名を文字列式で指定 します。
固定幅テキスト ファイルの場合、引数を指定するか、schema.ini ファイルを使用する必要があり、この schema.ini ファイルは、インポート、リンク、またはエクスポートを行うテキスト ファイルと同じフォルダーに格納する必要があります。
schema ファイルを作成するには、テキストのインポート/エクスポート ウイザードを使用します。
区切りテキスト ファイルおよび Microsoft Word の差し込み印刷データ ファイルの場合は、この引数を指定しないで、既定のインポート/エクスポート定義を選択できます。
TableName オプション バリアント型 (Variant) テキスト データのインポート、エクスポート、リンクを行う Microsoft Access テーブルの名前 、または結果をテキスト ファイルにエクスポートする Microsoft Access クエリの名前を、文字列式で指定します。
FileName オプション バリアント型 (Variant) インポート、エクスポート、またはリンクを行うテキスト ファイルの、パスを含めた完全な名前を文字列式で指定 します。
HasFieldNames オプション バリアント型 (Variant) インポート、エクスポート、またはリンクの際に
テキスト ファイルの 1 行目をフィールド名として使用する場合は、True (-1) を使います。
テキスト ファイルの 1 行目をデータとして処理する場合は、False (0) を使います。
この引数を指定しないと、False (既定値) が使われます。
Word の差し込みデータ ファイルの場合は、この引数は無視され、最初の行には常にフィールド名が含まれます。
インポートの定義を作成するときに、「先頭行をフィールド名として使う」として作成しておくと、False としていても、1 行目(項目名)は、取り込まれません。
HTMLTableName オプション バリアント型 (Variant) インポートまたはリンクする HTML ファイル内のテーブルあるいは一覧の名前を文字列式で指定します。
この引数は、引数 transfertype に acImportHTML または acLinkHTML が設定されていない場合は無視されます。
この引数を指定しないと、HTML ファイル内の最初のテーブルまたは一覧がインポートまたはリンクされます。
HTML ファイル内のテーブルまたは一覧の名前は、<CAPTION> タグがあれば、それによって指定されるテキストで決定されます。
<CAPTION> タグがない場合、<TITLE> タグで指定されるテキストで決定されます。
同じ名前のテーブルまたは一覧が複数ある場合は、それぞれのテーブルまたは一覧の名前の末尾に番号を追加して区別されます。たとえば、社員1 と社員2 になります。
CodePage オプション バリアント型 (Variant) コード ページの文字セットを示す長整数型 (Long ) の値を指定します。
例えば、Shift_JIS は 932、拡張EUC-JP は 51932、拡張ISO-2022-JP は 50220 です。フォントと対象言語 を参照下さい。
日本語を使えない文字コードを指定したときは、テーブルの項目名に日本語(漢字など)を使えないので、注意して下さい。
区切り記号付きテキスト ファイルとは、個々のフィールドの値がコンマやタブなどの文字で区切られているデータを含むファイルです。
固定幅テキスト ファイルとは、各フィールドの長さが一定のデータを含むファイルのことです。
備考
TransferText メソッドを使用すると、Microsoft Access のカレント データベースまたは Access プロジェクト (.adp) とテキスト ファイルとの間でテキストをインポートまたはエクスポートできます。
テキスト ファイルのデータを Access のカレント データベースにリンクすることもできます。
テキスト ファイルをリンクすると、Access でテキスト データを表示することができますが、ワード プロセッシング アプリケーションでデータにアクセスできなくなることはありません。
HTML ファイル (*.html) のテーブルまたはリストに対するインポート、エクスポート、またはリンクも行うことができます。
Access の選択クエリのデータをテキスト ファイルにエクスポートできます。クエリの結果セットもテーブルと同じようにエクスポートされます。
リンク (テーブル)とは、Access アプリケーションから他のアプリケーションへのデータへの接続を作成し、両方のアプリケーションでデータを編集できるようにすることです。
結果セットとは、クエリやフィルターの実行結果として得られるレコードの集合のことです。
次の例では、"標準出力" 定義を使って、Access の [受注] テーブルのデータを区切り記号付きテキスト ファイル April.txt にエクスポートします。
DoCmd .TransferText acExportDelim, "Standard Output", _
"External Report", "C:\Txtfiles\April.doc"
TranferText メソッドは、下のパラメータ(TransferType)を使って、変換の種類を指定します。
名前 値 説明
acExportDelim 2 区切り記号付きエクスポート
acExportFixed 3 固定長エクスポート
acExportHTML 8 HTML エクスポート
acExportMerge 4 Word 差し込みデータ エクスポート
acImportDelim 0 区切り記号付きインポート
acImportFixed 1 固定長インポート
acImportHTML 7 HTML インポート
acLinkDelim 5 区切り記号付きリンク
acLinkFixed 6 固定長リンク
acLinkHTML 9 HTML リンク
DoCmd .RunSQL メソッド は、Visual Basic で "RunSQL/SQL の実行" アクションを実行します。
構文
式 .RunSQL(SQLStatement , UseTransaction )
式 DoCmd オブジェクトを表す変数。
パラメーター
名前 必須/オプション データ型 説明
SQLStatement 必須 バリアント型 (Variant) アクション クエリまたはデータ定義クエリのための有効な SQL ステートメントを文字列式で指定します。
この文字列には、INSERT INTO、DELETE、SELECT...INTO、UPDATE、CREATE TABLE、ALTER TABLE、DROP TABLE、CREATE INDEX、または DROP INDEX ステートメントを使います。
他のデータベースにアクセスする場合は、IN 句を含めます。
注1:テーブル名に()が含まれる場合は、テーブル名を[]で囲まないとエラーになります。また、最後に ; を付けます。
注2:Access の SQL ビューから 改行のある SQL をコピーして、VBA のコードに改行を付けて貼り込むときには、改行部分(行末か行頭の一方)に 半角スペース を追加することに注意しましょう。文字列結合したときに、予約語の前の空白が必要だからです。
こうしないと、メッセージ的に、理解できない、下記のエラーになります。
実行時エラー '3067':
クエリの入力には、1 つ以上のテーブルまたはクエリが必要です。
参考:SQLStatement の例: アクションクエリ(SQL編)
http://www.geocities.jp/cbc_vbnet/Sql/action.html
UseTransaction オプション バリアント型 (Variant) このクエリをトランザクションに含めるには、True (-1) を使います。
トランザクションを使わない場合は、False (0) を使います。この引数を指定しないと、True (既定値) が使われます。
データ定義クエリとは、DDL (Data Definition Language) ステートメントを含む SQL 固有のクエリのことです。これらのステートメントにより、データベース内のオブジェクトを作成または変更できるようになります。
トランザクションとは、データベースのデータとスキーマに対して行われる一連の変更のことです。トランザクションのいずれかの要素が失敗すると、トランザクション全体が失敗し、データは "ロールバック" されます。
備考
Microsoft Access のアクション クエリを、そのアクションに対応する SQL ステートメントを使用して実行します。また、データ定義クエリも実行できます。
このメソッドは Access データベースにのみ適用できます。
SQL 文字列/ステートメントとは、SELECT、UPDATE、または DELETE などの SQL コマンドを定義し、WHERE および ORDER BY などの句を含む式です。通常、SQL 文字列/ステートメントはクエリおよび集計関数で使用されます。
引数 sqlstatement の最大長は、32,768 バイトです。マクロ ウィンドウでは、これとは異なり、"SQL Statement/SQL ステートメント" アクション引数の最大長は 256 バイトです。
マクロ ウィンドウとは、マクロの作成や変更を行うためのウィンドウです。
次の例は、[社員] テーブルを更新し、"北九州支社" を "九州支社" に変更します。
DoCmd .RunSQL "UPDATE
社員" & _
" SET
社員.
在籍支社 = '
九州支社' " & _
" WHERE
社員.
在籍支社 = '
北九州支社';"
CurrentProject オブジェクト は、Microsoft Office Access のカレント プロジェクト (.adp) または、データベース に対する、プロジェクトを参照します。
Microsoft Access プロジェクトとは、Microsoft SQL Server データベースに接続する Access ファイル。クライアント/サーバー アプリケーションを構築するときに使用します。プロジェクト ファイルにはデータは格納されず、テーブルやビューなど、データ定義に基づくオブジェクトも含まれません。
データベースとは、何らかの関連性を持ったデータの集まりです。データベースには、個別の項目 (社員や注文など) に関する情報が、テーブル、レコード、およびフィールドに分類されています。
プロジェクトとは、標準モジュールおよびクラス モジュールを含む、データベースのすべてのコード モジュールの集合です。既定では、プロジェクトの名前はデータベースの名前と同じです。
備考
CurrentProject オブジェクトには、カレント データベースの特定の AccessObject オブジェクトを含むコレクションが、いくつかあります。
コレクションとは、関連するオブジェクトのセットを含むオブジェクトです。コレクション内における各オブジェクトの位置 (順番) は、コレクションが変更されると変わることがあります。したがって、コレクション内の特定のオブジェクトの位置は、必ずしも一定していません。
各コレクションの名前とそれに含まれるオブジェクトの種類は次のとおりです。
コレクション
オブジェクトの種類
AllForms
すべてのフォーム
AllReports
すべてのレポート
AllMacros
すべてのマクロ
AllModules
すべてのモジュール
メモ
上の表に示したコレクションは、データベース内の対応するオブジェクトを、それらが開いているか閉じているかにかかわらずすべて含みます。
たとえば、フォームを示す AccessObject は、AllForms コレクションのメンバーです。
AllForms は、カレント データベース内の AccessObject オブジェクトのコレクションです。
AllForms コレクションでは、各メンバーにゼロから始まるインデックスが付けられています。
AllForms コレクションの各 AccessObject オブジェクトは、そのフォームの名前またはインデックスを使って参照できます。
コレクションで付けられたインデックスは変わる可能性があるので、AllForms コレクションのオブジェクトを参照する場合は、名前で参照することをお勧めします。オブジェクト名にスペースが含まれる場合は、名前を角かっこ ([ ]) で囲む必要があります。
構文
使用例
AllForms !formname
AllForms!受注フォーム
AllForms ![form name ]
AllForms![受注 フォーム]
AllForms ("formname ")
AllForms("受注フォーム")
AllForms (formname )
AllForms(0)
次の使用例では、CurrentProject オブジェクトのプロパティの現在の設定を表示し、アプリケーションの隠しオブジェクトを表示するように設定します。
Sub ApplicationInformation()
' このオブジェクトの名前と型を表示します。
Debug.Print Application.CurrentProject.FullName
Debug.Print Application.CurrentProject.ProjectType
' オプション・ダイアログ・ボックスの表示タブで、
' 隠しオブジェクト・オプションを表示するように設定します。
Application.SetOption "Show Hidden Objects", True
End Sub
次の使用例では、他の Office アプリケーションからオートメーションを使って CurrentProject オブジェクトを使用する方法を示したものです。
まず、モジュール ウィンドウで [ツール] メニューの [参照設定] をクリックし、Access への参照を設定します。
Microsoft Access オブジェクト ライブラリの横にあるチェック ボックスをオンにしてください。次に、そのアプリケーションの Visual Basic のモジュールに以下のコードを入力し、GetAccessData プロシージャを実行します。
この使用例は、Application クラスの新しいインスタンスを作成するプロシージャにデータベース名およびレポート名を引き渡し、データベースを開き、CurrentProject オブジェクトおよび AllReports コレクションを使って指定した既存のレポートを確認します。
Sub GetAccessData()
' モジュールの宣言部分で、対象変数を宣言します
Dim appAccess As Access.Application
Dim strDB As String
Dim strReportName As String
strDB = "C:\Program Files\Microsoft "_
& "Office\Office11\Samples\Northwind.mdb"
strReportName = InputBox("Enter name of report to be verified", _
"Report Verification")
VerifyAccessReport strDB, strReportName
End Sub
Sub VerifyAccessReport(strDB As String, _
strReportName As String)
' Return reference to Microsoft Access
' Application object.
Set appAccess = New Access.Application
' Open database in Microsoft Access.
appAccess.OpenCurrentDatabase strDB
' Verify report exists.
On Error Goto ErrorHandler
appAccess.CurrentProject.AllReports(strReportName)
MsgBox "Report " & strReportName & _
" verified within Northwind database."
appAccess.CloseCurrentDatabase
Set appAccess = Nothing
Exit Sub
ErrorHandler:
MsgBox "Report " & strReportName & _
" does not exist within Northwind database."
appAccess.CloseCurrentDatabase
Set appAccess = Nothing
End Sub
CurrentProject オブジェクト の メンバー
CurrentProject オブジェクトは、Microsoft Office Access のカレント プロジェクト (.adp) またはデータベースに対するプロジェクトを参照します。
CurrentProject オブジェクト の メソッド
CurrentProject オブジェクト の プロパティ
名前 説明
AccessConnection 現在の Microsoft ActiveX データ オブジェクト (ADO) の Connection オブジェクトおよびその関連プロパティへの参照を取得します。
値の取得のみ可能です。Connection オブジェクト型の値を使用します。
AllForms AllForms プロパティを使用すると、AllForms コレクションおよびその関連プロパティを参照できます。
値の取得のみ可能です。AllForms オブジェクト型の値を使用します。
AllMacros AllMacros プロパティを使用すると、AllMacros コレクションおよびその関連プロパティを参照できます。
値の取得のみ可能です。AllMacros オブジェクト型の値を使用します。
AllModules AllModules プロパティを使用すると、AllModules コレクションおよびその関連プロパティを参照できます。
値の取得のみ可能です。AllModules オブジェクト型の値を使用します。
AllReports AllReports プロパティを使用すると、AllReports コレクションおよびその関連プロパティを参照できます。
値の取得のみ可能です。AllReports オブジェクト型の値を使用します。
Application Application プロパティを使用すると、アクティブな Microsoft Office Access の Application オブジェクトとその関連プロパティにアクセスできます。
値の取得のみ可能です。Application オブジェクト型の値を使用します。
BaseConnectionString BaseConnectionString プロパティは、指定したオブジェクトの基本の接続文字列を取得するために使用します。
値の取得のみ可能です。文字列型 (String ) の値を使用します。
Connection 現在の ActiveX データ オブジェクト (ADO) の Connection オブジェクトおよびその関連プロパティへの参照を取得します。
値の取得のみ可能です。Connection オブジェクト型の値を使用します。
FileFormat 指定したプロジェクトのファイル形式に対応する Access のバージョンを示す AcFileFormat 定数を取得します。値の取得のみ可能です。
FullName 特定のオブジェクトの完全パス (ファイル名を含む) を設定または取得します。
値の取得のみ可能です。文字列型 (String ) の値を使用します。
ImportExportSpecifications 指定されたオブジェクトに対する、保存済みのインポート操作またはエクスポート操作のコレクションを表す ImportExportSpecifications コレクションを返します。
値の取得のみ可能です。
IsConnected CurrentProject オブジェクトが現在接続されているかどうかを示します。
値の取得のみ可能です。ブール型 (Boolean ) の値を使用します。
IsTrusted 現在のプロジェクトでマクロおよび Visual Basic for Applications (VBA) コードが有効かどうかを示します。
値の取得のみ可能です。ブール型 (Boolean ) の値を使用します。
IsWeb データベースが Web データベースかどうかを取得します。
値の取得のみ可能です。ブール型 (Boolean ) の値を使用します。
Name "Name /名前" プロパティを使用すると、オブジェクトの名前を示す文字列式を取得できます。
値の取得のみ可能です。文字列型 (String ) の値を使用します。
Parent 指定されたオブジェクトの親オブジェクトを取得します。
値の取得のみ可能です。
Path Path プロパティは、Microsoft Office Access プロジェクト (.adp) または Microsoft Office Access データベースのデータを格納する場所を示します。
値の取得のみ可能です。文字列型 (String ) の値を使用します。
ProjectType 現在開いているプロジェクトの種類を示します。
値の取得のみ可能です。AcProjectType クラスの定数を使用します。
Properties CurrentProject オブジェクトの AccessObjectProperties コレクションへの参照を取得します。
値の取得のみ可能です。
RemovePersonalInformation 指定したプロジェクトにユーザーの個人情報を保存するかどうかを示すブール型 (Boolean ) の値を設定します。
個人情報を削除する場合は True になります。値の取得および設定が可能です。
Resources 指定されたオブジェクトの SharedResources コレクションを取得します。
値の取得のみ可能です。SharedResources の値を使用します。
WebSite データベースが発行された Web サイトの Uniform Resource Locator (URL) を取得します。
値の取得のみ可能です。文字列型 (String ) の値を使用します。
接続文字列とは、外部データベースを開くときに使う文字列のことです。
Visual Basic for Applications (VBA) とは、Microsoft Windows ベースのアプリケーションの作成に使用される Visual Basic のマクロ言語バージョンのことです。いくつかの Microsoft プログラムで使用できます。
Uniform Resource Locator (URL) とは、プロトコル (HTTP や FTP など) を指定し、インターネットやイントラネット上のオブジェクト、ドキュメント、Web ページ、その他のリンク先の場所を指定するアドレスのことです。たとえば、http://www.microsoft.com/ などです。
Connection オブジェクト (ADO) は、データ ソースに対して開かれている接続を表します。
Connection オブジェクトは、データ ソースとの固有のセッションを表します。クライアント/サーバー データベース システムの場合、このオブジェクトは、サーバーへの実際のネットワーク接続に相当します。プロバイダーがサポートする機能によっては、Connection オブジェクトの一部のコレクション、メソッド、またはプロパティを使用できない場合があります。
Connection オブジェクトのコレクション、メソッド、およびプロパティを使用すると、次の操作を実行できます。
前に定義した他のオブジェクトと無関係に Connection オブジェクトを作成できます。
次に示すように、コマンドやストアド プロシージャを Connection オブジェクト固有のメソッドとして実行できます。
コマンドを Connection オブジェクト固有のメソッドとして実行する
コマンドを実行するには、Command オブジェクトの Name プロパティを使用して、コマンドに名前を設定します。Command オブジェクトの ActiveConnection プロパティを該当する接続に設定します。次に、ステートメントを、コマンド名 (Connection オブジェクトのメソッド名として)、パラメーター、Recordset オブジェクト (行を取得する場合) の順に指定して発行します。Recordset プロパティを設定して、結果の Recordset をカスタマイズします。次に例を示します。
Dim cnn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset
...
cnn.Open "..."
cmd.Name = "yourCommandName"
cmd.ActiveConnection = cnn
...
'Your command name, any parameters, and an optional Recordset.
cnn.yourCommandName "parameter", rst
ストアド プロシージャを Connection オブジェクト固有のメソッドとして実行する
ストアド プロシージャを実行するには、ステートメントを、ストアド プロシージャ名 (Connection オブジェクトのメソッド名として)、パラメーターの順に指定して発行します。ADO では、パラメーターの種類について最適なものが推測されます。
次に例を示します。
Dim cnn As New ADODB.Connection
...
'Your stored procedure name and any parameters.
cnn.sp_yourStoredProcedureName "parameter"
外部データベースにリンクしてテーブルを更新
外部データベース(なぜか dBase の .dbf ^_^;)として出力される月報データを、Accessで処理する例です。
VBA で、以下の処理をしています。
1.外部データベースにリンクを追加します。
外部データベースを指定するのに、「ファイルを開くダイアログ 」を、使います。
データベース名は、「年月」が含まれるので、毎月異なります。
2.VBA で SQL を定義して実行します。
クエリの中の参照先のテーブル名を、リンク先のデータベース名(年月入り)に差し替えています。
Dim インポートするファイルのパス As String
Dim 現在のパス As String
Dim Excelアプリケーション As Object 'Excel 参照用
Dim テーブル名 As String
Dim リンク元ファイル名 As String
Dim インポートするファイルのフォルダ As String
Dim 開始日時 As Variant
Dim 終了日時 As Variant
'***************************************************************
Sub dBaseのデータを取り込む()
'***************************************************************
'http://www.ken3.org/backno/hosoku/ETC_021.html
'三流プログラマー Ken3のHPで教えていただいたままです。
'ファイルを開くダイアログを使えるように、エクセルオブジェクトを作成します
Set Excelアプリケーション = CreateObject("Excel.Application")
Excelアプリケーション.Visible = False '小細工でExcelを見えなくする
現在のパス = CurrentProject .Path
' Stop
ChDrive 現在のパス
ChDir 現在のパス
ChDrive 現在のパス
ChDir 現在のパス
インポートするファイルのパス = Excelアプリケーション.GetOpenFilename ("dBASEファイル,*.dbf")
開始日時 = Now ' 開始時刻を変数に格納します。
Call データベースのリンク追加
Call 更新クエリを書き換えて実行
終了日時 = Now
MsgBox "処理時間は、" _
& Format (終了日時 - 開始日時, "hh時間nn分ss秒") & " でした。"
End Sub
Private Sub データベースのリンク追加()
テーブル名 = Left(Dir(インポートするファイルのパス), InStr(Dir(インポートするファイルのパス), ".") - 1)
リンク元ファイル名 = Dir(インポートするファイルのパス)
インポートするファイルのフォルダ = Left(インポートするファイルのパス, InStrRev(インポートするファイルのパス, "\") - 1)
If DLookup ("Name", "MSysObjects", "Type =6 and Name='" & テーブル名 & "'") = Null Then
DoCmd .TransferDatabase acLink , "dBase 5.0", インポートするファイルのフォルダ, acTable , リンク元ファイル名, テーブル名
End If
End Sub
Private Sub 更新クエリを書き換えて実行()
Dim 更新クエリ As String
更新クエリ _
= "UPDATE " & テーブル名 & " INNER JOIN 品番データ ON " & テーブル名 & ".HIN = 品番データ.品番 " _
& "SET 品番データ.機種G = [KSGRP], 品番データ.補性 = [SEI], 品番データ.補性品番 = [HHIN], " _
& "品番データ.海外ランク = [SBTW], 品番データ.統合ランク = [SBTA];"
'警告ダイアログをOFF
DoCmd .SetWarnings False
DoCmd .RunSQL 更新クエリ
'警告ダイアログをON(戻す)
DoCmd .SetWarnings True
End Sub
解説:
DLookup 関数 は、指定されたレコードのセット (定義域) に含まれるフィールドの値を返します。
DLookup 関数は、Visual Basic、マクロ、クエリ式、またはフォームやレポートの演算コントロールで使うことができます。バリアント型 (Variant ) の値を使用します。
expression .DLookup (Expr , Domain , Criteria )
expression 必ず指定します。このトピックの [対象] をクリックして表示される Access オブジェクトのうちの 1 つを返すオブジェクト式を指定します。
Expr 必ず指定します。文字列型 (String ) の値を指定します。
対象となるデータが含まれているフィールドを表す文字列式、またはフィールドの値の計算を表す式です。
expr には、テーブルのフィールド名、フォームのコントロール、定数、組み込み関数、およびユーザー定義関数が指定できます。
ただし、他の定義域集計関数や SQL 集計関数を expr に指定することはできません。
Domain 必ず指定します。文字列型 (String ) の値を指定します。
定義域を構成するレコードを指定する文字列式です。テーブル名またはクエリ名が指定できます。
Criteria 省略可能です。バリアント型 (Variant ) の値を指定します。
DLookup 関数の演算対象となるデータの範囲を指定する文字列式です。
たとえば、criteria には SQL 式の WHERE 句を指定できます (WHERE という語は省略します)。
引数 criteria を省略すると、DLookup 関数は定義域全体に対して expr を適用します。
criteria に含まれるフィールドが domain のフィールドでない場合、DLookup 関数は Null 値を返します。
解説
DLookup 関数を使うと、基になるレコード ソースにないフィールドの値をフォームやレポートに表示することができます。
たとえば、演算コントロールで DLookup 関数を使って、[商品] テーブルにある [商品名] フィールドを、[受注明細] テーブルを基にするフォームに表示することができます。
DLookup 関数は、引数 criteria で指定した情報に基づいてフィールド値を 1 つ返します。引数 criteria は省略可能です。
criteria に適合するレコードがないときや、domain にレコードが含まれないときは、DLookup 関数は Null 値を返します。
DLookup 関数を、リンクが、既存かどうかをチェックするために使う方法は、下記の okuda さんの回答で教えていただきました。
オブジェクトの存在の確認
http://www.accessclub.jp/bbs/0089/beginers32446.html
抽出条件を満たすレコードが複数見つかった場合、DLookup 関数は最初のレコードのフィールド値を返します。DLookup 関数が固有のフィールド値を返すように抽出条件を指定してください。
次の例では、主キーである [社員コード]
フィールドの値を DLookup 関数の抽出条件に使います。
Dim varX As Variant
varX = DLookup("[氏名", "社員", "社員コード = 107"])
DLookup 関数をマクロ、モジュール、クエリ式、または演算コントロールのいずれで使用する場合も、正確な結果を得るために引数 criteria を慎重に設定してください。
DLookup 関数を使って、クエリの [抽出条件] セル、クエリの演算フィールドの式、または更新クエリの [レコードの更新] セルに抽出条件を指定できます。
フォームやレポートの演算コントロールの式で DLookup 関数を使うと、基になるレコード ソースにないフィールドをフォームやレポートに表示することができます。
たとえば、[受注明細] テーブルを基にする[受注明細] フォームに、[商品コード] フィールドを表示する [商品コード] というテキスト ボックスがあるとします。[商品コード] の値に基づいて [商品] テーブルから [商品名] を参照する場合は、別のテキスト ボックスを作成し、その "ControlSource/コントロールソース " プロパティに次の式を設定します。
=Dlookup("[商品名]", "商品", "[商品コード] =" _
& Forms![受注明細]!商品コード)
ヒント
DLookup 関数を使って外部キー側のテーブルのフィールドの値を表示することもできますが、必要なフィールドをすべて含んだクエリを作成し、そのクエリに基づいてフォームやレポートを作成する方が効率的です。
ルックアップ ウィザードを使って外部キー側のテーブルの値を検索することもできます。
メモ domain のレコードを変更しても、保存されていない値は DLookup 関数の演算に反映されません。変更した値を使って計算する場合は、計算前に、[レコード] メニューの [レコードの保存] を選択するか、フォーカスを別のレコードに移動するか、または Update メソッドを使って変更を保存する必要があります。
MSysObjects テーブル:Typeフィールドの値
MS Access Scrapbook で開示していただいていたので、転記させていただきました。
http://accesskid.wordpress.com/2010/10/14/msysobjects-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AEtype%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E5%80%A4/
値
対応するオブジェクト
−32768
Form
−32761
Module
−32764
Report
−32766
Macro
−32758
User
−32757
UserDefined Dcument, SummaryInfo Document (Databases Container の Dcument)
1
Table (名前が MSys で始まるものはシステムオブジェクト)
2
MSysDb Document (Databases Container の Dcument)
3
Collection
4
Link Table (ODBC Link)
5
Query (名前が ~(チルダ) で始まるものはForm, ListBox, ComboBox 各オブジェクトの RecordSourceまたはRowSource
)
6
Link Table (Access Link)
8
Relationship
DoCmd .TransferDatabase メソッド は、Visual Basic で "TransferDatabase/データベース変換" アクションを実行します。
構文
式 .TransferDatabase(TransferType , DatabaseType , DatabaseName , ObjectType , Source , Destination , StructureOnly , StoreLogin )
式 DoCmd オブジェクトを表す変数。
パラメーター
名前 必須/オプション データ型 説明
TransferType オプション AcDataTransferType 変換の種類を指定します。
DatabaseType オプション バリアント型 (Variant) データをインポート、エクスポート、またはリンクするために使うことのできるデータベースの種類の名前を文字列式で指定します。
データベースの種類を次に示します。 Access (既定値) Jet 2.x Jet 3.x dBase III dBase IV dBase 5.0 Paradox 3.x Paradox 4.x Paradox 5.x Paradox 7.x ODBC データベース
WSS
DatabaseName オプション バリアント型 (Variant) データをインポート、エクスポート、またはリンクするために使うデータベースの、パス名も含めた完全な名前を文字列式で指定します。
dBase のデータベースを対象にする場合は、「パス」は、データベースが登録されているフォルダのパスを指定します。ファイル名を含めません。さもないと、下記のエラーになります。
こちら も参照下さい。
実行時エラー '3044':
パス '....' は正しくありません。パス名に間違いがないことと、ファイルが置かれたサーバーに接続していることを確認してください。
ObjectType オプション AcObjectType インポートまたはエクスポートするオブジェクトの種類を指定します。
Source オプション バリアント型 (Variant) データをインポート、エクスポート、またはリンクされる元のオブジェクトの名前を文字列式で指定します。
Destination オプション バリアント型 (Variant) インポート、エクスポート、またはリンクされるオブジェクトの目標のデータベース内での名前を文字列式で指定します。
StructureOnly オプション バリアント型 (Variant) データベース テーブルの構造のみをインポートまたはエクスポートするには、True (-1) を使います。
テーブルの構造とデータをインポートまたはエクスポートするには、False (0) を使います。
この引数を指定しないと、False (既定値) が使われます。
StoreLogin オプション バリアント型 (Variant) ODBC データベースへのログイン識別コード (ID) とパスワードを、データベースからリンクされるテーブルの接続文字列に格納するには、True を使います。
これを設定しておくと、テーブルを開くたびにログインする必要がなくなります。
ログイン ID とパスワードを格納しない場合は False を使います。
この引数を指定しないと、False (既定値) が使われます。
この引数は Visual Basic でのみ利用できます。
ODBC データベースとは、データのインポート、エクスポート、およびリンクを行うときに必要な ODBC ドライバーをサポートするデータベースのことてす。
備考
カレントの Microsoft Office Access データベースまたは Microsoft Office Access プロジェクト (.adp) と、他のデータベースとの間でデータをインポートまたはエクスポートします。
Access データベースでは、他のデータベースからカレント データベースにテーブルをリンクすることもできます。
テーブルをリンクすると、リンク元のデータベースに保存されているテーブルのデータに直接アクセスできます。
リンク テーブルとは、外部のデータベースに保存されており、Access からそのレコードにアクセスできるテーブルのことです。リンク テーブルでは、レコードの追加、削除、および編集はできますが、テーブルの構造を変更することはできません。以前は "アタッチ テーブル" と呼ばれていました。
Access のデータベースと他のデータベースの間で、テーブルのインポートやエクスポートを行うことができます。また、Access の選択クエリを他のデータベースにエクスポートすることもできます。
クエリの結果セットはテーブルとしてエクスポートされます。
Access のデータベース間では、Access のあらゆるデータベース オブジェクトをインポートまたはエクスポートできます。
他の Access のデータベースから、そのデータベース内でリンクされているテーブルをインポートした場合は、インポート後もリンクが維持されます。つまり、テーブル自体ではなく、リンクがインポートされます。
ODBC データベースの管理者は引数 saveloginid で提供される機能を無効にすることができます。この機能を無効にした場合、すべてのユーザーは、ODBC データベースに接続するたびにログイン ID とパスワードを入力する必要があります。
メモ
ActiveX データ オブジェクト (ADO) を使ってリンクを作成するには、Recordset オブジェクトの ActiveConnection プロパティを使います。
次の例では、Access のノースウィンド データベースの [年間売上一覧] レポートを、カレント データベースの [総売上] レポートにインポートします。
DoCmd .TransferDatabase acImport, "Microsoft Access", _
"C:\DBS\NWSales.mdb", acReport, "年間売上一覧", _
"総売上"
次の例では、ODBC データベースの [Authors] テーブルをカレント データベースにリンクします。
DoCmd .TransferDatabase acLink, "ODBC Database", _
"ODBC;DSN=DataSource1;UID=User2;PWD=www;LANGUAGE=us_english;" _
& "DATABASE=pubs", acTable, "Authors", "dboAuthors"
DoCmd .TransferDatabase acLink, "dBase IV", "C:\DataDir", acTable, "TheDBF", "TheTable"
AcDataTransferType は、TransferDatabase メソッドまたは TransferSpreadsheet メソッドで行う変換の種類を指定します。
名前 値 説明
acExport 1 データがエクスポートされます。
acImport 0 (既定値) データがインポートされます。
acLink 2 指定したデータ ソースにデータベースをリンクします。
備考
定数 acLink は Access プロジェクト (.adp) をサポートしていません。
AcObjectType は、オブジェクトの種類を指定します。
名前 値 説明
acDatabaseProperties 11 Database プロパティ
acDefault -1
acDiagram 8 データベース ダイアグラム (Access プロジェクト)
acForm 2 フォーム
acFunction 10 関数
acMacro 4 マクロ
acModule 5 モジュール
acQuery 1 クエリ
acReport 3 レポート
acServerView 7 サーバー ビュー
acStoredProcedure 9 ストアド プロシージャ (Access プロジェクト)
acTable 0 テーブル
acTableDataMacro 12 データ マクロ
外部データベースのリンクを更新してテーブルを更新
上では、月次のデータベースのリンクを追加 して、これに合わせてクエリを変更した上で、Access のテーブルを更新していました。
この別解の例では、月次のデータベースのリンクテーブルのテーブル名を変えずに、リンク元のパス(データベース名)を変えています。
こうすることで、クエリを変更せずに、Access テーブルを更新できます。
追記:データベースのリンク更新で、データベース名を変更できませんでした。
このため、リンクをいったん削除して、再度追加することで、データベース名を変更しています。
Option Compare Database
Option Explicit
Dim インポートするファイルのパス As String
Dim 現在のパス As String
Dim Excelアプリケーション As Object 'Excel 参照用
Dim リンク元ファイル名 As String
Dim インポートするファイルのフォルダ As String
Dim 開始日時 As Variant
Dim 終了日時 As Variant
Dim 削除クエリ As String
'***************************************************************
Sub dBaseのデータを取り込む()
'***************************************************************
'http://www.ken3.org/backno/hosoku/ETC_021.html
'三流プログラマー Ken3のHPで教えていただいたままです。
'ファイルを開くダイアログを使えるように、エクセルオブジェクトを作成します
Set Excelアプリケーション = CreateObject("Excel.Application")
Excelアプリケーション.Visible = False '小細工でExcelを見えなくする
現在のパス = CurrentProject.Path
' Stop
ChDrive 現在のパス
ChDir 現在のパス
ChDrive 現在のパス
ChDir 現在のパス
インポートするファイルのパス = Excelアプリケーション.GetOpenFilename ("dBASEファイル,*.dbf")
開始日時 = Now ' 開始時刻を変数に格納します。
Call データベースのリンク更新 'ファイル名を変更できなかった。このため、削除・追加で更新する。
Call データベースのリンク削除
Call データベースのリンク追加
Call 用品品番差し替え
終了日時 = Now
MsgBox "処理時間は、" _
& Format(終了日時 - 開始日時, "hh時間nn分ss秒") & " でした。"
End Sub
Private Sub 用品品番差し替え()
削除クエリ = "DELETE * FROM [用品品番];"
'警告ダイアログをOFF
DoCmd .SetWarnings False
DoCmd .RunSQL 削除クエリ
DoCmd .OpenQuery "☆用品品番抽出ソート"
'警告ダイアログをON(戻す)
DoCmd .SetWarnings True
End Sub
Private Sub データベースのリンク更新()
Dim データベース As DAO.Database, テーブル As DAO.TableDef
'VBAの画面の、[ツール] - [参照設定]で、DAOオブジェクトライブラリの参照設定を追加する。
Set データベース = CurrentDb
Set テーブル = データベース.TableDefs("BMF今月")
インポートするファイルのフォルダ = Left(インポートするファイルのパス, InStrRev(インポートするファイルのパス, "\") - 1)
リンク元ファイル名 = Dir(インポートするファイルのパス)
テーブル.Connect = "dBASE 5.0;DATABASE=" & インポートするファイルのフォルダ & ";TABLE=" & リンク元ファイル名
テーブル.RefreshLink ' リンク情報の更新
End Sub
Private Sub データベースのリンク追加()
リンク元ファイル名 = Dir(インポートするファイルのパス)
インポートするファイルのフォルダ = Left(インポートするファイルのパス, InStrRev(インポートするファイルのパス, "\") - 1)
DoCmd .TransferDatabase acLink, "dBase 5.0", インポートするファイルのフォルダ, acTable, リンク元ファイル名, "BMF今月"
End Sub
Private Sub データベースのリンク削除()
If テーブル存在 ("BMF今月") = True Then
'警告ダイアログをOFF
DoCmd .SetWarnings False
DoCmd .DeleteObject acTable, "BMF今月"
'警告ダイアログをON(戻す)
DoCmd .SetWarnings True
End If
End Sub
Public Function テーブル存在(テーブル名 As String) As Boolean
'http://www.accessclub.jp/bbs5/0016/vba4558.html
'テーブルの存在有無を確認する
'hatena さんの書き込みより
On Error Resume Next
テーブル存在 = CurrentDb.TableDefs (テーブル名).Name = テーブル名
End Function
解説:
Connect プロパティ は、開いている接続、データベース、パススルー クエリー で使用されるデータベース、およびリンク テーブル のソースに関する情報を提供する値を設定または返します。
Database オブジェクト、新しい Connection オブジェクト、リンク テーブル、およびコレクションにまだ追加されていない TableDef オブジェクトの場合、Connect プロパティは、読み取り/書き込みが可能です。
QueryDef オブジェクトとベース テーブル の場合は、このプロパティは読み取り専用です。
構文
object .Connect = databasetype ;parameters ;
Connect プロパティには、次の指定項目があります。
指定項目
説明
object
評価結果が "対象" 一覧にあるオブジェクトを参照するオブジェクト式 です。
databasetype
(省略可能) データベースの種類を指定する文字列型 (String) 。
Jet データベース では、この引数は省略します。
引数 parameters を指定する場合、セミコロン (;) をプレースホルダとして使用します。
parameters
(省略可能) ODBC ドライバまたは組み込み可能な ISAM ドライバに渡される追加のパラメータを指定する文字列型 (String ) の値です。
複数のパラメータを指定する場合は、セミコロン (;) で区切ります。
設定値
Connect プロパティの設定値は文字列型 (
String ) の値で、データベースの種類を指定する文字列と、セミコロンで区切られたパラメータで構成されます。
ただし、パラメータは省略可能です。
Connect プロパティは、必要に応じて ODBC ドライバや特定の ISAM ドライバに付加情報を渡すことができます。
Jet データベースの拡張子 .mdb を持つファイルにリンクしているテーブルに対して、SQL パススルー クエリーを実行するには、まず、リンク テーブルのデータベースの
Connect プロパティに有効な ODBC
接続文字列 を設定します。
リンク テーブルを表す
TableDef オブジェクトの場合、
Connect プロパティの設定値は 1 つまたは 2 つの部分 (データベースの種類を指定する文字列とデータベースへのパス) で構成され、各部分の最後にセミコロン (;) が付きます。
次の表は、使用可能なデータベースの種類と、それに対応するデータベースの指定子とパスの一覧です。
データベースの指定子とパスを組み合わせて Connect プロパティを設定します。
ODBCDirect ワークスペースでは "ODBC" 指定子のみを使用することができます。
この表のパスは、データベース ファイルが含まれるフォルダのフル パスで、識別子 "DATABASE=" の後に続けて指定します。
Excel および Jet データベースなどを指定した場合は、具体的なファイル名をデータベース パスの引数に含めます。
データベースの種類
指定子
例
Jet データベース
[database ];
drive :\path \filename.mdb
dBASE III
dBASE III;
drive :\path
dBASE IV
dBASE IV;
drive :\path
dBASE 5
dBASE 5.0;
drive: \path
Paradox 3.x
Paradox 3.x;
drive :\path
Paradox 4.x
Paradox 4.x;
drive :\path
Paradox 5.x
Paradox 5.x;
drive: \path
Microsoft Excel 3.0
Excel 3.0;
drive: \path \filename.xls
Microsoft Excel 4.0
Excel 4.0;
drive: \path \filename.xls
Microsoft Excel 5.0 または Microsoft Excel 95
Excel 5.0;
drive: \path \filename.xls
Microsoft Excel 97
Excel 8.0;
drive: \path \filename.xls
Lotus 1-2-3 WKS and WK1
Lotus WK1;
drive:\path\filename.wk1
Lotus 1-2-3 WK3
Lotus WK3;
drive:\path\filename.wk3
Lotus 1-2-3 WK4
Lotus WK4;
drive:\path\filename.wk4
HTML Import
HTML Import;
drive: \path \filename
HTML Export
HTML Export;
drive: \path
Text
Text;
drive: \path
ODBC
ODBC;DATABASE=database ;
UID=user ; PWD=password ;
DSN= datasourcename ;
[LOGINTIMEOUT=seconds ;]
なし
Microsoft Exchange
Exchange 4.0;
MAPILEVEL=folderpath ;
[TABLETYPE={ 0 | 1 }];
[PROFILE=profile ;]
[PWD=password ;]
[DATABASE=database ;]
drive :\path \filename.mdb
解説
指定子が "ODBC;" のみの場合、登録されているすべての
ODBC データ ソース 名を一覧表示するダイアログ ボックスが
ODBC ドライバ によって表示され、この中からデータベースを選択することができます。
Jet 4.0 では、FoxPro ISAM はサポートされなくなりました。代りに、FoxPro ODBC ドライバを使用してください。
パスワードが必要な場合に、
Connect プロパティでパスワードが設定されていないと、テーブルに最初にアクセスするときに、ODBC ドライバによって [ログイン] ダイアログ ボックスが表示されます。また、接続を閉じて再度開いた場合にも、[ログイン] ダイアログ ボックスが表示されます。
Exchange のデータの場合、必要な MAPILEVEL キーには、フォルダのフル パスを設定する必要があります (たとえば、"Mailbox - Pat SmithIAlpha/Today")。このパスには、テーブルとして開かれるフォルダ名は含まれません。その代わりに、そのフォルダ名は、
CreateTable メソッドに対して、引数
name として指定します。フォルダを開く場合は TABLETYPE キーを "0" (既定値) に、アドレス帳を開く場合は "1" に設定する必要があります。PROFILE キーの既定値は、現在使用しているプロファイルになります。
Jet データベース (.mdb) のベース テーブルの場合、
Connect プロパティの設定値は、
長さ 0 の文字列 ("") になります。
OpenDatabase メソッドに引数
source を指定すると、
Database オブジェクトの
Connect プロパティを設定できます。この設定値を調べると、そのデータベースの種類、パス、ユーザー ID、パスワード、および ODBC データ ソースを確認できます。
Jet ワークスペース の
QueryDef オブジェクトの場合、
Connect プロパティを
ReturnsRecords プロパティと共に使用して ODBC SQL パススルー クエリーを作成します。接続文字列の
databasetype は "ODBC;" です。それ以外の部分には、リモート データにアクセスするために使用する ODBC ドライバに一意な情報が含まれます。詳細については、それぞれのドライバのマニュアルを参照してください。
メモ
Connect プロパティの設定は、ReturnsRecords プロパティを設定する前に行う必要があります。
アクセスするデータベース サーバーを含むコンピュータへのアクセス権を持っている必要があります。
RefreshLink メソッド は、リンク テーブルの接続情報を更新します。これは Jet ワークスペース でのみ使用することができます。
構文
tabledef .RefreshLink
プレースホルダ
tabledef は、接続情報を更新する対象となるリンク テーブルを表す TableDef オブジェクトを指定します。
解説
リンク テーブルの接続情報を変更する場合、対応する
TableDef オブジェクトの
Connect プロパティを再設定し、
RefreshLink メソッドを使用して接続情報を更新します。
RefreshLink メソッドを使用しても、リンク テーブルのプロパティと Relation オブジェクトは変更されません。
リンク テーブルを表す
TableDef オブジェクトに関連するすべてのコレクションにこの接続情報を反映させる場合には、コレクションごとに Refresh メソッドを使用してください。
次の例は、RefreshLink メソッドを使用して、リンク テーブルの接続があるデータ ソースから別のデータ ソースに変更された後に、リンク テーブルのデータを更新します。
このプロシージャを実行するには、RefreshLinkOutput プロシージャが必要です。
Sub RefreshLinkX()
Dim dbsCurrent As Database
Dim tdfLinked As TableDef
' リンク テーブルが追加されたデータベースを開きます。
Set dbsCurrent = OpenDatabase("DB1.mdb")
' Microsoft SQL Server データベースを指定している
' リンク テーブルを作成します。
Set tdfLinked = _
dbsCurrent.CreateTableDef("AuthorsTable")
tdfLinked.Connect = _
"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers"
tdfLinked.SourceTableName = "authors"
dbsCurrent.TableDefs.Append tdfLinked
' リンク テーブルの内容を表示します。
Debug.Print _
"Data from linked table connected to first source:"
RefreshLinkOutput dbsCurrent
' リンク テーブルの接続情報を変更し
' 新しいデータを使用可能にするために、接続を更新します。
tdfLinked.Connect = _
"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=NewPublishers"
tdfLinked.RefreshLink
' リンク テーブルの内容を表示します。
Debug.Print _
"Data from linked table connected to second source:"
RefreshLinkOutput dbsCurrent
' ここではデモとしてリンク テーブルを削除します。
dbsCurrent.TableDefs.Delete tdfLinked.Name
dbsCurrent.Close
End Sub
Sub RefreshLinkOutput(dbsTemp As Database)
Dim rstRemote As Recordset
Dim intCount As Integer
' リンク テーブルを開きます。
Set rstRemote = _
dbsTemp.OpenRecordset("AuthorsTable")
intCount = 0
' Recordset を列挙し
' その数が 50 になったら列挙を中止します。
With rstRemote
Do While Not .EOF And intCount < 50
Debug.Print , .Fields(0), .Fields(1)
intCount = intCount + 1
.MoveNext
Loop
If Not .EOF Then Debug.Print , "[more records]"
.Close
End With
End Sub
TableDefs コレクション には、データベースに格納されている TableDef オブジェクトがすべて含まれています。これは Jet ワークスペース でのみ使用することができます。
テーブル定義の操作は、TableDef オブジェクトとそのメソッドおよびプロパティを使用して行います。
Database オブジェクトの既定コレクションは TableDefs コレクションです。
序数や Name プロパティを使用して、コレクションに含まれる TableDef オブジェクトを参照する場合は、次のいずれの構文も使用できます。
TableDefs (0)
TableDefs ("name ")
TableDefs ![name ]
テーブル名の変更と、テーブル構造のコピー
VBA で既存テーブルのテーブル名を変更 する事例。
および、既存テーブルの「構造」だけをコピー して、新しいテーブルを追加する例です。
Option Compare Database
Option Explicit
Dim インポートするファイルのパス As String
Dim 現在のパス As String
Dim Excelアプリケーション As Object 'Excel 参照用
Dim テーブル名 As String
Dim リンク元ファイル名 As String
Dim インポートするファイルのフォルダ As String
Dim 前月テーブル名 As String
Dim 指定するファイルの種類 As String
Dim テーブル名前月 As String
Dim 年月 As String
Dim 前年月 As String
Dim 開始日時 As Variant
Dim 終了日時 As Variant
Sub 処理()
MsgBox "次の処理で、dBASEのBMF を指定します。"
指定するファイルの種類 = "dBASEファイル,*.dbf"
Call インポートするファイルのパスを取得
Call データベースのリンク更新 'ファイル名を変更できなかった。このため、削除・追加で更新する。
Call データベースのリンク削除
Call データベースのリンク追加
MsgBox "次の処理で、エラーリストを指定します。"
指定するファイルの種類 = "テキストファイル,*.csv"
Call インポートするファイルのパスを取得
開始日時 = Now ' 開始時刻を変数に格納します。
テーブル名 = Left(Dir(インポートするファイルのパス), InStr(Dir(インポートするファイルのパス), ".") - 1)
'ダウンロードしたファイル名。拡張子なし
リンク元ファイル名 = Dir(インポートするファイルのパス)
インポートするファイルのフォルダ = Left(インポートするファイルのパス, InStrRev(インポートするファイルのパス, "\") - 1)
'Stop
年月 = Mid(テーブル名, InStr(テーブル名, "(") + 1, 6)
If Val(Right(年月, 2)) = 1 Then
前年月 = CStr(Val(Left(年月, 4) - 1)) & "12"
Else
前年月 = Left(年月, 4) & Right("0" & CStr(Val(Right(年月, 2)) - 1), 2)
End If
Call 既存テーブルの名前を変更
Call テキストファイルを定義を使ってインポート
Call 既存テーブルの構造のみコピー
Call 追加クエリでキー重複を除外
Call 更新クエリを実行
終了日時 = Now
MsgBox "処理時間は、" _
& Format(終了日時 - 開始日時, "hh時間nn分ss秒") & " でした。"
End Sub
Private Sub 更新クエリを実行()
'警告ダイアログをOFF
DoCmd .SetWarnings False
'クエリを実行する
DoCmd .OpenQuery "☆BMFの情報追記"
'更新クエリを実行。
'(BMFから、dBASE存在と、dBASEのMPDCと、新品目が、テーブル「エラーリスト品番キー」にコピーされる)
DoCmd .OpenQuery "☆用品CRの追記"
'10.クエリ「☆用品CRの追記」で、「用」を追記
'警告ダイアログをON(戻す)
DoCmd .SetWarnings True
End Sub
Private Sub 追加クエリでキー重複を除外()
Dim 追加クエリ As String
追加クエリ = "INSERT INTO エラーリスト品番キー ( 品番, 分類, 品名 ) " _
& "SELECT [エラーリスト(" & 年月 & ")].品番, [エラーリスト(" & 年月 & ")].分類, [エラーリスト(" & 年月 & ")].品名 " _
& "FROM [エラーリスト(" & 年月 & ")];"
'警告ダイアログをOFF
DoCmd .SetWarnings False
DoCmd .RunSQL 追加クエリ
'警告ダイアログをON(戻す)
DoCmd .SetWarnings True
End Sub
Private Sub 既存テーブルの構造のみコピー ()
DoCmd .TransferDatabase acExport, "Microsoft Access", CurrentDb.Name, acTable, _
"エラーリスト(" & 前年月 & ")品番キー", "エラーリスト品番キー", True
End Sub
Private Sub テキストファイルを定義を使ってインポート()
' http://okwave.jp/qa/q1691138.html
' Access にマクロでテキストファイルをインポートする
' インポートするレイアウトに合ったテーブルがあること
' インポート定義があること
' (定義の作り方は、ファイル→外部データの取り込み→インポート→設定で定義を作成)
' あとは、以下のコードを変更
' DoCmd .TransferText acImportFixed, "定義名", "データを格納するテーブル名", "C:\..テキストのパス....txt", False, ""
'警告ダイアログをOFF
DoCmd .SetWarnings False
DoCmd .TransferText acImportFixed, "エラーリストのインポート定義", テーブル名, インポートするファイルのパス, False, ""
'警告ダイアログをON(戻す)
DoCmd .SetWarnings True
End Sub
Private Sub 既存テーブルの名前を変更 ()
DoCmd .Rename "エラーリスト(" & 前年月 & ")品番キー", acTable, "エラーリスト品番キー"
End Sub
Private Sub インポートするファイルのパスを取得()
'http://www.ken3.org/backno/hosoku/ETC_021.html
'三流プログラマー Ken3のHPで教えていただいたままです。
'ファイルを開くダイアログを使えるように、エクセルオブジェクトを作成します
Set Excelアプリケーション = CreateObject("Excel.Application")
Excelアプリケーション.Visible = False '小細工でExcelを見えなくする
現在のパス = CurrentProject.Path
' Stop
ChDrive 現在のパス
ChDir 現在のパス
ChDrive 現在のパス
ChDir 現在のパス
インポートするファイルのパス = Excelアプリケーション.GetOpenFilename (指定するファイルの種類)
End Sub
Private Sub データベースのリンク更新()
Dim データベース As DAO.Database, テーブル As DAO.TableDef
'VBAの画面の、[ツール] - [参照設定]で、DAOオブジェクトライブラリの参照設定を追加する。
Set データベース = CurrentDb
Set テーブル = データベース.TableDefs("BMF今月")
インポートするファイルのフォルダ = Left(インポートするファイルのパス, InStrRev(インポートするファイルのパス, "\") - 1)
リンク元ファイル名 = Dir(インポートするファイルのパス)
Stop
テーブル.Connect = "dBASE 5.0;DATABASE=" & インポートするファイルのフォルダ & ";TABLE=" & リンク元ファイル名
テーブル.RefreshLink ' リンク情報の更新
End Sub
Private Sub データベースのリンク追加()
テーブル名 = Left(Dir(インポートするファイルのパス), InStr(Dir(インポートするファイルのパス), ".") - 1)
リンク元ファイル名 = Dir(インポートするファイルのパス)
インポートするファイルのフォルダ = Left(インポートするファイルのパス, InStrRev(インポートするファイルのパス, "\") - 1)
DoCmd .TransferDatabase acLink, "dBase 5.0", インポートするファイルのフォルダ, acTable, リンク元ファイル名, "BMF今月"
End Sub
Private Sub データベースのリンク削除()
If テーブル存在 ("BMF今月") = True Then
'警告ダイアログをOFF
DoCmd .SetWarnings False
DoCmd .DeleteObject acTable, "BMF今月"
'警告ダイアログをON(戻す)
DoCmd .SetWarnings True
End If
End Sub
解説:
DoCmd .Rename メソッド は、Visual Basic で "Rename/名前の変更" アクションを実行します。
expression .Rename (New Name , ObjectType , Old Name )
expression 必ず指定します。
DoCmd オブジェクトを表すオブジェクト式を指定します。
NewName 必ず指定します。バリアント型 (
Variant ) の値を指定します。名前を変更するオブジェクトの新しい名前を、文字列式で指定します。この名前は、Access オブジェクトの名前付け規則に従う必要があります。
ObjectType 省略可能です。名前を変更するオブジェクトの種類を指定します。
AcObjectType クラスの定数を使用します。
OldName 省略可能です。バリアント型 (
Variant ) の値を指定します。引数
ObjectType で指定した種類のオブジェクトの有効な名前を文字列式で指定します。
Rename メソッドを含む Visual Basic コードをライブラリ データベースで実行すると、この名前のオブジェクトが、最初にライブラリ データベースで、次にカレント データベースで検索されます。
引数
ObjectType および
OldName を指定しないと、
ObjectType には定数
acDefault (既定値) が使われ、データベース ウィンドウで選択されたオブジェクトの名前が変更されます。
データベース ウィンドウでオブジェクトを選択するには、"SelectObject/オブジェクトの選択" アクション、または引数 In Database Window に Yes (
True ) を設定した
SelectObject メソッドを使うことができます。
引数
ObjectType と引数
OldName を指定しない場合は、引数
NewName の後ろにはカンマは付けません。
次の例では、[社員] テーブルの名前が変更されます。
DoCmd .Rename "前社員テーブル", acTable, "社員"
DoCmd .DeleteObject メソッド は、DeleteObject/オブジェクトの削除 アクションを実行します。
expression .DeleteObject (ObjectType , ObjectName )
expression 必ず指定します。このトピックの [対象] をクリックして表示される Access オブジェクトのうちの 1 つを返すオブジェクト式を指定します。
ObjectType 省略可能です。AcObjectType クラスの定数を使用します。
ObjectName 省略可能です。バリアント型 (Variant ) の値を指定します。引数 objecttype で選択した種類のオブジェクトの有効な名前を文字列式で指定します。
DeleteObject メソッドを含む Visual Basic コードをライブラリ データベースで実行する場合は、この名前のオブジェクトが、最初にライブラリ データベースで、次にカレント データベースで探索されます。
引数 objecttype および objectname を指定しないと、objecttype には定数 acDefault (既定値) が使われ、データベース ウィンドウで選択されたオブジェクトが削除されます。
データベース ウィンドウでオブジェクトを選択するには、"SelectObject/オブジェクトの選択" アクション、または引数 In Database Window に Yes (True ) を設定した SelectObject メソッドを使うことができます。
次の例では、指定したテーブルを削除します。
DoCmd .DeleteObject acTable, "前社員テーブル"