一応以下の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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#でフォームのオブジェクト名...
-
LISTBOXの内容が更新されま...
-
Excelで =EMBED("Acrobat Docu...
-
ワイルドカード<?>と型パラメー...
-
VBA 同じ名前のオブジェクトを...
-
パワーポイントのVBAでテキスト...
-
0 == False はいいけど
-
Google Apps Scriptの時刻の計算
-
EXCEL VBAにて動的にCheckBOXを...
-
写真が合成か調べる方法
-
JAVAからHTMLへ値を返す方法
-
Date型オブジェクトから日付の...
-
ビジュアルC++でボタンの有...
-
COMコンポーネントって何?
-
Accessでオブジェクトの送信で...
-
Outlook2007送信前の宛先確認の...
-
JavaScriptでペーストイベント...
-
ブラウザ上でEXCELの印刷...
-
オブジェクトに値を保持させる...
-
Vbで通常使用するプリンターを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
VBA 同じ名前のオブジェクトを...
-
C#でフォームのオブジェクト名...
-
Excelで =EMBED("Acrobat Docu...
-
ワイルドカード<?>と型パラメー...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBAのWindowオブジェクトとWork...
-
CoCreateInstanceでエラーになる。
-
COMコンポーネントって何?
-
Object型からDouble型へのキャスト
-
error C2712: オブジェクト ア...
-
ビジュアルC++でボタンの有...
-
Vbで通常使用するプリンターを...
-
時間帯判定をする。
-
Accessの連結・非連結オブジェ...
-
Visual Studioでのbmpファイル...
-
戻り値がクラスオブジェクト
-
LISTBOXの内容が更新されま...
-
bmp画像をjpegやpng画像に圧縮...
-
ワードで画像をドロップすると...
おすすめ情報