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でお仕事 目次に戻る

テキストをインポート

 テキスト・ファイルとして出力される月報ファイルを、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 オブジェクトのメソッド
名前説明
AddMenuVisual Basic で "AddMenu/メニューの追加" アクションを実行します。
ApplyFilterApplyFilter メソッドは、Visual Basic で "ApplyFilter/フィルターの実行" アクションを実行します。
BeepVisual Basic で "Beep/警告音" アクションを実行します。
BrowseToBrowseTo メソッドは、Visual Basic で "参照先" アクションを実行します。
CancelEventVisual Basic で "CancelEvent/イベントのキャンセル" アクションを実行します。
ClearMacroErrorMacroError オブジェクトに格納されているエラーについての情報を削除します。
CloseVisual Basic で "Close/閉じる" アクションを実行します。
CloseDatabaseカレント データベースを閉じます。
CopyDatabaseFileカレント プロジェクトに接続されたデータベースを SQL Server データベース ファイルにコピーしてエクスポートします。
CopyObjectVisual Basic で "CopyObject/オブジェクトのコピー" アクションを実行します。
DeleteObjectVisual Basic で "DeleteObject/オブジェクトの削除" アクションを実行します。
DoMenuItemAccess に対して適切なメニューまたはツールバー コマンドが表示されます。
EchoVisual Basic で "Echo/エコー" アクションを実行します。
FindNextFindNext メソッドは、Visual Basic で "FindNext/次を検索" アクションを実行します。
FindRecordVisual Basic で "FindRecord/レコードの検索" アクションを実行します。
GoToControlVisual Basic で "GoToControl/コントロールの移動" アクションを実行します。
GoToPageVisual Basic で "GoToPage/ページの移動" アクションを実行します。
GoToRecordVisual Basic で "GoToRecord/レコードの移動" アクションを実行します。
HourglassVisual Basic で "Hourglass/砂時計ポインター" アクションを実行します。
LockNavigationPaneLockNavigationPane アクションを使用すると、ナビゲーション ウィンドウに表示されているデータベース オブジェクトをユーザーが削除できないように指定できます。
MaximizeVisual Basic で "Maximize/最大化" アクションを実行します。
MinimizeVisual Basic で "Minimize/最小化" アクションを実行します。
MoveSizeVisual Basic で "MoveSize/サイズ変更" アクションを実行します。
NavigateToNavigateTo メソッドを使用すると、ナビゲーション ウィンドウでのデータベース オブジェクトの表示を制御できます。
OpenDataAccessPageVisual Basic で "OpenDataAccessPage/データアクセスページを開く" アクションを実行します。
OpenDiagramVisual Basic で "OpenDiagram/ダイアグラムを開く" アクションを実行します。
OpenFormVisual Basic で "OpenForm/フォームを開く" アクションを実行します。
OpenFunctionMicrosoft SQL Server データベースのユーザー定義関数を開き、Access で表示します。
OpenModuleVisual Basic で "OpenModule/モジュールを開く" アクションを実行します。
OpenQueryVisual Basic で "OpenQuery/クエリを開く" アクションを実行します。
OpenReportVisual Basic で "OpenReport/レポートを開く" アクションを実行します。
OpenStoredProcedureVisual Basic で "OpenStoredProcedure/ストアドプロシージャを開く" アクションを実行します。
OpenTableVisual Basic で "OpenTable/テーブルを開く" アクションを実行します。
OpenViewOpenView メソッドは、Visual Basic で "OpenView/フィルターの実行" アクションを実行します。
OutputToVisual Basic で "OutputTo/出力" アクションを実行します。
PrintOutVisual Basic で "PrintOut/印刷" アクションを実行します。
QuitMicrosoft Access を終了します。引数 Options の指定によって、終了の前にデータベース オブジェクトを保存することができます。
RefreshRecordRefreshRecord メソッドは、Visual Basic から RefreshRecord マクロ操作を実行します。
RenameVisual Basic で "Rename/名前の変更" アクションを実行します。
RepaintObjectVisual Basic で "RepaintObject/オブジェクトの再描画" アクションを実行します。
RequeryVisual Basic で "Requery/再クエリ" アクションを実行します。
RestoreVisual Basic で "Restore/元のサイズに戻す" アクションを実行します。
RunCommand組み込みコマンドを実行します。
RunDataMacroVisual Basic から名前付きデータ マクロを実行するには、RunDataMacro メソッドを使用します。
RunMacroVisual Basic で "RunMacro/マクロの実行" アクションを実行します。
RunSavedImportExport保存済みのインポート仕様またはエクスポート仕様を実行します。
RunSQLVisual Basic で "RunSQL/SQL の実行" アクションを実行します。
SaveVisual Basic で "Save/オブジェクトの保存" アクションを実行します。
SearchForRecordSearchForRecord メソッドを使用して、テーブル、クエリ、フォーム、またはレポート内の特定のレコードを検索することができます。
SelectObjectVisual Basic で "SelectObject/オブジェクトの選択" アクションを実行します。
SendObjectVisual Basic で "SendObject/オブジェクトの送信" アクションを実行します。
SetDisplayedCategoriesナビゲーション ウィンドウのタイトル バーの [カテゴリに移動] の下に表示するカテゴリを指定します。
SetFilterアクティブなデータシート、フォーム、レポート、またはテーブル内のレコードにフィルターを適用するには、SetFilter メソッドを使用します。
SetMenuItemVisual Basic で "SetMenuItem/メニューの設定" アクションを実行します。
SetOrderByアクティブなデータシート、フォーム、レポート、またはテーブルに並べ替えを適用するには、SetOrderBy メソッドを使用します。
SetParameterBrowseTo OpenFormOpenQueryOpenReport、または RunDataMacro メソッドで使用されるパラメーターを作成するには、SetParameter メソッドを使用します。
SetPropertyVisual Basic で "SetProperty/プロパティの設定" アクションを実行します。
SetWarningsVisual Basic で "SetWarnings/メッセージの設定" アクションを実行します。
ShowAllRecordsVisual Basic で "ShowAllRecords/全レコードの表示" アクションを実行します。
ShowToolbarVisual Basic で "ShowToolbar/ツールバーの表示" アクションを実行します。
SingleStepマクロの実行を一時中断して [マクロのシングル ステップ] ダイアログ ボックスを表示します。
TransferDatabaseVisual Basic で "TransferDatabase/データベース変換" アクションを実行します。
TransferSharePointListTransferSharePointList メソッドは、Windows SharePoint Services 3.0 サイトのデータをインポートまたはリンクするために使用します。
TransferSpreadsheetVisual Basic で "TransferSpreadsheet/ワークシート変換" アクションを実行します。
TransferSQLDatabase指定された SQL Server データベース全体を別の SQL Server データベースに転送します。
TransferTextVisual Basic で "TransferText/テキスト変換" アクションを実行します。

 DoCmd オブジェクトでは、次のアクションに対応するメソッドはサポートされていません。

メニューとは、メニュー バーのメニュー名をクリックすると表示されるコマンドの一覧のことです。ツール バーをクリックすると表示されるコマンド一覧もあります。

ツール バーとは、コマンドを実行するのに使用するボタンやオプションを含むバーのことです。ツール バーを表示するには、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) では、acImportDelimacImportFixedacExportDelimacExportFixed、または 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 ファイル内のテーブルあるいは一覧の名前を文字列式で指定します。
この引数は、引数 transfertypeacImportHTML または 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)を使って、変換の種類を指定します。
名前説明
acExportDelim2区切り記号付きエクスポート
acExportFixed3固定長エクスポート
acExportHTML8HTML エクスポート
acExportMerge4Word 差し込みデータ エクスポート



acImportDelim0区切り記号付きインポート
acImportFixed1固定長インポート
acImportHTML7HTML インポート



acLinkDelim5区切り記号付きリンク
acLinkFixed6固定長リンク
acLinkHTML9HTML リンク


 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 オブジェクト の メソッド
名前説明
AddSharedImageインポートする画像を指定し、SharedResources コレクションに追加します。
CloseConnectionMicrosoft Office Access プロジェクト (.adp) または Access データベースの CurrentProject オブジェクトと、プロジェクトの基本の接続文字列で指定したデータベースとの間の現在の接続を終了します。
OpenConnection既存の Microsoft Office Access プロジェクト (.adp) または Access データベースへの ADO 接続を、カレント プロジェクトまたはカレント データベースとして Microsoft Office Access ウィンドウで開きます。
UpdateDependencyInfoデータベースの依存情報を更新します。

 CurrentProject オブジェクト の プロパティ
名前説明
AccessConnection現在の Microsoft ActiveX データ オブジェクト (ADO) の Connection オブジェクトおよびその関連プロパティへの参照を取得します。
値の取得のみ可能です。Connection オブジェクト型の値を使用します。
AllFormsAllForms プロパティを使用すると、AllForms コレクションおよびその関連プロパティを参照できます。
値の取得のみ可能です。AllForms オブジェクト型の値を使用します。
AllMacrosAllMacros プロパティを使用すると、AllMacros コレクションおよびその関連プロパティを参照できます。
値の取得のみ可能です。AllMacros オブジェクト型の値を使用します。
AllModulesAllModules プロパティを使用すると、AllModules コレクションおよびその関連プロパティを参照できます。
値の取得のみ可能です。AllModules オブジェクト型の値を使用します。
AllReportsAllReports プロパティを使用すると、AllReports コレクションおよびその関連プロパティを参照できます。
値の取得のみ可能です。AllReports オブジェクト型の値を使用します。
ApplicationApplication プロパティを使用すると、アクティブな Microsoft Office Access の Application オブジェクトとその関連プロパティにアクセスできます。
値の取得のみ可能です。Application オブジェクト型の値を使用します。
BaseConnectionStringBaseConnectionString プロパティは、指定したオブジェクトの基本の接続文字列を取得するために使用します。
値の取得のみ可能です。文字列型 (String) の値を使用します。
Connection現在の ActiveX データ オブジェクト (ADO) の Connection オブジェクトおよびその関連プロパティへの参照を取得します。
値の取得のみ可能です。Connection オブジェクト型の値を使用します。
FileFormat指定したプロジェクトのファイル形式に対応する Access のバージョンを示す AcFileFormat 定数を取得します。値の取得のみ可能です。
FullName特定のオブジェクトの完全パス (ファイル名を含む) を設定または取得します。
値の取得のみ可能です。文字列型 (String) の値を使用します。
ImportExportSpecifications指定されたオブジェクトに対する、保存済みのインポート操作またはエクスポート操作のコレクションを表す ImportExportSpecifications コレクションを返します。
値の取得のみ可能です。
IsConnectedCurrentProject オブジェクトが現在接続されているかどうかを示します。
値の取得のみ可能です。ブール型 (Boolean) の値を使用します。
IsTrusted現在のプロジェクトでマクロおよび Visual Basic for Applications (VBA) コードが有効かどうかを示します。
値の取得のみ可能です。ブール型 (Boolean) の値を使用します。
IsWebデータベースが Web データベースかどうかを取得します。
値の取得のみ可能です。ブール型 (Boolean) の値を使用します。
Name"Name/名前" プロパティを使用すると、オブジェクトの名前を示す文字列式を取得できます。
値の取得のみ可能です。文字列型 (String) の値を使用します。
Parent指定されたオブジェクトの親オブジェクトを取得します。
値の取得のみ可能です。
PathPath プロパティは、Microsoft Office Access プロジェクト (.adp) または Microsoft Office Access データベースのデータを格納する場所を示します。
値の取得のみ可能です。文字列型 (String) の値を使用します。
ProjectType現在開いているプロジェクトの種類を示します。
値の取得のみ可能です。AcProjectType クラスの定数を使用します。
PropertiesCurrentProject オブジェクトの 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"

このページのトップに戻る↑ Accessでお仕事 目次に戻る

外部データベースにリンクしてテーブルを更新

 外部データベース(なぜか 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![受注明細]!商品コード)

ヒント

 メモ   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 メソッドで行う変換の種類を指定します。
名前説明
acExport1データがエクスポートされます。
acImport0(既定値) データがインポートされます。
acLink2指定したデータ ソースにデータベースをリンクします。
 備考
定数 acLink は Access プロジェクト (.adp) をサポートしていません。


AcObjectType は、オブジェクトの種類を指定します。
名前説明
acDatabaseProperties11Database プロパティ
acDefault-1
acDiagram8データベース ダイアグラム (Access プロジェクト)
acForm2フォーム
acFunction10関数
acMacro4マクロ
acModule5モジュール
acQuery1クエリ
acReport3レポート
acServerView7サーバー ビュー
acStoredProcedure9ストアド プロシージャ (Access プロジェクト)
acTable0テーブル
acTableDataMacro12データ マクロ

このページのトップに戻る↑ Accessでお仕事 目次に戻る

外部データベースのリンクを更新してテーブルを更新

 上では、月次のデータベースのリンクを追加して、これに合わせてクエリを変更した上で、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 ドライバに一意な情報が含まれます。詳細については、それぞれのドライバのマニュアルを参照してください。

メモ

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]

このページのトップに戻る↑ Accessでお仕事 目次に戻る

テーブル名の変更と、テーブル構造のコピー

 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(NewName, ObjectType, OldName)

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, "前社員テーブル"

このページのトップに戻る↑ Accessでお仕事 目次に戻る

ホームページのトップに戻る