[[20140923214824]] 『VBA コントロールについて』(kiss) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA コントロールについて』(kiss)

いつも大変お世話になっております
お手数と思いますが
ご教示頂けると幸いです

Aという名前のファイルにユーザーフォームが有りまして
コマンドボタンを配置しております

コマンドボタン6から40までは下記のようなコードが組み込まれています
Private Sub CommandButton6_Click()
Sheets(4).Select
End Sub
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
Private Sub CommandButton40_Click()
Sheets(38).Select
End Sub

このコマンドボタンを押したとき
既に開かれている B というファイルの
同じくsheets(4)を選択するような事は
出来るのでしょうか??

< 使用 Excel:Excel2013、使用 OS:Windows8 >


 とりあえず、コマンドボタン6は↓のような感じでいけます。
 ただ、コマンドボタン6からコマンドボタン40まで規則性がありますので、
 クラス等を使って簡略化できると思います。

 Private Sub CommandButton6_Click()
  Dim mywb As Workbook
  Dim myws As Worksheet
  Dim otherwb As Workbook
  Dim otherws As Worksheet
  Dim wsnum As Integer
   wsnum = 4
   Set mywb = ThisWorkbook
   Set myws = mywb.Worksheets(wsnum)
   mywb.Activate
   myws.Select
   Set otherwb = Workbooks("B.xlsx")
   Set otherws = otherwb.Worksheets(wsnum)
   otherwb.Activate
   otherws.Select
   Set myws = Nothing
   Set mywb = Nothing
   Set otherws = Nothing
   Set otherwb = Nothing
 End Sub
(カリーニン) 2014/09/23(火) 22:34

 コマンドボタンを大量に作るよりも、リストボックス等で
 4〜38の数値を選択するようにしたらもっと簡単にできますが、
 リストボックスやコンボボックスではだめなのでしょうか?
(カリーニン) 2014/09/23(火) 22:41

 #書いている間にカリーニンさんから回答が出てますね。
 #カリーニンさんのコードをクラスに書けば、出来るかもしれません。

 出来ると思いますけれど、35 個のボタンに全部同じコードを書くのですか?
 ご苦労様です。

 とりあえず、たたき台の想定コードですけれど、参考になるでしょうか。
 新規ブックで試してください(シートは適当に増やしておいてください)。

 UserForm1 を作成し、UserForm に下記のコードを置きます。

 Option Explicit
 Dim cmd() As Class1
 Private Sub UserForm_Initialize()
    Dim cb As MSForms.CommandButton
    Me.Width = 220
    Me.Height = 225
    Dim r As Long, c As Long
    Dim n As Long
    For r = 0 To 6
        For c = 0 To 4
            ReDim Preserve cmd(n)
            Set cmd(n) = New Class1
            Set cb = Me.Controls.Add("Forms.CommandButton.1")
            cb.Top = 20 + r * 25
            cb.Left = 10 + c * 40
            cb.Width = 35
            cb.Height = 20
            cb.Caption = "No." & (n + 1)
            Set cmd(n).cbEvent1 = cb
            cmd(n).Number = n + 1
            n = n + 1
        Next
    Next
 End Sub

 クラスモジュール (Class1)を作成して、下記のコードを置きます。
 Option Explicit

 Public WithEvents cbEvent1 As MSForms.CommandButton
 Public Number As Long

 Private Sub cbEvent1_click()
    If ActiveWorkbook.Worksheets.Count >= Number Then _
        ActiveWorkbook.Worksheets(Number).Activate
    UserForm1.Hide
 End Sub

 これでユーザフォームでボタンをクリックすれば、番号のシートが選択されます。
 ブックを指定したい場合は、クラスモジュールに
        Workbooks("B.xlsx").Worksheets(Number).Activate
 のようなコードを追加すれば(変更すれば)、そういった動作になると思いますが、
 ファイルが開いていないときどうするのか、シート数がないときどうするのか、といった
 チェックはした方が良いように思います。
(Mook) 2014/09/23(火) 22:48

カーリニンさん Mookさん
ご回答有難う御座います

本当に助かりました

流石 自己流 浅知恵とは違い
驚かされるばかりです

もう十倍以上勉強が必要ですね

最初からこんなになると思ってなかったんですけど
機能を増やしていたら
なんかすごくなってしまったって

感じてはいます
(kiss) 2014/09/23(火) 23:46


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.