FrontPage 新規 編集 検索 一覧 ヘルプ

Access

最近、仕事でAccessいじることがとても多いのでメモ。なにかの役に立てばいいけど。

ファイル選択ダイアログを使う

Access2002だと、こんな方法があったんですねぇ。知りませんでした。クライアントもAccess2002なので、とりあえず今回の仕事には使えそうです。よかった。

Microsoft Office 10.0 Object Library への参照設定が必要です。

 Option Compare Database
 Option Explicit
      
 Private Sub cmdFileDialog_Click()
 
   Dim fDialog As Office.FileDialog
   Dim varFile As Variant
 
   'ファイル ダイアログ ボックスを設定します。
   Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
   With fDialog
 
      'ダイアログ ボックスにて複数選択を可能にします。
      .AllowMultiSelect = True
            
      'ダイアログ ボックスのタイトルを設定
      .Title = "ファイルを選択してください(複数可)"
 
      'フィルター設定
      .Filters.Clear
      .Filters.Add "TEXTファイル", "*.txt"
      .Filters.Add "All Files", "*.*"
 
    If .Show = True Then
         For Each varFile In .SelectedItems
            MsgBox varFile
         Next
      Else
         MsgBox "キャンセルしました"
      End If
 
   End With
 End Sub

上記サンプルは選択したファイルを1つづつ表示します。1つのみの選択なら、.AllowMultiSelect は弄らず、.SelectedItemの最初のデータを読めばよいでしょう。以下のMSのページに詳細が載っていますが、注釈の日本語訳には首を傾げます。:-(

Microsoft Access 2002 の「ファイルを開く」ダイアログ ボックスを表示/使用する方法

Excelデータを読み込む

お客様がExcelで作成した会員データをAccessに取り込みたいとのことで、そのまま今回の機能追加の仕様のひとつとなりました。

こういうものは、マクロである程度の機能をシミュレートしてから、マクロをモジュールへ変換し細かい機能を実装するのが吉。

マクロのアクション「ワークシート変換」なんて、良さげなアクションがあるので、設定してみる。

項目
変換の種類インポート
ワークシートの種類Microsoft Excel8-10
テーブル名T新規会員
ファイル名新規会員.xls
フィールド名の設定はい
範囲A4:Z1000

ほれ、どうだ?とマクロ実行してみたらバッチリT新規会員が作成されてました。こんなに簡単になってるのねぇ・・・Accessマンセー(^^)/

次に、このマクロをVBAコード(モジュール)に変換します。

これでモジュールとなりました。素晴らしいです。早速中身を見てみました。

 Option Compare Database
 
 '------------------------------------------------------------
 ' 新規会員取込
 '
 '------------------------------------------------------------
 Function 新規会員取込()
 On Error GoTo 新規会員取込_Err
 
     DoCmd.TransferSpreadsheet acImport, 8, "T新規会員", "新規.xls", True, "A4:Z1000"
 
 
 新規会員取込_Exit:
     Exit Function
 
 新規会員取込_Err:
     MsgBox Error$
     Resume 新規会員取込_Exit
 
 End Function

いい感じですねぇ・・・。

特殊なクエリ

クライアント(お客様)が使うエクセルデータは、コード(キー)は使わずに全て文字列を使っています。なぜならエクセル表はプリント用に整形してあり、見た目本位のデータだからです。そのようなデータを無理やりアクセスに取り込みます。そのため、例えば「T部門」テーブルに主キーの「部門CD」と文字列の「部門名」という2つのフィールドがあったとしてリレーションは部門名に張るような特殊なクエリを作成します。

エクセルデータから取り込んだテーブルのデータは部門名しかもっていないので、部門名から部門CDを求めて会員マスタに追加してあげるのです。

固定長エクスポート

ちょっとはまった。クエリ結果をマクロで固定長のテキストに吐き出す処理なのですが、なんか定義名というのをリストから選択しなければならない。で、その定義名を何処でリストに登録するのか、最初分からなかったんだなぁ。もっとも保存先ディレクトリに schema.iniを作成してもよいとヘルプには書いてあるのだけれど・・・。

なんか意地になって探しました。

  1. 固定長テキスト保存したいクエリを開く
  2. [ファイル]-[エクスポート]でファイルの種類でテキスト(*.txt)を選択する。
  3. [すべて]を押す
  4. [設定]を押すと定義名を登録できるダイアログが表示されます

ここで登録してしまえば、後はマクロでリストが出てくるのでした。めでたしめでたし。:-)


なぜ定義名の登録が消えていたのか・・・というとDB最適化をしたかったのですが、エラーで最適化できずに、仕方なく全ての要素をインポートしたのでした。見事に最適化はできるようになったのですが「定義名」っていうのはコピーされないのでした。それを知らずに、インポート後に作業をすすめたもんだから、マクロで定義名を使っている箇所でエラーがでてしまったのです。

Yesterday Today Total