VBSで、VBSファイルのあるフォルダを取得する方法です。 これにより、VBSファイルのあるフォルダへの絶対パスを使った処理ができるようになります。
続きを読む VBS: .vbsファイルのあるフォルダを取得する方法「コード」カテゴリーアーカイブ
SQL: Access での CASE文
コントロールを変数にしてForループ Excel VBA
コントロールを引数にしたプロシージャを作るにはどうすればいいのか、 コントロールをForループに入れてやるにはどうすればいいのか。
経緯
フォームをダブルクリックした際に フォーム上の 全テキストボックスについて .Enabled
を変化させようとしました。 全てのコントロール名を書き連ねるのは大変なので、 ループ を使って複数のコントローラに対して処理を行おうと考えました。
解決法
VBA では Me.Controls("ControlName")
でコントロールを取得できます。 そこで、 .Enabled
を変更する TextBox の名前を txtTitle1
、txtTitle2
というようにしておき、次のようなループ処理を実行します。
1 2 3 |
For i = 0 to N Me.Controls("txtTitle" & CStr(i)).Enabled = False Next |
Me.Controls
で取得したコントローラについて複数行の初期化処理を行う場合は With
を使うのもいいですが、 次のように変数に代入して使うこともできます。
1 2 |
Dim cobj As Object Set cobj = Me.Controls("XXXXXX") |
変数宣言のところで As TextBox
などと書くと エラーが出ます。
これらを利用して作ったのが次のコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Option Explicit Private Const N As Integer = 8 '制御する TextBox の総数 'フォームがダブルクリックされたら、テキストボックスを編集不可にします。 Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Dim i As Integer Dim cobj As Object Dim b As Boolean b = Not txtTitle1.Enabled For i = 1 To N Set cobj = Me.Controls("txtTitle" & CStr(i)) cobj.Enabled = b Next i End Sub |
その他下記のような方法が使えそうです。
配列を使う
.Net では コントロール の 配列 (のようなもの) に コレクション というのがあり、 配列のように扱うことができます。 しかし VBA には コレクション クラス が用意されていません。
しかし、 Me.Controls
の引数にする String は配列にできます。
コレクションクラスを作ってしまう
コントロールの集合を扱えるようなクラスを作ってしまうのもいいと思います。
Visual Basic: Integer に 3桁の区切り(カンマ)を入れたい場合
クリスタルレポート 説明文を1ページ目に表示
発注書などでは、最初のページに説明文を表示したいことがある。 しかし、レポートヘッダでは位置が悪い。かといって、ページヘッダではすべてのページに表示される。 そんなときは次のようにすると、1ページ目にだけ表示する項目を設定できる。 1行程度の説明文の場合におすすめ。
ページヘッダ内にテキストを入力する。
入力したテキストを選択して、メニューバーから CrystalReport を選び、その中から、式ワークショップをクリック。
左に表示されるツリーから、ページヘッダを選び、その中の説明文を書いているテキストオブジェクトを選択する。
次に、新規作成を選び、非表示というのを選ぶ。
次のコードを入力する。
1234If pagenumber = 1 thenfalseElseTrue
これで、1ページ目にだけ表示される。