質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

954閲覧

VBAでループのシート移動をしたい

mori_reta

総合スコア10

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/07/03 02:52

前提・実現したいこと

シートに「前へ」「次へ」ボタンを設置してそれを押すとページ移動できるようにしたいです。
また、シートは
HOME|移動範囲1|移動範囲2|移動範囲3|移動範囲4|科目
このようにあり、移動範囲内をループで移動したいです。

例:移動範囲3で次へ→移動範囲4に移動→移動範囲4で次へ→移動範囲1に移動
例:移動範囲2で前へ→移動範囲1に移動→移動範囲1で前へ→移動範囲4に移動

このような形にしたいと思っています。

また、移動範囲のシートは追加することがあるので後ろの判定を科目シートの1つ前で取りたいと思っております。

該当のソースコード

VBA

1'ページ移動前へ 2Sub PrevPage() 3 4 ActiveSheet.Previous.Activate 5 6End Sub 7 8 9'ページ移動次へ 10Sub NextPage() 11 12 ActiveSheet.Next.Activate 13 14End Sub

試したこと

IF文の利用も考えたのですが、For Next文の方がいいのでしょうか?
また、とりあえず次への方から取り組んでみたのですが、上手く動作しませんでした。

VBA

1'ページ移動前へ 2Sub PrevPage() 3 4 ActiveSheet.Previous.Activate 5 6End Sub 7 8 9'ページ移動次へ 10Sub NextPage() 11 Dim i As Long 12 13 For i = 2 To Worksheets("科目") '←科目のひとつ前の判定の取り方がわからないです 14 15 Next 16 ActiveSheet.Next.Activate 17 18End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

参考程度です。
アドインメニューへComboboxをシート名で登録して選択する様にすると楽ですよ。
イメージ説明

VBA

1Option Explicit 2' 3Public gobjCmdBar As CommandBar 4Public gCmdBarBtn As CommandBarButton 5Public gobjCmdCombo As CommandBarComboBox 6 7' *********************************************** 8' コマンドバー登録 9' *********************************************** 10Function Test_Sample_Miniature() As Boolean 11 12 Dim MySheet As Worksheet 13 Dim Bar As CommandBar 14 Dim blnFlag As Boolean 15 16 '試験用でメニュー削除 17 Call Close_CommandBar 18 19 'メニュー登録済み確認 20 For Each Bar In Application.CommandBars 21 If Bar.Name = "メニュー" Then 22 Exit Function 23 End If 24 Next Bar 25 26 'メニュー追加 27 Set gobjCmdBar = Application.CommandBars.Add(Name:="メニュー", Temporary:=True) 28 gobjCmdBar.Position = msoBarTop 29 gobjCmdBar.Visible = True 30 31 'コンボBox追加 32 Set gobjCmdBar = gobjCmdBar 33 Set gobjCmdCombo = gobjCmdBar.Controls.Add(Type:=msoControlComboBox) 34 35 'コンボBoxリスト追加 36 For Each MySheet In ThisWorkbook.Worksheets 37 blnFlag = True 38 If InStr(MySheet.Name, "Home") > 0 Then blnFlag = False 39 If InStr(MySheet.Name, "科目") > 0 Then blnFlag = False 40 If blnFlag = True Then 41 gobjCmdCombo.AddItem Text:=MySheet.Name 42 gobjCmdCombo.OnAction = "SelectSheetActive処理" 43 End If 44 Next 45 gobjCmdCombo.Style = msoComboLabel 46 gobjCmdCombo.Text = gobjCmdCombo.List(1) 47 48 '開放 49 Set gCmdBarBtn = Nothing 50 Set gobjCmdBar = Nothing 51 52End Function 53 54' *********************************************** 55' SelectSheetActive処理 56' *********************************************** 57Function SelectSheetActive処理() As Boolean 58 ThisWorkbook.Worksheets(gobjCmdCombo.Text).Activate 59End Function 60 61' *********************************************** 62' コマンドバーを削除する 63' *********************************************** 64Function Close_CommandBar() As Boolean 65 On Error Resume Next 66 gobjCmdCombo.Delete 67 Application.CommandBars("メニュー").Delete 68End Function

投稿2020/07/03 06:05

tosi

総合スコア553

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こんなんですかね。
それぞれ関数をボタンに割り当ててください。

VBA

1Sub Next_Click() 2 Dim sh As Worksheet 3 Set sh = ActiveSheet 4 Dim n As Long 5 If Worksheets(sh.Index + 1).Name = "科目" Then 6 n = Worksheets("HOME").Index 7 Else 8 n = sh.Index + 1 9 End If 10 sh.Move after:=Worksheets(n) 11End Sub 12 13Sub Prev_Click() 14 Dim sh As Worksheet 15 Set sh = ActiveSheet 16 Dim n As Long 17 If Worksheets(sh.Index - 1).Name = "HOME" Then 18 n = Worksheets("科目").Index 19 Else 20 n = sh.Index - 1 21 End If 22 sh.Move before:=Worksheets(n) 23End Sub

投稿2020/07/03 04:11

編集2020/07/03 05:12
ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2020/07/03 05:12

すみません。 職場の環境から投稿するとたまにこうなります。 再投稿しましたのでご確認ください。
radames1000

2020/07/03 05:23 編集

ありがとうございます。 Moveで書かれてますが、質問者さんがActivateとされてるのでSelectが意図したものかと思いました。 Sub Next_Click() Dim sh As Worksheet Set sh = ActiveSheet Dim n As Long If Worksheets(sh.Index + 1).Name = "科目" Then n = Worksheets("HOME").Index + 1 Else n = sh.Index + 1 End If Sheets(n).Select End Sub Sub Prev_Click() Dim sh As Worksheet Set sh = ActiveSheet Dim n As Long If Worksheets(sh.Index - 1).Name = "HOME" Then n = Worksheets("科目").Index - 1 Else n = sh.Index - 1 End If Sheets(n).Select End Sub
ttyp03

2020/07/03 05:30 編集

質問の意図を読み違えたか。。。 シートを移動させたいではなく、表示するシートを変更したいってことですか。 だとすればradames1000さんが修正してくださったものでよさそうですね。
ttyp03

2020/07/03 06:38

MoveなのかSelectなのか、どちらが求めているものだったのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問