サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
Pixel 9
tsware.jp
結論 DatabaseやRecordsetオブジェクトでは "Nothing"キーワード の使用はメモリ消費の観点からは無意味。同じデータベースに対して繰り返しアクセスする場合には "dbs.Close" さえも省略してもメモリには影響しない。また、Setステートメントで宣言されたオブジェクトは適用範囲外になると自動的に解放され、特にRecordSetオブジェクトではCloseメソッドを省略してもそのメモリ領域は解放される。 VBAのプログラムにおいて、DatabaseやRecordsetオブジェクト、ActiveXなどのライブラリ化されたオブジェクト(クラス)、あるいはExcelやWordのようなオブジェクトを扱う際には、まず「Set ステートメント」によってそれらのオブジェクトへの参照を変数として宣言し、以降のコードではその変数に対してプロパティを操作したり、メソッドを実行したりします
Accessでは、エクスポートの機能やOffice Linksの機能を使うことによって、テーブルやクエリのデータをExcelのワークシートとして出力することができます。しかし、Excelの特定のセルをめがけてデータを当てはめていきたいときや、セルの書式設定などのExcel上の操作を行うには、VBAを使ってExcelオブジェクトを操作する必要があります。 ExcelにもVBAがあり、Excel上の細かな操作が可能となっています。そのExcel VBAのコードをAccess VBAから実行することによって、Accessから細かいExcelの操作が実現できます。 ここでは、そのもっとも基本的なパターンとして、テーブルのデータをそのままExcelのワークシート上に展開する方法を例示します。 以下のコードを実行することによって、Excelが起動され、新しいブックのワークシートにテーブルのフィールド名
あるフォルダ内のファイルを探索するには、Dir関数を使います。しかしこの関数では、指定したフォルダ直下しか探索できません。また、ひとつのプロシージャでサブフォルダまで探索する機能を実現したい場合には、一般的にはプロシージャからさらにそのプロシージャ自身を呼び出す”再帰呼び出し”という方法を使いますが、Dir関数を使ったプロシージャではそのような処理を行うことができません。 一方、「#100 FileSystemObjectでファイルの情報を列挙する方法」で説明しているFileSystemObjectオブジェクトでも、指定したフォルダ内の探索を行うことができます。さらにFileSystemObjectオブジェクトでは、上記の再帰呼び出しを実現することができます。 #100では指定フォルダ直下の例しか説明しませんでしたので、ここでFileSystemObjectオブジェクトによるサブフォルダ
前回までに、IISとPHPという重要な基本的動作環境ができましたので、ここからAccessデータベースの環境設定に入ります。PHPを使ってAccessを操作するためには、基本的に2つの作業が必要となります。当然のことながらテーブルにデータの保存されたAccessのファイル(.mdbファイル)を用意することと、PHPからはODBC(Open DataBase Connectivity)経由でアクセスすることになりますので、そのmdbファイルへのODBCデータソースを用意する必要があります。 ※PHPからAccessデータベースにアクセスするには、ODBCだけでなくADOを使った方法も可能です。ただし今回はコーディング等が簡便なODBCを使った方法のみ紹介します。 ※Accessの「ページ」オブジェクトを使ったWebページを作るのではありませんし、またフォームやレポートもPHPから操作するわけ
Accessから「Microsoft Office10.0 Object Library」を呼び出して、"フォルダ選択"ダイアログを表示、選択されたフォルダを得るための方法です。 ※下記方法を使うためには、VBEの[ツール]-[参照設定]メニューを実行し、「参照可能なライブラリファイル」一覧の"Microsoft Office10.0 Object Library"の項目にチェックを付けておく必要があります。 まず、ダイアログを表示し、そこで選択されたドライブ+フォルダ名を返すサンプルプロシージャを示します。これを標準モジュールなどに記述してください。 Public Function GetFolderName() As String 'フォルダ選択ダイアログの例 Dim intRet As Integer With Application.FileDialog(msoFileDialog
結論 小さなテーブルに対してGetRowsメソッドを使うとRecordset内のフィールドデータを高速に取り出すことができる。ただし、Fieldオブジェクトを使った方法と比べると時間的な差はほとんどない。一方大きなテーブルに対しては、メモリ不足によるスワップファイルへのアクセスが発生し大幅にパフォーマンスが低下する Recordsetオブジェクトの GetRowsメソッド は、Recordset内のフィールドデータを高速に取り出す方法としてしばしば取り上げられる手法です。GetRowsメソッドは1回の呼び出しでテーブルやクエリー内の全レコード・全フィールドを2次元の配列(1つ目の添字がフィールドを示し、2つ目の添字がレコード番号を示す)として取り出してくれるもので、後でそのデータを扱う際にフィールドを固有の名前ではなく配列の添字で扱わなければならないという不便さはありますが、Do~Loop
アプリケーション開発中のテストでは、ある処理によって出力されたレコードと、そのコードをアレンジしただけの、本来同じ結果が出されるべき処理によって出力されたレコードとが同じかどうか確認したい場合があります。そのテスト方法としては、まず変更前の処理結果であるテーブルを別名でコピーしておき、続いて変更後の処理を実行、両者のテーブルを比較するといった方法があると思います。そのような比較処理を手助けするのがT'sKitの「テーブル/クエリー比較」ツールです。ここではこのツールの内容について説明したいと思います。 まず、2つのテーブルが同じであると判断する基準を整理しておきましょう。 フィールド数が同じである。 フィールドの順序が同じである。 個々のフィールド定義が同じである。 レコード数が同じである。 すべてのレコードのデータ内容が同じである。 T'sKitではこのうち3番目の比較は行っていません。
Format関数は、数値や日付/時刻、文字列の表示書式を変換する関数です。1番目の引数には元の値を、そして2番目の引数には変換する書式を文字列("で囲む)で指定します。 日付や時刻の書式化においては、次のような書式指定文字を使います。
次のサンプルコードをアレンジすることで、テーブルのフィールド名をVBAプログラムから一括変更することができます。 フィールド名は、クエリや、フォーム/レポート上のコントロールのソースとして参照されていることが多々ありますが、Accessのオプションの[全般]タブにおいて「名前の自動修正を行う」にチェックを入れておけば、それらもまとめて変更されますので、何らかの理由で大量のフィールド名変更が必要になったときは、このプログラムを流用することでそれらの作業を確実かつ簡単に行うことができます。 ただし、モジュール内で使われているフィール名はあとからマニュアルで変更しなければなりません。また、"[フィールド名]"のように、カッコを使ってフィールド名を参照しているコントロールソースについてはAccessの自動修正が反映されない場合がありますので、注意してください。 Public Sub FieldNa
Accessにはオブジェクトと呼ばれるものが多数ありますが、新しいデータベースを作成して最初に目に入るのがデータベースウィンドウに表示されている、テーブル・クエリー・フォーム・レポート・マクロ・モジュールの6つのオブジェクトではないでしょうか?。ここではデータベースオブジェクトのすぐ下位に属するこの6つのオブジェクトの一覧をVBAを使って調べてみましょう。T'sKitではこれらの方法を使って「オブジェクトツリー表示」ツールを作成しています。 まず、テーブルの一覧を取得してみます。カレントデータベースに含まれるすべてのテーブルを列挙するには次のコードを実行します。 Dim dbs As Database Dim tdf As TableDef Set dbs = CurrentDb For Each tdf In dbs.TableDefs Debug.Print tdf.Name Next
VBAによって、パラメータを持つ選択クエリーをRecordsetとして開く場合、あるいはパラメータを持つアクションクエリーを実行する場合、単純に実行すると、データベースウィンドウからクエリーを開く際に表示されるパラメータ入力用のダイアログが表示されるわけではなく、そのままエラーとなってしまいます。そこで次のようにしてVBAのコード上からパラメータ値の設定を行います。 Dim dbs As Database Dim qdf As QueryDef Dim rst As Recordset Set dbs = CurrentDb 'まずクエリーのオブジェクトを取得します Set qdf = dbs.QueryDefs("受注伝票クエリー") With qdf 'クエリーのオブジェクトに対して設定を行います。"抽出する顧客ID" などがパラメータ名です .Parameters("抽出する顧客ID
Access2000からは、そのヘルプファイルも、従来のHLPに代わってCHMという「コンパイル済みHTMLファイル」になりました。本シリーズでは、HTMLヘルプの作成手順とともに、CHMファイルを作成するためのツール「HTML Help WorkShop」の基本的な操作方法について説明します。
リンクテーブルのリンク元データベースを変更したい場合、いちばん簡単な方法はDocmdオブジェクトの"TransferDatabaseメソッド"に"acLink"定数を指定して実行することです。しかし、テーブルの再リンクを行うには別の方法もあります。ここで紹介する方法は、テーブルのリンク情報が格納されているプロパティ「Connect」を直接更新する方法です。 リンクテーブルのプロパティウィンドウを開いてみて下さい。 説明欄のところを見ると、リンク元のデータベースファイルのフルパスとテーブル名が"DATABASE="で始まる文字列式で表示されているのが分かると思います。これがリンクテーブルのリンク情報です。この文字列を直接書き換えることによってリンク元を変更します。 次のコードでは、現在のリンク元「C:\My Documents\db1.mdb」をサーバー"MyServer"の共有名"DATA
Open/開く時 Load/読み込み時 Resize/サイズ変更時 Activate/アクティブ時 Current/レコード移動時 Unload/読み込み解除時 Deactivate /非アクティブ時 Close/閉じる時 それではまず、Accessの数あるイベントの中から、フォームのオープン・クローズに関わるイベントについて調べていきましょう。 まず、どのようにしてイベントの発生を調べるか、その方法を決めておかなければなりません。このシリーズで特に重点をおいているのは、各イベントがどのような順序で発生し、そのイベントをどのように利用したらよいか検討することです。例えばフォームならフォームが、どのようなイベントを持っているか、それぞれのイベントがどのようなときに発生するかなどは、ヘルプを参照すれば調べることができます。しかし、実際にどのようなタイミングで発生するかなどは、フォームを開いたり
結論 Accessからエクスポートできるファイル形式はいろいろあるが、その処理時間に関しては、今回のテストの範疇では次のような順位付けができる。 <速い> CSVファイル(Print #ステートメント) Excelワークシート HTMLファイル CSVファイル(DoCmdオブジェクト) <遅い> Accessでは、テーブルやクエリのレコードを簡単に外部のさまざまなファイル形式に出力することができます。メニューバーの操作で個々に出力することもできますし、マクロを使って自動化することもできます。さらにVBAを使えば、テーブルやクエリのレコードを1件ずつ読み込んで、フィールドごとに任意の値に加工しながら出力することも可能です。 しかし逆に言えば、さまざまな出力ファイル形式、さまざまな出力手段があるということは、その中のどのような方法がもっとも速くエクスポート処理できるのか気になるところです。そこ
結論 VBAでレコード編集を行う場合、JETデータベースエンジンではRecordsetオブジェクトのAddNew・Edit・Deleteの各メソッドが最も最適化された方法である。(しかしODBCを使った場合には"INSERT INTO"のようなSQLステートメントを使った方がよいらしい?)。 VBAでレコードセットを作成しレコード編集を行う際には、AddNewやEdit、Deleteなどのメソッドが必須です。ところが、SQLServerのようなサーバーベースのデータベースにODBC経由でアクセスする場合には「AddNewメソッド1つでもサーバー側へは複数のSQL文が送出されるため、AddNewなどのメソッドは使わずに"INSERT INTO"のようなSQLステートメントを使った方がよい」ということを聞いたことがあります。そこで今回は、JETデータベースエンジンの場合にはどうなのかを確認して
「カスタマバーコード」は、日本郵政公社が定めたバーコード体系で、ダイレクトメールのような大口の郵便を差し出す場合に、これを印刷することで郵便料金を割り引いてもらうことができるものです。7桁の郵便番号は都道府県名や市町村名までを表しますが、カスタマバーコードは、それより下の何丁目何番地といったより詳しい住所情報までを含めます。 Accessでは、バーコードコントロールを使うことによって、レポートにカスタマバーコードを印刷することができます。バーコードコントロールのプロパティで「スタイル」を"10 - カスタマ バーコード"に設定し、コントロールソースに所定の住所データを指定します。 しかし、通常の住所を指定しただけでは、バーコードは印刷されません。あらかじめ、日本郵政公社が定めるルールに従って、郵便番号データと、住所からバーコード化する文字だけを抜き出したデータを組み立てておかなければなりま
AccessのVBAからOutlook(ここではVer2002)を呼び出して、送信メールを新規作成するプログラム例を紹介します。 ここでは固定的な送信先メールアドレス、固定的な本文を例としていますが、このプログラムを応用して、メールアドレスなどをテーブルからループで順次読み込んで切り替えていくようにすれば、Accessに保存された顧客情報などに沿って、複数の人を対象にメールを送るようなこともできます。 ※このプログラムを実行するには、「Microsoft Outlook 10.0 Object Library」のライブラリに参照設定を行う必要があります。 Sub OutlookMailSend1() Dim olApp As Outlook.Application Dim olMailMessage As Outlook.MailItem Dim olRecipient As Outloo
Accessを使ったデータベースアプリケーションにおいて、開発中はもとより、導入してからも必須の作業といえるデータベースの修復と最適化の操作について、VBAを使ってアプローチしてみましょう。 Accessではレコードの削除を繰り返したりするとすぐにMDBファイルのサイズが膨らんでしまいます。「最適化」はAccessのみならず、データベースソフトでは必須の作業といえるでしょう。ソフトによっては"インデックスの再編成"と言ったり、"テーブルの圧縮"と言ったりしますが、いずれもテーブル内の不要な領域(主に削除されたレコードの領域)を整理整頓してデータベースのサイズを小さくしてくれることに違いはありません。 Access97になってからは自分自身のデータベースを閉じずにそのまま修復/最適化できるようになり、以前のバージョンに比べてその操作がずいぶん楽になったように思います。しかし、個人的には、明ら
CSVファイル(カンマ区切り記号付きテキストファイル)からデータを読み込む場合、一つの方法として、「Input # ステートメント」を使う方法があります。この方法を使えば、カンマで区切られたデータを自動的に切り出して、それぞれのデータを変数に代入することができます。カンマという文字自体を意識してそれを除外するようなコードは必要ありません。 ■Input # ステートメントの例 Dim lngFileNum As Long Dim strData As String lngFileNum = FreeFile() Open "c:\test\社員.CSV" For Input As #lngFileNum Do Until EOF(lngFileNum) Input #lngFileNum, strData Debug.Print strData Loop Close #lngFileNum
DoEvents関数は、プログラムで占有していた制御をOSに一時的に渡すための関数です。時間のかかるループ処理をコマンドボタンのクリックなどで中止させるような場合、クリック時イベントをWindowsに検出させるためにはこのDoEvents関数が必要となります(その具体的な使用例については「#92 時間のかかる処理を途中で中止できるようにする方法」を参照してください)。 DoEvents関数を用いると、Windowsのイベントキューの内容を調べるためのオーバーヘッドによって極端にパフォーマンスが低下します。ループ処理を途中でキャンセルできる機能よりもその処理時間を優先させたい場合には、DoEvents関数は使わない方が無難です。 しかし、WindowsAPIの「GetInputState」関数を使うと、DoEvents関数を使わないのと同じ程度までパフォーマンスを改善することができます。Do
エクスプローラではお馴染みのドラッグ&ドロップの機能を実装してみます。基本的にはTreeViewコントロールはその機能を持っているので、細々としたプログラムを書く必要はありませんが、ドラッグの開始やドロップ先の検出などのいくつかのコードはイベントプロシージャに記述する必要があります。 なお、掲載しているサンプルフォームでは、多階層のツリーデータまではプログラムやテーブル構造が考慮されていません。それについては、応用としてデータ構造やアルゴリズムを別途検討してみてください。 ポイント OLEDragModeプロパティ OLEドラッグモードを設定します。ドラッグ&ドロップを行なうためには、これに定数ccOLEDragAutomatic(自動モード)を代入します。なおこの設定は、プログラム上ではなく、TreeViewコントロールのプロパティシートからデザイン時に行なってもかまいません。 OLED
Accessの処理の高速化や最適化に関するさまざまな実験、Accessの機能に関する調査を行います。日頃、何気なく使っているコードや技法について、あらためて処理時間の測定や比較、機能分析などを行い、より良いアプリケーション作りを模索していきます。 このLaboでの処理時間の測定には拙作"T'sWatcher"を使用しています(サンプルコード内の"ts_Watch" Subプロシージャをコールしている部分です)。ぜひダウンロードしてみて下さい。T'sWatcherについてはこちらをクリックして下さい。
Office2000/2002 Developer に添付されているActiveXコントロール、「Windows コモン コントロール(Mscomctl.ocx/Mscomct2.ocx)」の事例集です。これらのOCXには、標準のAccessにはない、いくつかのActiveXコントロールが含まれています。フォームのデザインビューにおいて、[挿入]-[ActiveXコントロール]メニューより挿入することができます。本シリーズでは、実際に動作するサンプルフォームによって、それらの挿入後の取り扱い方法を紹介します。 ※ActiveXコントロールの挿入ダイアログにおいて、同一コントロールで「Version 5.0 (SP2)」と「Version 6.0」の2つがある場合には、後者を選択するようにしてください。
VBE(Visual Basic Editor)のコードウィンドウで使えるショートカットキーの一覧表です。これを使わなければコーディングできないということはありませんが、使いこなせば格段にコーディングの効率をアップすることができます。 マウスに慣れているとこれらの操作はなかなか覚えづらいものですが、普段から心がけて使うようにすれば、おのずとマスターできます。
OpenTable/テーブルを開く OpenQuery/クエリを開く RunSQL/SQLの実行 SetWarnings/メッセージの設定 OutputTo/出力 TransferDatabase/データベース変換 TransferSpreadsheet/ワークシート変換 TransferText/テキスト変換
マクロは一切使わず、専らVBAを使ってさまざまな手続きを記述するスタイルであっても、マクロの「アクション」の代用である「Docmdオブジェクト」を必要とする場面はけっして少なくありません。ところが、いざコードを記述するとなると、必要なアクションが何というメソッドであったか思い出せないことも少なくないのではないでしょうか?。 マクロなら、コンボボックスからアクションを選択し、日本語で説明の書かれた入力欄にその引数を記述するという、非常に分かりやすいユーザーインターフェースが提供されています。しかし、VBAの場合には、しいていえば自動的にメンバが表示される程度で、そのほとんどはプログラマーが英語のメソッド名や引数名を解釈しながらコーディングしなければなりません。特にRunCommandメソッドの引数などはその最たるものでしょう。 本シリーズでは、そんなときに役立つリファレンスとして、Docmd
テストデータ作成支援アドイン T'sRandom Ver 2.20 テストデータ作成支援アドイン「T'sRandom」は、データベースのテストに用いるためのランダムデータをテーブル上に作成するアドインです。 Accessでクエリーやフォームを作る際、データの表示内容や動作、あるいはパフォーマンスなどを確認するためには、テーブルにある程度の量のデータが必要です。またクエリーなどでは、そのデータベースが導入された後の実際のデータ量によってどのような動きになるかも確認したいことがあると思います。しかし、実際に使うような正式なデータを大量に入力するとなるとこれも大変な手間がかかります。そこで、「とにかく何でもいいからテスト用のデータがたくさん欲しい」といったときに、このアドインが役に立ちます。 このバージョンはAccess2002/2000用です。Access97用にはVer1.00をお使いくだ
このページは、1つのテーマに沿って、Accessによる開発テクニックやヒントを解説するページです。 このシリーズでは、Accessのフォームやレポート、モジュールなどの”デザイン作業”に役立つプログラムを例示しています。デザインビューに対する操作方法や、”実行時”とはまた異なるプログラミングを知るとともに、これらを応用することで、全フォーム等に対する一括編集などの作業の効率化にも役立つと思います。
次のページ
このページを最初にブックマークしてみませんか?
『T'sWare for Access Users & Access Developers』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く