![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
一応以下のVBAを作って稼動していますが、もっとスマートな方法はないでしょうか。ご存知の方よろしくお願いもうしあげます。
シートやフォームのボタン・ラベルのキャプション、テキストボックスのテキスト、チェックボタンの値をiniファイルに保存し、次回それを使用するVBAを作りました。
iniファイルの中身は以下ようになっています。
[シート名]
CommandButton1.Caption=xxxx
Label3.Caption=yyyy
TextBox6.Text=zzzz
・
・
[フォーム名]
CommandButton8.Caption=xxxx
Label5.Caption=yyyy
・
・
iniファイル作成時はkeyには"CommandButton1.Caption"、その値にはSheets("シート名").CommandButton1.Captionなどの様に個々のオブジェクトを指定しています。
iniファイル読取時はSelect Case文でkey"CommandButton1.Caption"だったら.CommandButton1.Captionに値をセットするようにしています。
セットする個々のオブジェクト全てに書出し、読取りを行っていますのでとても冗長なVBAの記述になっています。
個々のオブジェクトを指定せずに書き出す方法、及びiniファイルに書かれているオブジェクト名で該当オブジェクトに値を設定する方法が知りたいのです。
No.1ベストアンサー
- 回答日時:
エクセルVBAでAPIが使えたかどうかは不明ですが、
APIの
GetPrivateProfileSectionNames
GetPrivateProfileSection
を使えば、INIファイルの内容を列挙できます。それと
Me.Controls("TextBox1").Text
こういう表記でオブジェクトを指定が可能です。
これらを使えば実装できるのではないでしょうか:)
#APIが使えなかったら申しわけない。
この回答への補足
回答ありがとうございます。
GetPrivateProfileSectionNames、GetPrivateProfileSectionなどのAPIに関しては既に使用しております。
教えていただいた「Me.Controls("TextBox1").Text」を色々トライしてみましたが、Meでしたらフォーム上に記述したVBAのみ、Meの部分をフォーム名に変えた場合、標準モジュールから使えましたが、フォーム上のオブジェクトに対してのみ使えるようで、シート上のものに対してはできないようですね。
今回作ったVBAは1つのフォームだけでなく複数のフォーム及びシート上のオブジェクトの内容及び一部のシートの内容そのものを終了時にiniファイルに保存し、次回開始時にiniファイルから呼出すものです。
したがってこのVBAはThisWorkbook又は標準モジュールに記述することになると思います。(現在はThisWorkbookのWorkbook_Open及びWorkbook_BeforeCloseに記述しております)
教えていただいた「Me.Controls("TextBox1").Text」に相当することをThisWorkbook又は標準モジュール上でフォームだけでなくシートのオブジェクトへの設定をどうやって実現するかを知りたいのです。
よろしくお願い申し上げます。
P.S.
このエクセルはホストコンピュータの端末です。
端末ソフトのOCXを参照し端末画面を第一シートに設定しています。
この画面に対する各種コマンドをボタンやラベル、テキストボックスから自動入力できるようになっています。
画面の周りにボタンやラベルを配置していますが、それだけでは足りないので必要に応じてフォームを呼出して使えるようにしています。
第二シート以降は簡易言語のようにコマンド群を記述できるようになっています。
使用する担当者によりコマンドなどをカスタマイズする必要がありますが、管理上本体のコピーを許可せず、本体はサーバー上に書き込み禁止の設定で置き、設定内容を各自のiniファイルに保存させております。
教えていただいた「Me.Controls」でネットを検索していたら、どうやら解決の糸口が見つかりました。
フォームに対しては.Controls、シートに対しては.OLEObjectsを使えばいいようですね。
こんな感じで作ってやればできそうですね。
Sub Test()
Dim myO As OLEObject
For Each myO In Sheets("Sheet1").OLEObjects
Debug.Print myO.Name
If InStr(myO.Name, "TextBox") > 0 Then
Debug.Print Sheets("Sheet1").OLEObjects(myO.Name).Object.Text
End If
If InStr(myO.Name, "CommandButton") > 0 Then
Debug.Print Sheets("Sheet1").OLEObjects(myO.Name).Object.Caption
End If
If InStr(myO.Name, "Label") > 0 Then
Debug.Print Sheets("Sheet1").OLEObjects(myO.Name).Object.Caption
End If
Next
End Sub
No.2
- 回答日時:
こんにちは。
オブジェクト名で Object を指定する方法は解決したようですね。
あとは、プロパティー名で Property を設定できれば良さそうですか?
CallByName を調べてみて下さい。
CallByName の第一引数に渡す Object は、セクション名とキー名から
既知なはずです。例えば、
> CommandButton1.Caption=xxxx
であれば、キー名 CommandButton1.Caption を切り分けたらオブジェクト名
とプロパティー名が拾えますよね。また、セクション名でそのオブジェクト
の親オブジェクトが分ります。
> [Sheet1]
> CommandButton1.Caption=xxxx
> Label3.Caption=yyyy
> TextBox6.Text=zzzz
とりあえず上記の INI で試してみましたが、Select Case や IF を使わず
値を設定することができましたよ。
回答ありがとうございます。
CallByNameを使うのに四苦八苦しましたが、こんな具合に使えばいいんですね。
Sub Macro1()
Debug.Print CallByName(Sheets("Sheet1").OLEObjects("TextBox1").Object, "Text", VbGet)
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 検索のユーザーフォームの表示について 1 2023/03/27 23:31
- Excel(エクセル) VBA 同日で2回目(午後)の体温を登録するときのコード 3 2022/08/28 20:29
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- CAD・DTP Autocad Scriptファイルからの入力とコマンドラインからの入力が違う 1 2023/08/01 09:13
- Visual Basic(VBA) DisplayAlertsブロパティで ”実行時エラー424オブジェクトが必要です” 5 2022/05/15 18:02
- Excel(エクセル) マクロでボタンにつける名前がどこに設定されているかわからないケースがありました。 1 2023/06/19 19:37
- Visual Basic(VBA) VBAのトグルボタンでのマクロについて質問です 3 2022/10/10 17:23
- Excel(エクセル) エクセルVBAでチェックボックスにチェックを入れる 1 2022/09/14 00:52
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) VBA アドインについて お詳しい方 ご教授をお願いします。 相談事項 現在以下の対応を実施した所、 1 2022/11/02 16:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで =EMBED("Acrobat Docu...
-
C#でフォームのオブジェクト名...
-
CoCreateInstanceでエラーになる。
-
パワーポイントのVBAでテキスト...
-
VBA 同じ名前のオブジェクトを...
-
EXCEL VBAにて動的にCheckBOXを...
-
オブジェクトレベルとメタレベル
-
ワイルドカード<?>と型パラメー...
-
withを入れ子にして使う方法
-
Rangeオブジェクトを一時的に作...
-
[Javascript]テキストボックス...
-
Listに格納されているオブジェ...
-
Object型からDouble型へのキャスト
-
error C2712: オブジェクト ア...
-
COMコンポーネントって何?
-
Javaで画像パスからImageIconオ...
-
VBAのWindowオブジェクトとWork...
-
LabelValueBeanで作成したリス...
-
JqueryとPrototypeの比較
-
サブクラス化
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBA 同じ名前のオブジェクトを...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
ワイルドカード<?>と型パラメー...
-
COMコンポーネントって何?
-
Object型からDouble型へのキャスト
-
LISTBOXの内容が更新されま...
-
オブジェクトレベルとメタレベル
-
ビジュアルC++でボタンの有...
-
戻り値がクラスオブジェクト
-
CoCreateInstanceでエラーになる。
-
Accessの連結・非連結オブジェ...
-
オブジェクト名をforループ内で...
-
JqueryとPrototypeの比較
-
JAVAからHTMLへ値を返す方法
-
VBAでvlookup関数から、別シー...
-
Vbで通常使用するプリンターを...
おすすめ情報