Access

Last-modified: 2013-02-06 (水) 18:56:10

基本情報

ランタイム

ランタイム 2003まで有償,2007から無償だ。

問題 - 解決

設定・確認

型のサイズ

データ型サイズ範囲
バイト型Byte10~255
ブール型Bool2真(True)偽(False)
整数型Integer2-32,768~32,767
長整数型Long4-2,147,483,648~2,147.483,647
単精度浮動小数点数型Single4-3.402823E38~-1.401298E-45(負の数)1.401298E-45~3.402823E38(正の数)
倍精度浮動小数点数型Double8-1.7976931348623E308~-4.94065645841247E-324(負の数)4.94065645841247E-324~1.79769313486232E308(正の数)
通貨型Currency8-922,337,203,685,477.5808~922,337,203,685,477.5807
日付型Date8西暦100年1月1日~西暦9999年12月31日
オブジェクト型Object4オブジェクトを参照するデータ型
文字列型String10+文字列の長さ0~2GB
バリアント型Variant16すべてのデータを扱えるデータ型で0~2GB
  • Me.Repaint 画面を再描画する DoEventと組み合わせて
  • メモリ不足エラー対策 (ミニミニ Access Tips)
    メモリ不足とメッセージがでてクエリやテーブルの編集・更新ができない場合の対処方法
    ※ レジストリを触るので慎重にやること
       <ファイル名を指定して実行>
             「名前」欄に半角で regedit と入力し、<OK>ボタンを押す
            ↓
       レジストリエディタが起動したら、左のウィンドウで
              HKEY_LOCAL_MACHINE → Software → Microsoft → Jet → 3.5
              → Engines → Jet 3.5 と、キー(フォルダ)をたどって開く。
            ↓
       右ウィンドウの MaxLocksPerFile アイコンをダブルクリックして開く
            ↓
       基数(ベース)欄で「10進」にチェックを入れ、ここで数字を入力する。
              ※ 数値は初期状態では 9500 が入力されているので、これを
                20000 などのより大きな数字に変更し、<OK>ボタンを
                クリックし、レジストリエディタを終了する。
             (念のため再起動し、アクセスで再度処理をやってみる)

Access VBAマクロ

設定

  • 警告ダイアログをOFF/ON
    DoCmd.SetWarnings False '警告ダイアログをOFF
    DoCmd.SetWarnings True '警告ダイアログをON
  • マウスのカーソルの設定
    Application.Screen.MousePointer = 11 'マウスを砂時計に切り替えます。
    Application.Screen.MousePointer = 0   'マウスを元に戻します。
  • 型変換 参考
    CInt  整数型(Integer)へのデータ変換
    CLng  長整数型(Long)へのデータ変換
    CBool  ブール型(Boolean)へのデータ変換
    CByte   バイト型(Byte)へのデータ変換
    CCur    通貨型(Currency)へのデータ変換
    CDate   日付型(Date)へのデータ変換
    CDbl    倍精度浮動小数点実数型(Double)へのデータ変換
    CSng    単精度浮動小数点実数型(Single)へのデータ変換
    CVar    バリアント型(Variant)へのデータ変換
    CStr    文字列型(String)へのデータ変換
  • DB最適化 参考
    SetOption "Auto Compact", True  ' 閉じる時に最適化する。

日付

  • 先月の求め方 (DateSerial 関数)
    Dim sDate As String
    sDate = DateSerial(Year(Now), Month(Now) - 1, 1) ' 先月を求める
  • 先月末の求め方 (DateSerial 関数)
    Dim sDate As String
    sDate = DateSerial(Year(Now), Month(Now), 1)-1 ' 先月末を求める
  • 今月末の求め方 (DateSerial 関数)
    Dim sDate As String
    sDate = DateSerial(Year(Now), Month(Now) + 1, 1)-1 ' 今月末を求める

DoCmd

クエリで更新クエリを実行

DoCmd.OpenQuery クエリ名  '例 DoCmd.OpenQuery "更新_WK_Hatyu"  '

クエリをテキスト出力

DoCmd.TransferText acExportDelim, , "T_TokuiMD",  "C:\Backup\得意先マスタ.csv", True

テキストをインポートしてテーブルに入れる

DoCmd.TransferText acImportDelim, "F_CM インポート定義", "F_CM_KM", "C:\F_CM_KM.CSV", True

※ 拡張子「txt,csv,tab,asc,tmp,htm,html」以外は利用できない,datファイルなどは使えない。レジストリをいじらない限り

EXCEL形式でテーブルをエクスポートする

DoCmd.TransferSpreadsheet acExport, 8, "Q_担任別名簿", "D:\クラス別名簿原本.xls", True, ""

※ Docmd.Outputto ~ でも、エクセル形式でエクスポートできるが。16,384 行を超えると出力できないの。
ただし、2007以降では解決しているかもしれない。参考

SQL文の実行

DoCmd.RunSQL "DELETE * FROM T_Tokui" ' テーブルのT_Tokuiを削除する。

クエリ

  • Formの項目をクエリの抽出条件に使う。 参考
    例 [Forms]![Sales By Category Form]![Category] のように書く。

追加クエリ

  • 「数値フィールドがオーバーフローしました。」とメッセージがでる。
    原因:数値型の項目にNULL値を入れようとしたため
    対策:NULLなら0を入れることにして。追加クエリの数値項目のプロパティで書式を0とする。
     

更新クエリ

  • 半角文字を全角文字にする場合, (クエリで関数を使う場合、定数を使う時)
    レコードの更新に,
    StrConv([メーカー],vbWide) ----- NG
    StrConv([メーカー],4) ----- OK
    ※ クエリ全般に言える.定数はクエリーの中じゃ使えない 参考

選択クエリ

リンクテーブル

  • これは便利かも
    EXCELをインポートする際に、ユーザ定義の項目が崩れる場合があるので、リンクテーブルは有効かも。
  • 注意点
    通常のテーブルでは使えるクエリが使えない場合がある。

フォーム

  • フォームの「作業ウィンドウ固定(Modal)」プロパティと「ポップアップ(PopUp)」プロパティが「はい(Yes)」の状態で開きます。
    VB2005でいうところのShowDialog状態で開く
    DoCmd.OpenForm "frmMain", acNormal, , , , acDialog ' frmMain フォームをShowDialog状態で開く
  • 指定オブジェクトが閉じるのを待つ 参考
    フォームが閉じるまで待機する。
    Public Sub WaitObjectClose(intObjType As Integer, strObjName As String)
     'intObjType には acTable、acForm、acReportなどの定数を指定します
     'strObjName にはそのオブジェクト名を指定します
     Do
       DoEvents
       'SysCmdでオブジェクトが開いているか確認します
     Loop Until SysCmd(acSysCmdGetObjectState, intObjType, strObjName) = 0
    End Sub

使用例:

DoCmd.OpenForm "フォーム1"
WaitObjectClose acForm, "フォーム1"
MsgBox "フォームが閉じられました!"
  • フォームのLoadイベントで、テキストボックス・ラベルに値を代入
    textではなく、Valueに代入する。
  • フォームを最前面に表示する
    フォームのプロパティ-->その他-->ポップアップを「はい」にする
    ポップアップ設定になっていると他のフォームを開いても別のフォームは後ろに表示される

レポート(印刷)

  • 集計関数は,ページヘッター・ページフッターで使えない
    Countなどの集計関数は、ページフッター/ヘッダーで使えない。レポートフッター/ヘッダーで使う
  • プリンタの設定を他のPCでも引継ぐ方法,
    ツール --> 全般 --> 名前の自動修正のチェックを全て外す。 
    ※ 開発の時は自動修正がないとフォームやテーブル・クエリで項目の変更があった場合は、修正されない
    PCに引継ぐ直前だけ、自動修正のチェックをはずし。開発時はチェックをつける
  • 改ページ
     並べ替え・グループ化の設定 --> フィールド/式に、並び替えの順番に設定していく 
    特定の項目で改ページしたい場合は、グループヘッダー = はい 、同一ページ印刷 = グループ全体 に設定する。
    ※ クエリでの昇順はレポートには反映されない。レポートの昇順を優先する
  • 印刷時に印刷のダイアログを開く
    サンプル
    '印刷プレビューモードで開きます。
    DoCmd.OpenReport "rpt_sample", acPreview, "", ""
    'キーボード操作 Alt + F + P と同様です。
    SendKeys "%{F}{P}", True
  • 数値の切上を行いたい場合
    モジュール内で切上関数を作成する-->クエリで切上を反映した数値のフィールドを作成 -->
    レポート内で、切上のフィールドを参照する。
    ※ 上手なやり方があるかもしれないが。レポート内でうまくやれなかった。

PDF

  • 2007からはマイクロソフトのPDFアドオンを入れると、Docmdでやれるようになったらしい。参考

ファイル・フォルダ

  • -ファイル選択ダイアログを開く};
    'このサンプルを使うには、
    VBAエディターで、ツール --> 参照設定 -&size(14){-> Micros};oft Office 12.0 Object Library にチェックを入れる。
    ※「Office 12.0」はofficeのバージョンにより異なる。
' ファイル選択ダイアログで開くフォルダを固定にしたい場合は下記の2行を追加する
ChDrive "C:" ' 開くドライブを指定
ChDir "C:\Seikyu"  ' カレントディレクトリを指定
Dim FileNM as string
Dim dlgSaveAs As FileDialog
Set dlgSaveAs = Application.FileDialog(msoFileDialogOpen)
dlgSaveAs.Show ' ファイル選択 ダイアログを開く
If dlgSaveAs.SelectedItems.Count = 0 Then
    MsgBox " ファイルが選択されませんでした!", vbCritical
    Exit Sub
End If
FileNM = dlgSaveAs.SelectedItems(1)
  • ディレクトリの存在確認
    If Dir("C:\PG", vbDirectory) = "" Then
        MkDir gDirLog
    End If
  • ファイル削除(ワイルドカードを用いた)
    例.拡張子がpdfのファイルを削除
    Dim FileDelete As String
    FileDelete = "C:\Data\*.pdf"
    Kill FileDelete
  • ディレクトリの削除
    RmDir "C:\Data\"
    ※ 削除したいフォルダにファイルが存在すると、削除できないので。あらかじめファイルを削除しておかないと駄目である。

インポート・エクスポート

  • インポート定義の一覧取得 
     「MSysIMEXSpecs」テーブルの中に格納されている。見えてない場合は、ツール-->オプション-->表示の中のシステムオブジェクトにチェックを入れる。
  • テキストファイルのインポートを行うと全角文字が文字化けする
    対策:インポートする時の言語が西ヨーロッパ言語などの日本語以外の言語になっているから。 参考
  • インポート時に「このフィールドに入力した値が正しくありません」とでる。
    対処策:整数型のデータなのに上記メッセージがでる場合は、型を長整数型にする。 
    整数型の桁範囲が -32,768 ~ +32,767 のため。
  • EXCEL(ユーザ定義)の項目のインポート
    日付形式・時間形式・ユーザ定義の項目はそのままだと、形式が崩れるので。
    リンクテーブルを使用するか、一度その形式のままテキストで保存してから取込む。

その他

エラー対処

  • 追加クエリ、テーブル作成クエリで、"引数が無効です" というメッセージがでる

対策:データベースの最適化 参考

メッセージの一例
[ACC2003] サイズの大きな Access データベース ファイルで、追加クエリの実行、テーブル作成クエリの実行、またはデータのインポートを行うと、エラー メッセージ "引数が無効です" が表示される

  • Access2002 と Windows7 では動かない場合がある。
     Access2002のSP3をあてても駄目だった。
  • クエリのUNIONの使い方
    UNIONは、ハイスペックのマシンでないと処理が重くなり実用的でない。
  • 指定された数値は、小数フィールドの精度と合致しません。
    項目の「フィールドサイズ」を十進数から,倍精度浮動小数点型に変更した
     

未解決事件 ColdCase

 

参 考

サイト

 サンプル・プログラム

参考書籍

サイト内リンク

Office系

OS系

DB系