• ベストアンサー

アクセス特有の書き方?

Access2003のVBAで疑問に思ったことがあります。 VBA自体はVB6のサブセット?だと理解していますがAccess独特の記述の仕方があり、 まだ理解しておりません。 各変数や、オブジェクトへのアクセスの仕方でわからないことがありました。 'Meはフォーム 'text_nameはフォーム上の0番目のテキストオブジェクトです。 'テキストオブジェクトに書かれているデータを取得しています。 dim data as string data = Me.text_name '--- A これでも動作していたのですが、Aの部分で以下の書き方があるのですがAも含めて どれが正しく、どれが一番お勧めの書き方なのでしょうか? data = Me.texst_name.Value data = Me!texst_name.Value data = Me![texst_name].Value data = Me("texst_name").Value data = Me(0).Value あと、Access特有?のOption Privateステートメントは、皆さんどういう時に 使っていますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • yoisho
  • ベストアンサー率64% (331/516)
回答No.3

私が現在使用しているのはAccess2000であり、 他のバージョンで同様のことが言えるかについては不明ですが、 それをご了解いただいた上でコメントさせていただきます。 まず、疑問点を整理すると、 1.Valueプロパティ付加の有無。 2.「.」演算子と「!」演算子の使い分け。 3.コントロール名の[ ]括りの有無。 4.("コントロール名")との使い分け。 5.コントロール名とインデックスでの参照との使い分け。 6.(ご質問にはないですが、) Controlsコレクションの明示的指定 といったところでしょうか? はじめに、それぞれの実行速度をテストしてみました。 (Access2000、OS:Windows2000、CPU:Athlon64 2800+) ループを組んで以下の data = 1)~8) を1,000万回実行させたときの時間を計ったところ、 1)Me.text_name 2)Me.text_name.Value 3)Me!text_name.Value 4)Me![text_name].Value 5)Me("text_name").Value 6)Me.Controls!text_name.Value 7)Me(0).Value 8)Me.Controls(0).Value 1)2) 75秒 3)~6) 89秒 7)8) 81秒 上記の結果は、あくまで私の環境でのものであり、 Accessのバージョン、マシンの性能、MDBの構造(コントロールの数など)、 コンパイル等で異なってくることは当然考えられますが、 どちらにしても10万分の1秒レベルの差であり、体感的にはあまり意味はなさそうです。 (ただ、何万件以上のレコードに、テキストボックスの値で検索や更新を掛ける際に、もしかしたら意味が生じるか?よくわかりません。) で、各疑問点ですが、 1.Valueプロパティ付加の有無、については、Access2000のHELPの Valueプロパティに、 「Value プロパティは、コントロールの既定のプロパティの参照または設定を行います。既定のプロパティとは、プロパティ名を明示的に指定しなかったときに、指定したものと見なされるプロパティです。」 との記述があり、処理上は省略しても何ら問題はなさそうで、 テストの結果では、処理速度にも差はないようです。 2.「.」演算子と「!」演算子の使い分け、は判断が難しいです。 HELPの式の使用での「式で ! 演算子およびドット (.) 演算子を使用する」の項に、 「すぐ次のアイテムの種類を示すには、識別子で ! およびドット (.) 演算子を使用します。 ! 演算子は、次のアイテムがユーザー定義アイテム (コレクションの要素) であることを示します。たとえば、~・・・コントロールが参照されます。 通常、ドット (.) 演算子は次のアイテムが Access で定義されているアイテムであることを示します。たとえば、~・・・プロパティが参照されます。」 との記載があります。 また、MS のホワイトペーパー「Microsoft Access 2002 への変換」 http://support.microsoft.com/kb/319400/ja の Conv2002JPN.doc (日本語版) では、 「旧バージョンからコードを変換した後によく発生する問題の 1 つは、参照オブジェクトへのドット (.) 演算子の誤用による性能の低下です。通常、ユーザーがコード内で参照している名前が Microsoft Access またはいずれかの参照先ライブラリで作成されていない場合は、この名前の前にドット (.) 演算子ではなく感嘆符 (!) を付ける必要があります。」 といった記載もあり、MSでは「!」の使用を推奨しているようです。 また、ユーザー定義のコントロール名に、既定のプロパティと同じ名前を使った場合には、 (そんな名前を使わなければいいだけのことですが、) 例えば、"Name"テキストボックスを定義したとすると、 Me!Name(テキストボックス)と Me.Name(Nameプロパティ)では意味が違ってきます。 それから、Me.text_name はOKですが、Me.Controls.text_nameはダメ (Me.Controls!text_nameならOK)のようです。 ただ、通常は「.」でも問題なく動作します。 また、「.」ならVBAのコード入力時に自動メンバー表示入力支援が機能します。 また、コンパイル時に存在しないコントロールの参照があっても、「!」ではエラーになりませんが、 「.」使用ならコンパイルエラーで見つかるなど、利点もあります。 今回のテストでは「.」使用の方が処理が速く、Accessの内部処理に違いもありそうです。 以下は私の個人的見解で、根拠はありませんが、 「!」では、ユーザー定義コントロール名をテキストとして探しに行くのに対し、 「.」では、VBAの自動入力支援が働くということは、既にフォームのメンバーとして インデックスが張られている中から選択されるといった違いがあるのかもしれません? 「.」には上記のような利点もあり、「MSが正式にアナウンスしている使用法でない。」 ということを心得ての上でなら、好みで使ってもよいかもしれません。 3.コントロール名の[ ]括りの有無。 これは、[ ] の省略に問題はないでしょう。 ただし、コントロール名に " "(スペース)や記号を使った場合には省略できません。 例えば、Me!text_name は OK ですが、Me!text name は不可(Me![text name]ならOK)です。 まあ、名前にスペースや記号を使わなければいいだけのことではありますが。 4.("コントロール名")との使い分け。は好みの問題でしょう。 No.2さんの回答にもあるように、HELPには処理速度が少し遅くなるとの記載がありますが、 今回のテストでは差が出ていません。 なお、例えばコントロール名を strName = "text_name" data = Me(strName).Value とか、 For I = 1 to 5 strName = "text_" & CStr$(I) data = Me(strName).Value のように変数値で扱いたいときなどには、 Me! ではなく Me( ) での記述が必要になります。 私は使い分けをしていますが、Me( )方式で統一した方がわかりやすいかもしれません。 5.コントロール名とインデックスでの参照との使い分け。は、 テストでは、Me!text_nameよりも、Me(0) や Me.Controls(0) の方が若干処理が早くなっています。 ただ、メンテナンス性の点ではかなりわかりずらく、お勧めはできません。 6.Controlsコレクションの明示的指定、については、 No.2さんの回答にもあるように、明示しない方が速く参照できるとありますが、 今回のテストでは、差が確認できませんでした。 好みで統一しておけばいい(私は普通は明示的には書いてません)と思います。

参考URL:
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vbaac11/html/acobjControl.asp

その他の回答 (2)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

長文にて失礼致します(汗) Access97のヘルプには、『Controls コレクション』の項目に以下のような説明があります。 (原文抜粋、但し改行については適宜追加・削除しています) > 次の使用例では、[受注] という名前のフォームの [新規データ] というコントロールを参照します。 > Controls コレクションを明示しない方が速く参照できます。以下の構文例では、1 番目の方法が > 最も速くコントロールを参照できます。 > > Me!新規データ        ' または Forms!受注!新規データ。 > Me![新規データ]       ' コントロール名にスペースが含まれている場合。 > Me("新規データ")      ' この参照の場合、処理速度が少し遅くなります。 > > Controls コレクションを明示的に指定して、それぞれのコントロールを参照することもできます。 > > Me.Controls!新規データ  ' または Forms!受注.Controls!新規データ > Me.Controls![新規データ] > Me.Controls("新規データ") > > また、コレクションのインデックスでコントロールを参照することもできます。Controls コレクションは、 > 0 から順にインデックスが付けられています。 > > Me(0)             ' コレクションの最初の項目を参照します。 > Me.Controls(0) 従って、最もシンプルな「data = Me!text_name」が処理速度としては有利と記憶して、今まで使用して きました。 (なお、「!」と「.」の違いについてですが、「.」ではフォームのプロパティも参照可能なことから、探す先が  増える分、遅くなるのではないか・・・と個人的には推測しています) ちなみに、同じヘルプの『Value プロパティ』の項では、速度については触れられていませんが、 「.」を使用して「Value」を指定した場合、そのコントロールのプロパティ群から「Value」に該当する値を 探すことになる・・・ように思われますので、指定しないほうが早いのではないかと推測します。 (・・・テストは行ったことがありません) 従って、私のお勧めは、「コントロールの参照は、可能な限りシンプルに」です。 (但し、ヘルプにもある通り、コントロール名がSpaceを含む場合は角括弧をしないのは「不可能」なので、  その場合は、「角括弧を使用するのが正しい」です) > Option Privateステートメントは、皆さんどういう時に使っていますか? 例えば「入力項目が複数あって、そのすべてが埋められたらコマンドボタンを使用可にする」といった 制御をする場合など、そのフォームのコントロール内で共通して使用するSubを作成するときには、 「Private Function AllControlCheck() As Boolean」といったように使っています。 (こういった、別のフォームで、まったく異なるコントロール群に対して同様の評価を行う可能性がある場合、  私はフォームごとにPrivate宣言したSub/Functionを使用し、フォーム間で名前の重複が可能なように  しています。  ・・・最近は、こういったものでさえも、「ParamArray」を使うなどしてフォーム間で共通化させようと  画策したりもしていますが(笑)) なお、No.1の方が言われている「コントロール型として参照したい場合との区別」についてですが、 この場合は「Set」を使用しないとエラーになったはずなので、問題ないのではないかと思います。

  • shut0325
  • ベストアンサー率40% (490/1207)
回答No.1

どれも間違いじゃないと思います。ただ、Aの場合もしプロパティにValueを持たないオブジェクトの場合(例:ラベルオブジェクト)エラーとなりますし、コントロール型として参照したい場合との区別が付きませんのでお勧めしません。 私は後から修正等するときにわかりやすい方がいいので、明示的な表記、、、Me.Controls("text_name").Valueといった表記をするようにしています。 !(感嘆符)を使った場合(” ”)で囲む必要がなくなる、、とぐらいに思っておけばよいかと思います。

関連するQ&A

  • Access2003について

    いつも大変お世話になっています。 この度 Access2003で作業することになったのですが、 今まで、Access2000 か 97、95 でのみ作業経験があります。 Access2000と2003では大きな違いは無いように思うのですが、 モジュールコーディングやフォームのテキストのコントロールソースの指定など 2000で出来たものが2003では出来なくなってしまいました。 例:フォームオブジェクトの値の参照 Ver.2000 If IsNull(Me!テキスト1.Value) = True Then '.ValueはつけなくてもOKだが、つけても問題ない End if Ver.2003 If IsNull(Me!テキスト1) = True Then '.Valueをつけるとエラーになる End if といった大きな差異とはあまり思ってないのですが、 その他になにか違いがあるなら知っておきたいと思いました。 WEBで検索しましたところ、特に見当たらず、 経験などで構いませんので教えていただけると嬉しいです。 又、Access2003 をメインにしているおすすめのサイトなどがありましたら これも教えていただけると嬉しいです。 自分なりにも実際にVer.2003をいじりながら覚えていきたいと思っています。 よろしくご教授お願いいたします。

  • コントロール名にnameを使った場合の対処方法

    アクセス2003でフォームにnameという名前のコントロール(テキストボックス)があります。 MsgBox( Me.name )とすると、 中身でなく、フォームの名前が表示されます。 テキストのコントロール名がnameという紛らわしい名前がいけないのですが、正しく中身を取得する方法はありますか? そもそもMe.[コントロール名]というデータへのアクセスの仕方が間違っているのかと思ってしまうのですが、皆さんどのように対処しているのでしょうか?

  • access Unload ステートメント 

    Unload ステートメントじゃダメな理由を教えてください エクセルの場合は Unload UserForm1 でフォームを閉じれますが、 アクセスは このオブジェクトは、ロードまたはアンロードすることはできません。(Error 361) になります。 ヘルプには Load ステートメントまたは Unload ステートメントで参照しているオブジェクトまたはコントロールが無効です。 と記載されていますが、「オブジェクトまたはコントロールが無効」なのでしょうか? DoCmd.Close acForm, "フォーム1" これで閉じられるからいいのですが、なぜUnload ステートメント が使えないのか気になります。

  • VBA Do…Loopについて

    お世話になっております。 ただいま、アクセスVBAにてDo…Loopの練習をしております。 テキストボックス1に数字を入れ、コマンドボタンを押すと入力した数字が1ずつ引かれる形でテキストボックス2に入るようにしたいです。 (テキストボックス1に「8」→テキストボックス2に「87654321」のように) Dim I As Variant I = Me.text1.Value Me.text2.Value = Me.text1.Value Do Until I = 1 I = I - 1 Me.text2.Value = Me.txt2.Value & I Loop で動作そのものはするのですが、doloop前の「Me.text2.Value = Me.text1.Value」を正さないといけないようです。(課題です) これがないと入力された数字そのものが入らなくなってしまうのですが… よろしくおねがいします。

  • PHPでフォームに表示させたCSVを更新したい

    現在以下のようなものを作っています。 1)csvファイル(内容は id,url,name )からデータを読み込み、 2)フォーム内のテキストフィールドに表示、 3)新規登録フォームからcsvのラストに1行増やす。 ここまではできたのですが、 4)テキストフィールドに読み込んだCSVデータの一部を修正する というのはどうすればいいのでしょうか? 現在、 $fp = fopen("link.csv", "r"); while ($linkdata = fgetcsv($fp, 1000, ',')){ list($a, $b, $c) = $linkdata; … }で、 <input name="id" type="text" value="$a"><input name="id" type="text" value="$b"><input name="id" type="text" value="$c"> こんな感じで表示されています。 チェックした行を削除というのと、 表示されたテキストフィールドの中を書き換えてsubmitで更新というのを作りたいのですが…

    • ベストアンサー
    • PHP
  • 「Text」ではエラーになり、「Value 」だと

    「Text」ではエラーになり、「Value 」だと正常に動く理由がわかりません。 アクセスのフォームを作り、その上にテキストボックスとコマンドボタンを設置しました。 テキストボックスに値をいれ、コマンドボタンを押すと、テキストボックスに値を空白にするコードを考えてたのですが ひとつ疑問が浮かびました。 それは、 Private Sub コマンド2_Click() Me.テキスト0.Text = Null End Sub だとエラーになり、 Private Sub コマンド2_Click() Me.テキスト0.Value = Null End Sub だと正常に動くという事です。 「Text」ではエラーになり、「Value 」だと正常に動く理由がわかりません。 こういうことは何を確認すればわかるのでしょうか?(ヘルプ?オブジェクトブラウザ?) よろしくお願い致します。

  • AccessのVBAの記述について

    たびたびお世話になります AccessのVBAで、フォーム上にあるテキストボックス(CadrDate)のデータを同一フォーム内の別のテキストボックスに貼り付ける操作はできるのでしょうか? 出来るのであれば記述文を教えてください。

  • フォームの一部をPOSTで送信できますか?

    フォームのPOST自体をあまり理解できていないかも知れないのですが・・・ onClickイベントでJavascriptでパラメータを送信したいと思っています。 <input type="text" name="text1"> <input type="text" name="text2"> <input type="text" name="text3"> <input type="text" name="text4"> <input type="text" name="text5"> <input type="button" value="ボタン1"> <input type="button" value="ボタン2"> <input type="button" value="ボタン3"> というようなフォームがあった場合、ボタン1を押したらtext1とtext2の値を、 ボタン2を押したらtext1とtext3の値を・・・という風に 送信する内容を変えたいのですが、それをPOSTで渡すことは可能なのでしょうか? ちなみに送信したい内容は、ボタンが違っても重なっているものもあります。 また可能であれば、どう記述すればよろしいでしょうか?(NNです) よろしくお願いします。

  • ACCESSとEXCELの連携について

    ACCESSとEXCELの連携について教えてください。 メインフォームA(単票)の中にサブフォームB(単票)があり、更にサブフォームB(単票)の中にサブフォーム(メインからみると孫フォーム)C(帳票)があるという構成のフォームがあります。各フォームにはそれぞれテキストボックスtext_X,text_Y,text_Zがあり、メインフォームにコマンドボタンQがあります。いま、このコマンドボタンQをクリックすることによってtext_X,text_Y,text_Zの内容をEXCELの特定ファイルの特定セル(例えばL1、M1、N1~10)に反映させたいと思っているのですが、メインフォーム(A)にあるtext_Xとサブフォーム(B)にあるtext_YはEXCELのセル(L1、M1)に取り込むことができるのですが、孫フォーム(C)にあるtext_Zをセル(N1~10)に反映させることが出来ません。text_Zはフォームが帳票フォームであることからLOOPを使っています。コマンドボタンQのクリック時のイベントでコードの書き方が違っているらしいのです。VBAは全く素人の手探り状態です。どなたか、素人でもわかるように教えていただけたら幸いです。よろしくお願い致します。 具体的には次のようなものです。(一部抜粋) Private Sub コマンド145_Click() Dim oApp As Object Dim rs As DAO.Recordset Dim i As Long Set rs = Me!営業入力SF.Form.RecordsetClone Set rs = 担当(1)F.Form.RecordsetClone Set oApp = CreateObject("Excel.Application") oApp.Visible = True 'Only XL 97 supports UserControl Property On Error Resume Next oApp.UserControl = True '指定のエクセルファイルを開く oApp.Workbooks.Open Filename:="I:\再出発!\受注票.xlt" 'エクセルファイルへデータセットする oApp.Range("名称").Value = Me![名称] oApp.Range("住所").Value = Me![住所] oApp.Range("パンフ送付").Value = Forms![営業F]![営業入力SF]![パンフ送付日] oApp.Range("DVD送付").Value = Forms![営業F]![営業入力SF]![DVD送付日] oApp.Range("正式見積書").Value = Forms![営業F]![営業入力SF]![正式見積書送付日] oApp.Range("契約書送付").Value = Forms![営業F]![営業入力SF]![契約完了日] 'サブフォームの内容をエクスポートする i = 11 Do Until rs.EOF oApp.Range("J" & Format(i)).Value = rs!テキスト1 oApp.Range("L" & Format(i)).Value = rs!テキスト4 i = i + 1 rs.MoveNext Loop Set rs = Nothing Exit_コマンド145_Click: Exit Sub Err_コマンド145_Click: MsgBox Err.Description Resume Exit_コマンド145_Click End Sub (WINDOWS XP    ACCESS 2002  EXCEL 2002 を使用)

  • アクセス コンロール名が勝手に変わります

    フォームにテキストボックスをぐいってやって、名前を「テキスト.1」にしました。 そして、VBAで、 「me.テキスト」と打つと、 me.テキスト_1に変わっています。 「.」と名前を付けたのに、勝手に「_」に変わっています。 本当の名前(コントロール名は)テキスト.1だけど、 Private Sub Form_Load() Me.テキスト_1.Value = "aaa" End Sub を実行したら問題なく出来ました。 どういうことでしょうか?勝手に名前が変わるようになってるのですか?

専門家に質問してみよう