Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Access 2010)
変数宣言とOptionExplicitキーワードについて
投稿日時: 19/04/18 22:25:51
投稿者: kuroro

現在、前任の方が作成されたAccessの改修・追加機能の実装を行っております。
(前任の方とは連絡取れない。)
 
そこで、ある奇妙なことが起きているのです。
まず、現状を簡単に説明します。
---------------------------------------------------------------------------------
Accessのやること
 
一月に一度csvファイルがくるので、そのファイルをインポートして加工・集計を行う。
そして、加工したデータをファイルとしてエクスポートする。
ただ、それだけです。
 
---------------------------------------------------------------------------------
Accessの構成
★テーブル
 インポート用テーブル
 パス
★フォーム
 メイン
★モジュール
 メインモジュール
★クエリ
 クエリ1
 
---------------------------------------------------------------------------------
Access使い方
メイン画面に「参照」ボタンがあるのでクリックする。
ダイアログ表示⇒ファイル選択⇒選択されたフルパスが「パス」テーブルに格納される。
 
「インポート」ボタンクリック
「パス」テーブルに設定されたパスからファイルを開き、テーブルにデータをインポートする。
 
「エクスポート」ボタンクリック
ダイアログ表示⇒指定の名前をつける⇒出力先のパスを取得⇒
テーブルのデータを使用した閲覧クエリである「クエリ1」のデータをエクスポートする。
 
※詳細な内容は省いています。
 気になるようでしたら別途質問を頂けると幸いです。
 
---------------------------------------------------------------------------------
疑問点
メイン画面にコードが用意されているのですが、
その中の「txtCSV」という変数がイマイチよくわからないのです。
というのも、メイン画面の先頭に「Option Explicit」が記載されているので
変数宣言されていない変数を使用すると実行中にエラーで中断されるはずです。
ただ、「txtCSV」はどこにも変数宣言されていないのです!!
メイン画面だけでなく、他のモジュールも確認したのですが
どこにも「Dim txtCSV」といった記述は存在しません!!
尚、他の変数宣言していない変数を使おうとすると、エラーで中断されます。
(まぁOption Explicitがあるので当たり前なのですが...)
「txtCSV」という単語自体が特殊な意味を持つのかと調べたのですが検索にもヒットせず...
また、「txtCSV」を変数宣言すると、逆にエラーが発生します。
エラー内容は「既にこの変数は宣言されています」??とか。
(うろ覚えです。)
 
正直、現在は問題なく動作しているので良いのですが
後学の為にも理由を知りたいと考えています。
どなたか有識者の方のお知恵をお借りしたいと考えています。
 
 
---------------------------------------------------------------------------------
「txtCSV」の使用用途
@
「参照」ボタンクリック時
ウィンドウで指定されたインポート用のパスは一旦、「txtCSV」に格納されます。
そこから、「txtCSV」の値を「パス」テーブルに格納しています。
A
「インポート」ボタンクリック時
「パス」テーブルから「txtCSV」に格納します。
「txtCSV」の値を使用してインポート処理を行っています。

回答
投稿日時: 19/04/19 00:57:59
投稿者: Moko

フォームに置かれたテキストボックスの名称では?
 
自分はこういうことで悩まないように
コントロールの場合は Me.txtCSV のように記述するようにしています。

投稿日時: 19/04/19 08:50:36
投稿者: kuroro

フォームに置かれたテキストボックスの名称の場合、
メイン画面のテキストボックス内で変数を宣言した。
とみなされるのでしょうか?

回答
投稿日時: 19/04/19 09:22:26
投稿者: hatena
投稿者のウェブサイトに移動

フォーム上のオプジェクトは、そのフォームのモジュールでは、
Me.コントロール名 というように参照できますが、
この Me. を省略することもできます。
txtCSV がテキストボックス名なら、それは変数ではなく、テキストボックスオプジェクトへの参照ということになります。
 
Mokoさんも回答されてますが、Me. を省略すると変数とオプジェクトの区別がつかないので、省略しないようにすべきです。

回答
投稿日時: 19/04/19 11:29:15
投稿者: sk

引用:
フォームに置かれたテキストボックスの名称の場合、
メイン画面のテキストボックス内で変数を宣言した。
とみなされるのでしょうか?

既に回答がついているように、一定の条件が揃っていれば
Me キーワードを省略してそのフォーム自身のメンバー
(プロパティ/メソッド/コントロール)を参照することが出来る、
ということです。
 
例えば、プロシージャレベルに txtCSV という
同じ名前の変数/定数が宣言されている場合は、
Me キーワードを省略してテキストボックス[txtCSV]を
参照することは出来ません。
 
(フォームモジュール)
-------------------------------------------------------------
Private Sub Form_Load()
 
    Dim txtCSV As Variant
     
    txtCSV = 10
    Me.txtCSV.Value = txtCSV * 2
     
    Debug.Print "変数 txtCSV の値:" & txtCSV
    Debug.Print "テキストボックス[txtCSV]の値:" & Me.txtCSV.Value
 
End Sub
-------------------------------------------------------------
 
つまり適用範囲(スコープ)の優先順位としては、
「フォーム自身のメンバー(コントロール)」より
「プロシージャレベルの変数/定数」の方が高い、
ということになります。
 
また、テキストボックス[txtCSV]が存在するフォームの
フォームモジュールのモジュールレベルで txtCSV という
同じ名前の変数/定数を宣言することは出来ません。

投稿日時: 19/04/19 12:36:43
投稿者: kuroro

皆さま回答ありがとうございました!
疑問が解決してスッキリしました!
 
皆さまのおっしゃる通り、フォーム上に[txtCSV]という
テキストボックスは存在します。
自分は[txtCSV]は変数だと考えていましたが、
実際はオブジェクトのことだったのですね。
 
Me
Form
Forms
といった記述がなく、あたかも変数のように使用されていたので
気づけなかったです。
 
自分も同じような設計をしないように気をつけます。