- ベストアンサー
エクセル VBA 表示範囲の簡素化
- エクセルのVBAを使用して表示範囲を簡素化する方法について教えてください。
- CommandButtonが複数ある場合、それぞれのボタンをクリックした際に表示範囲を適切に設定する方法を教えてください。
- 基本台紙シートで特定の範囲を表示させるためのVBAコードを簡素化したいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
クラスモジュールを使うのが嫌なら,こんな感じで... Private Sub CommandButton1_Click() call CommonTask("A1:D7") End Sub Private Sub CommandButton2_Click() call CommonTask("A8:B21") End Sub Sub CommonTask(s) Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range(s) Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17070)
ボタンを作るのはForNextループで30回Add繰り返せば仕舞。 変わるところ、LEFT,TOP、などは一定であるとか、何個目かで、計算して変数で指定すれば仕舞。 WIDTH、HEIGHTは同じ値の場合が多いだろう。 Rangeがボタンによって可変で出てくるようだが、計算して指定すればっできるだろう。 ーー 問題は (1)エクセルで、こんな多数のボタンを作って扱うのは設計がおかしくないか?、誰かに相談すべきだ。よくわかっていてそれしかないと結論したらやむを得ないが。 こういう設計段階が、経験やスキルが如実に出るところで、扱うニーヅや取り組みの視点がおかしくはないか。思いついてすぐ方向を決めて動いているようだ。 (2)さらに、、問題は、各ボタンをクリックしたとき、どのボタンがクリックされたかのプログラムは、似た30個のイベントプロを書かないでやる方法は、VBAでは難しいのを知っているのか? 「クラスモジュールを使う」かとか、さらにむつかしいよ。(コントロール配列がVBAで使えないとかがあって) VB.NET系のVBなどならクラスは根本だが、VBAではクラスの利用は敷居が高いと思うよ。 == シートのセルをクリックしたセルは、SelectionChangeイベントのTargetでわかるから、それでCase文で分けるとか、クリックしたセルの行や列と関連付けて処理できないか。 = ボタンを散りばめたりするには、「エクセルをあまりできない人が使う」というのが理由かもしれないが、そういうケースの対応は、経験があり技量のあるプロやプロ並みの人のやること。質問ぶりから、とてもそこまで行っていると思えない。再考したらどうか。
- eden3616
- ベストアンサー率65% (267/405)
ご質問のcommandbutton1~3において以下のように参照セル範囲に規則性がありません。 ご質問の情報に誤りがあるのか、参照範囲は別の方法で取得できるのか別途一覧などがありますか? Set rng = Range("A1:D7") Set rng = Range("A8:B21") Set rng = Range("C8:D21") 数ある処理を集約するためには、数値や文字など変動する箇所を変数に入れて同じ処理を行うためにパターン化できることが前提にあります。 スマートなものはクラス定義ですが、冗長的ではありますが簡素に行うのであれば以下のような方法もあります。 1つのプロシージャに処理をまとめて、callで呼び出す際に対象のセル範囲を一緒に渡して処理しています。 Sub sample(myRng As String) Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range(myRng) Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub 'commandbuttonクリックイベント1~30(引数に文字列でセル範囲を指定) Private Sub CommandButton1_Click() Call sample("A1:D7") End Sub Private Sub CommandButton2_Click() Call sample("A8:B21") End Sub Private Sub CommandButton3_Click() Call sample("C8:D21") End Sub ・ ・ ・ Private Sub CommandButton30_Click() Call sample("XX:XX") End Sub ============================== 一部のbuttonにより処理を分岐させる必要などがあれば、引数に「ActiveControl.Name」を追加することでcontrolのオブジェクト名をsampleプロシージャに渡すことができますので、上記コードを以下のように変更することで分岐することもできます。 ▼各クリックイベント内 Call sample("A1:D7") ↓ Call sample(ActiveControl.Name,"A1:D7") ▼sampleプロシージャ内 Sub sample(myRng As String) ~ End Sub ↓ Sub sample(btnName As String, myRng As String) btnName = Replace(btnName,"CommandButton","") Select Case CInt(btnName) '共通の処理 Case 1 'commandbutton1の処理 Case 2, 3 'commandbutton2及び3の処理 Case Else 'それ以外のcommandbuttonの処理 End Select '共通の処理 End Sub
お礼
eden3616 様 早速のご回答ありがとうございます。
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは CommandButton1からCommandButton30が有るとすると、 クラスモジュールを挿入して、(名前はClass1のまま) Private WithEvents Btn As MSForms.CommandButton Private Index As Integer Public Sub NewClass(ByVal c As MSForms.CommandButton, ByVal i As Integer) Set Btn = c Index = i End Sub Private Sub Btn_Click() Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range("A1:D7").Offset(Index) Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select End Sub ユーザーフォームのコードに、 Private NumCmd(0 To 29) As New Class1 Private Sub UserForm_Initialize() Dim i As Integer For i = 0 To 29 NumCmd(i).NewClass Controls("CommandButton" & i + 1), i Next End Sub のようにしてみるとどうですか? ' Unload Me ' UserForm1.Show vbModeless は、ちょっとなんの為か良く分かりません。 UserForm1上のコマンドボタンの話ですよね?
お礼
ushi2015 様 早速のご回答ありがとうございます。 ' Unload Me ' UserForm1.Show vbModeless は、UserForm2を閉じてシートを表示します。 そのシート上にUserForm1を表示して、クリックすると 再度UserForm2を表示させるためです。
お礼
imogasi 様 早速のご回答ありがとうございます。 シート内には写真撮影時に添付する台紙を300枚以上作成してあります。 1枚(7行2列)工事の内容によって使用する台紙の枚数及び内容が変化します。 ユーザーフォーム内のCommandButtonを押下して、それぞれの工事内容にあった範囲にあるセル(台紙)のみ表示し内容を確認する。 設計がおかしくないか? 人には人の理由があるのではないでしょうか。 経験があり技量のあるプロやプロ並みの人のやること。 プロやプロ並みの人は、質問されないと思います。 反論してすみません。