[[20090206112718]] 『マクロを使いボタンをクリックしてシートを選択し』(たかなし) ページの最後に飛ぶ

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

 

『マクロを使いボタンをクリックしてシートを選択したい』(たかなし)

 こんにちは。
 以前お世話になりました、[[20090123142335]]たかなしと申します。
 前回HANA様並びにかみちゃん様には大変お世話になり、感謝の言葉もございません。
 あれから棚卸や引継ぎがあり、返信が出来なくて申し訳ありませんでした。
 今後も時間が取れるときに改めて挑戦させていただこうと考えております。

 さて、今回はシート数が30以上と多岐に渡り、シート名のクリックでは非効率的でしたので
 マクロを使いボタンクリックで管理しようと思いました。 
 私は以下のように組んだのですが、シート名の一覧が見ることが出来ず何とか
 変数を使いまとめられないものかと相談させて頂きたいと思います。

 Sub メニュー()
   Sheets("メニュー").Select
 End Sub
 Sub 勤務規則()
   Sheets("勤務規則").Select
 End Sub
 Sub 品名1()
   Sheets("品名1").Select
 End Sub
 Sub 品名2()
   Sheets("品名2").Select
 End Sub

 以下品名30ほど続く

 これらを

 Sub シート選択()
 Dim a,b,c,d,e,f,g,h,i,j,k,l,m,n
 a = Sheets("メニュー")
 b = Sheets("勤務規則")
 c = Sheets("品名1")
 d = Sheets("品名2")

 ボタン1クリック = b.Select
 ボタン2クリック = c.Select
 End Sub

 このように、または近いやり方等ありましたらご教授いただけないでしょうか。
 メニューシートを選択するボタンは全シートに貼り付け、
 それ以外のボタンはメニューシートにしか使用しません。

 何卒よろしくお願いいたします。
 (たかなし)

 >このように、または近いやり方等ありましたら
 30個のボタンを配置すること自体に 少し抵抗があります。以下、アイデアだけですが、、、

 メニューがアクティブになると、全シート名を「A2:B16」に書き出すようにして、
 その中から、シート名のセルをクリック選択すると、そのシートへ飛ぶ、くらいでどうでしょうか?

 全シート名が固定的なら、ハイパーリンクで飛ぶように設定してもいい様な気もします。

 (半平太) 2009/02/06 12:38

 (半平太)様
 アドバイスありがとうございます。

 ハイパーリンクですが、文字列の選択がしにくい事と、
 シート名の変動が月に一度見直しが入るため難しくなっております。

 なので、前者の方法を検索をしながら一応組み立てたのですが、セルの値を取得して
 そのシート名に移動する方法がわかりません。
 理想では、シート名のクリックと同時にシート移動させたいのですが、
 イベント?の概念がよくわからず困っております。

 更に、変数nを宣言したときに、ユーザー定義ではありませんと出てしまったのですが、
 どのような意味なのでしょう。
 また、Dim xxxx(256) As Stringの意味と、最初のForで書き出すのではなく、
 後者のForで書き出している操作の仕組みを教えていただけたらと思います。

 下記のコードは、コメントにあるところを参照して、自分用にわかりやすく添削したものです。

 Sub シート名()
    'http://oshiete1.goo.ne.jp/qa3993898.html
    '参考にしたページ
    Dim i As Integer
    Dim myShCt As Integer
    Dim myShNam(256) As String
    'Application.ScreenUpdating = False

    myShCt = ThisWorkbook.Sheets.Count

    For i = 2 To myShCt
        myShNam(i) = Sheets(i).Name
    Next i

    With Sheets("MENU")
        .Columns("B:B").ClearContents
        .Cells(2, 2).Value = "項目名"

    'このループで取得したシート名をセルに代入

        For n = 3 To myShCt
            .Cells(n, 2).Value = myShNam(n)
        Next n
    End With
    'Application.ScreenUpdating = True
 End Sub

 Sub シート移動()
    Dim s As String
    s = Selection.Name
    ThisWorkbook.Sheets(s).Select
 End Sub

 以上宜しくお願いいたします。
 (たかなし)

 半平太はんとは別案ですけど、ユーザーフォームで移動っちゅうんはどないでっか?
 ユーザーフォームを一個作成します。コントロールは不要です。
 それだけでええです。

 そのフォームをWクリックしますとフォームモジュール画面に移りますから、そこへ
 ↓のコードを貼り付けます。
 '----------------------------
 Private Lbl As MSForms.Label
 Private WithEvents リスト As MSForms.ListBox
 Private WithEvents 閉じる As MSForms.CommandButton

 Private Sub リスト_Click()
    Dim data As String
    data = リスト.Value
    Sheets(data).Activate
 End Sub

 Private Sub UserForm_Initialize()
    Dim obj As Object, ws As Worksheet
    With Me
       .Width = 100
       .Height = 400
       .Caption = "シートへジャンプ"
    End With
    With Controls.Add("forms.label.1", , True)
        .Top = 8
        .Left = 10
        .Height = 12
        .Width = 150
        .Caption = "どのシートがお好み?"
    End With
    Set リスト = Controls.Add("forms.ListBox.1", , True)
    With リスト
        .Top = 20
        .Left = 10
        .Height = 340
        .Width = 75
        For Each ws In Worksheets
            .AddItem ws.Name
        Next
    End With
 End Sub

 '-----------------------
 ’今度は標準モジュールへ コピペ
 Sub シート選択()
    UserForm1.Show vbModeless
 End Sub

 これでシート選択を実行すればシートのリストが登場して、どこでも行き放題ですワ。
 邪魔ならすみの方へ移動しとけます。
        (弥太郎)


 せっかく書いたので載せておきます。

 シート名は直接書き出してます。
 標準モジュールに貼付。
Sub シート名()
Dim i As Integer
'Application.ScreenUpdating = False
    With Sheets("MENU")
        .Columns("B:B").ClearContents
        .Cells(2, 2).Value = "項目名"
        For i = 2 To Sheets.Count
            'シート名を取得しながらセルに代入
            .Cells(i + 1, 2).Value = Sheets(i).Name
        Next
    End With
'Application.ScreenUpdating = True
End Sub

 以下は、セルを選択したら そのシートへ移動します。
 MENUシートのシートモジュールに貼付 です。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    With Target
        If .Value = "" Then Exit Sub
        If .Column <> 2 Then Exit Sub
        If .Row < 3 Then Exit Sub

        Sheets(.Value).Select
    End With
End Sub

 シートモジュールは、シートタブを右クリックして
 コードの表示 を選んだ時に出てくるモジュールです。

 MENUシートが一番左端に無い場合は
 もう少し変更が必要になります。

 (HANA)

 (弥太郎)様
 早速試してみました。
 結果はもとより、汎用性の高さに感動いたしました! 
 私の仕事場では現場と事務に分かれており、現場の人間はパソコンに不慣れなため、
 棚卸の作業などに戸惑っております。
 しかし、このフォームがあれば、よりわかりやすく作業が進むと考えております。
 ありがとうございました。

 (HANA)様
 こちらもすぐにためさせていただきました。
 私の疑問に対し全て解決していただけていました。
 大変ありがたく思います。
 シートの選択場所を変えるとマクロが動くように出来ることがわかりましたので、
 今後もそういった発想を使ったものが浮かんできました。
 セルに書き出すことで、ここから更に並べ替えや項目分けを行い、
 後半の条件を工夫することで更に使いやすく出来そうです。
 新しい発想を与えてくださいありがとうございます。

 (半平太)様
 もしコードを組んでいただけているようでしたら、教えていただきたいです。
 ボタンを配置することしか知らなかったところを最初に教えていただけたことに
 大変感謝いたしております。
 まだまだ知らないことばかりなので、皆様のお知恵を少しでも吸収できたらと考えております。

 (たかなし)

 > (半平太)様
 > もしコードを組んでいただけているようでしたら、教えていただきたいです。

  済みませーん。「アイデアだけ」なので、積極的に作る気はなかったです。 m(__)m
  イメージとしては、HANAさんのコードに近いものです。

  私のアイデアとの違いは、

  1.『メニューがアクティブになると、』ですので、
    
    「MENU」シートのモジュールに Activateイベント でシート名を書き出す様にします。
     そうすると、シートが増減しても、柔軟に対応出来るのではないかと考えました。

 2、『全シート名を「A2:B16」に書き出すようにして』
    書き出す範囲を2列と想定したのは、縦1列ですと、長くて使いにくいかもしれないと思ったためです。

 ※1 あと、実際にやってみると、シート名のセルは色付けした方がいい気がしました。
   この為、Clearcontents ではなく、Clear にします。

 ※2 MENUシートがアクティブにならないと、シートリストが作られないので、
    初回だけは「MENU」以外のシートに一旦移ってから、再度「MENU」に戻る必要があります。

 具体的なコードは、HANAさんとほとんど同じなので、HANAさんのをお借りして作りました。
 HANAさん、お許しください <(_ _)>

 Private Sub Worksheet_Activate()

 Dim Wsh As Worksheet
 Dim NN As Long
 Application.ScreenUpdating = False
         Range("B2:C20").Clear
         Range("B2").Value = "項目名"

         For Each Wsh In Sheets
              If Wsh.Name <> Me.Name Then
                  NN = NN + 1
                 Range("B3:C20")(NN).Value = Wsh.Name
                 Range("B3:C20")(NN).Interior.ColorIndex = 8
             End If
         Next
 Application.ScreenUpdating = True
 End Sub

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim Tgt As Range
     Set Tgt = Intersect(Target, Range("B3:C20"))
         If Not Tgt Is Nothing Then
             With Tgt
                 If .Count > 1 Or .Value = "" Then
                     Exit Sub
                 Else
                     Sheets(.Value).Select
                 End If
             End With
         End If
 End Sub

 (半平太) 2009/02/06 18:23

 おはようございます。
 (半平太)様
 返信が遅くなり申し訳ございません。
 実家に帰っていたため遅れてしまいました。

 早速試させていただきました。
 確かに一度別のシートに移動するのは面倒になるかもわかりませんが、
 最初に考えていた形に一番近くなりました。
 ありがとうございます。

 《まとめ》
 最終的にはHANA様にご提示いただいた、シート名の書き出しとクリックに落ち着きそうです。
 しかし、形状は半平太様のような並び方になると思います。
 というのは、似たような名前のものなどがあるため、セルに書き写した後種類ごとに並び替え
 たりしないと読みにくいからです。
 また、シートは追加した順のため、弥太郎様の方法ではやや見易さに欠けると考えたからです。

 しかし、弥太郎様のフォームは他のブックに使用させていただくことにしました。
 私の会社の環境が、なぜかExcel97でしたので、シートの色分けができず不便を感じておりましたので
 今後は大幅な作業の効率化が進みそうです。

 最後になりましたが、半平太様、弥太郎様、並びにHANA様大変お世話になりありがとうございました。
 まだまだ勉強途中でございますが、また何かありましたらよろしくお願い申し上げます。
 (たかなし)

コメント返信:

[ 一覧(最新更新順) ]


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