Microsoft Access 掲示板

フィールド名を変数にしたとき

2 コメント
views
4 フォロー

ここのところ、初心者ながらAccess、ExcelのVBAを扱っていて
もやもやしていることがあり、お尋ねさせていただきたく書き込みします。

例えばフィールド名「txtタイトル」があって中身が「ドラゴンクエスト」だったとします。
これを
Dim txtTitle as string
txtTitle = Me.txtタイトル
と変数で置いたとき
「txtTitle」は"ドラゴンクエスト"として扱えるのか、"Me.txtタイトル"として扱えるのか
理解できておりません。
"ドラゴンクエスト"として扱いたいとしたら
Me.Controls(txtTitle) として扱わないといけないのでしょうか。

というのも、Excelのテキストボックスフォームで、テキストボックスの中身をコピーするコードを作ろうと思ったら
単純にtxtTitle.copy のような感じではうまくいかず、テキストボックスの頭から最後までコピーする、という
ようなコードを作らないといけないということも知りました。

なんだか思うように使えたり使えなかったりしていて、危なっかしいのできちんと理解したいと思っています。
ちなみに先ほど条件によりラベルの色を変更したいと思い

dim lblTitle as string
lblTitle = Me.lblタイトル
lblTitle.ForeColor = RGB(255, 0, 0)

としていたら、以下のエラーが出ました。
「実行時エラー438
オブジェクトは、このプロパティまたはメソッドをサポートしていません。」

色々頭がこんがらがっており、このような質問で申し訳ありません。

トマト
作成: 2020/09/07 (月) 17:26:32
最終更新: 2020/09/07 (月) 17:29:50
通報 ...
1
hiroton 2020/09/08 (火) 10:28:50 c3560@f966d

基本的なところなので解説しているサイトをいろいろ探してみると良いです
オブジェクトを入れる変数(Office TANAKAさん)

VBAでは既定のプロパティの省略というコーディングを楽にするための仕組みがあるので、その結果として違いの判らない動作もあります。以下サンプルコードを記述するので違いを比べてみてください

ex)通常の変数宣言(文字列型)

Dim txtTitle as string '//文字列型として変数を定義
txtTitle = Me.txtタイトル
'//単純な変数の代入の場合、「式」は評価され、既定のプロパティが代入される。次の式と等価
txtTitle = Me.txtタイトル.Value

MsgBox txtTitle '//"ドラゴンクエスト"が表示される。次の式と等価
MsgBox "ドラゴンクエスト"

MsgBox Me.Controls(txtTitle) '//"ドラゴンクエスト"という名前のコントロールが参照される(多分存在しないのでエラー)。次の式と等価
MsgBox Me.Controls("ドラゴンクエスト").Value 

txtTitle = Me.txtタイトル.Name '//Nameプロパティを明示したので"txtタイトル"が代入される
MsgBox Me.Controls(txtTitle) '//"ドラゴンクエスト"が表示される。次の式と等価
MsgBox Me.Controls("txtタイトル").Value 

txtTitle = "ファイナルファンタジー"
MsgBox Me.txtタイトル '//"ドラゴンクエスト"が表示される

txtTitle.SizeToFit '//ただの文字列にメソッドはないのでエラー

ex)オブジェクトとしての変数宣言(Textbox型)

Dim txtTitle as TextBox '//テキストボックス型として変数を定義
Set txtTitle = Me.txtタイトル '//objectへの代入、Setが必要

MsgBox txtTitle '//"ドラゴンクエスト"が表示される
'//txtTitleはテキストボックスなので既定のプロパティ(Value)が参照される。次の式と等価
MsgBox Me.txtタイトル.Value

txtTitle = "ファイナルファンタジー" '//テキストボックスへの代入となり、次の式と等価
Me.txtタイトル.Value = "ファイナルファンタジー" 
MsgBox Me.txtタイトル '//"ファイナルファンタジー"が表示される

txtTitle.SizeToFit '//Me.txtタイトル.SizeToFit として動作する

※ACCESSのテキストボックスにはCopyメソッドがないので2番目の例でもtxtTitle.Copyはエラーになる(ACCESSからクリップボードを操作するのはめんどくさいです)

ex)ラベルコントロールを変数にしたい

Dim myLbl As Label
Set myLbl = Me!lblタイトル
myLbl.ForeColor = RGB(255, 0, 0)
2
トマト 2020/09/08 (火) 12:04:48 0029a@1c915 >> 1

就業後にじっくり確認させていただきます。色々読んできたつもりなのですが、なかなか理解しきれず…
教えていただき、本当にうれしいです。読むのが楽しみです。