Page 536 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼パターンの無い繰り返し処理のスマート化 自己満足 03/1/12(日) 15:02 ┣書き間違い 発見 ! 自己満足 03/1/12(日) 18:06 ┗Re:パターンの無い繰り返し処理のスマート化 Hirofumi 03/1/12(日) 20:46 ┣Re:パターンの無い繰り返し処理のスマート化 Hirofumi 03/1/13(月) 7:24 ┗配列利用でしたか 自己満足 03/1/13(月) 8:17 ┗テスト結果の報告 自己満足 03/1/13(月) 9:27 ┗Re:テスト結果の報告 Hirofumi 03/1/13(月) 10:12 ┗Re:テスト結果の報告 自己満足 03/1/13(月) 17:41 ─────────────────────────────────────── ■題名 : パターンの無い繰り返し処理のスマート化 ■名前 : 自己満足 ■日付 : 03/1/12(日) 15:02 -------------------------------------------------------------------------
皆さんお久しぶりです。 この質問箱のおかげで良い方法を学べて、少しずつ それらしい物が出来るようになりました。 (管理人さん、皆さん、ありがとうございます。) 段々と凝りだすと、プログラムが大きくなって来る事は仕方の無い事ですが、 出来るだけスマートに、と心がける今日この頃です。(時候の挨拶みたい...変!) 本題ですが、ユーザーフォームアクティブ時に、選択しているシート毎に ユーザーフォーム内のテキストボックス入力が必要と不必要の別をつける為、 不要項目を薄色表示にして、フォーカスが取れないようにしたいのです。 1つ毎に設定するとシートやコントロールの数が多くなるととんでもない 行数になります。(それらをいっぱい作るとファイルサイズも大きくなります。) 以下のマクロ内の「Case Sheet2.Name」では For I = 1 To 8 UserForm2.Controls("LA" & I).Enabled = False UserForm2.Controls("DA" & I).Enabled = False Next I とすれば少しはスマートになるのですが、 数字が連続や同パターンで変化(たとえばstep3など)していないと使えませんよね。 数字が連続していない「Case Sheet1.Name」などの部分をスマートにする方法は 有りませんでしょうか? 語録が貧困なのでうまく表現出来ませんがよろしくお願いします。 ちなみに、LA3やLA6はラベル、DA3やDA6はテキストボックスの名前で、 同じ番号のラベルとテキストボックスは一対で表示を変えます。 また、シート毎に表示を変更するコントロールの数は固定です。 また、「Case Sheet2.Name」部分のみを上記に書き換えると1KB小さく なりました。 Private Sub UserForm_Activate() Select Case ActiveSheet.Name Case Sheet1.Name With UserForm1 .LA3.Enabled = False .DA3.Enabled = False .LA5.Enabled = False .DA5.Enabled = False .LA6.Enabled = False .DA6.Enabled = False .LA9.Enabled = False .DA9.Enabled = False .LA10.Enabled = False .DA10.Enabled = False .LA11.Enabled = False .DA11.Enabled = False .LA13.Enabled = False .DA13.Enabled = False .LA14.Enabled = False .DA14.Enabled = False End With Case Sheet2.Name With UserForm1 .LA1.Enabled = False .DA1.Enabled = False .LA2.Enabled = False .DA2.Enabled = False .LA3.Enabled = False .DA3.Enabled = False .LA4.Enabled = False .DA4.Enabled = False .LA5.Enabled = False .DA5.Enabled = False .LA6.Enabled = False .DA6.Enabled = False .LA7.Enabled = False .DA7.Enabled = False .LA8.Enabled = False .DA8.Enabled = False End With End Select End Sub |
すみません。書き間違いがありました > For I = 1 To 8 > UserForm2.Controls("LA" & I).Enabled = False > UserForm2.Controls("DA" & I).Enabled = False > Next I >とすれば少しはスマートになるのですが、 ですが....... UserForm2 の所は UserForm1 の間違いでした。 ぜんぜんスマートじゃない。(反省) |
スマートでは無いですが、取りあえずこんなやり方でも簡単には成るよ すこしスピードは落ちると思うけど Private Sub UserForm_Activate() Dim i As Long Dim vntConNumb As Variant Select Case ActiveSheet.Name Case Sheet1.Name vntConNumb = Array(3, 5, 6, 9, 10, 11, 13, 14) Case Sheet2.Name vntConNumb = Array(1, 2, 3, 4, 5, 6, 7, 8) End Select With Me For i = 0 To 7 .Controls("LA" & vntConNumb(i)).Enabled = False .Controls("DA" & vntConNumb(i)).Enabled = False Next i End With End Sub |
後で気が就いたのですが、ラベルをEnabled = Falseにしているのは余り意味がないのでは? |
Hirofumi さん。おはようございます。 ご回答ありがとうございます。 これですよ、これ。 配列だったんですね。 >スマートでは無いですが、取りあえずこんなやり方でも簡単には成るよ いえいえ、この例では数が少ないからそうでも無いですが、私が書いた ものと比べれば断然スマートです。 >すこしスピードは落ちると思うけど う〜ンちょっと辛いけど人間の感覚では早いでしょう。 >後で気が就いたのですが、ラベルをEnabled = Falseにしているのは余り意味がないのでは? 実際にはご指摘の通りまったく意味が無いのですが、私が作った物を使う人たちは 目の悪い人が多いのか、文字のある横を一生懸命クリックして 「文字が入らない、どうしてだ」と聞きにくるので理由を言うと、 「はじめっから表示するな」と言われるんですよ。(泣) カッコウを言われるので、見た目の表示(項目を赤くしたり、文字を大きくしたり) に多大な労力が掛かり、概してファイルが大きくなるのです。 でもこの方法で、かなり小さくなると思います。(あとはメモリ不足の問題?) ありがとうございました。 |
不細工式とスマート式でテストマクロを組んだところ 280KBが255KBと25KBの節約となりました。 このまま作成マクロを作り変えるとマイナスKBになりそうで(ならねーヨ) 楽しみです。 |
書き忘れた事が有りました >また、シート毎に表示を変更するコントロールの数は固定です。 との事で今回は以下のように書きましたが For i = 0 To 7 もし、コントロールの数が不定なら(違わなくても) For i = 0 To UBound(vntConNumb) の様にすれば、配列に設定した数だけ変更できます それと、ラベルのEnabledの件ですが >「はじめっから表示するな」と言われるんですよ。(泣) なら、釈迦に説法かも知れませんがVisible を Falseにして表示しない手も有りますよ |
Hirofumi さん。追加情報どうもです。 >もし、コントロールの数が不定なら(違わなくても) > > For i = 0 To UBound(vntConNumb) > >の様にすれば、配列に設定した数だけ変更できます UBound(配列名)ですね、覚えておきます。 >なら、釈迦に説法かも知れませんがVisible を Falseにして表示しない手も有りますよ すでにやってみたのですよ。歯抜けで表示されますよね。 ...んで、これを見られたら「整理しろ」は確実なのでやめました。 |