Private Sub Workbook_Open()
Dim shtMOKUJI As Worksheet
Dim i As Worksheet
Dim wkRow As Long
Set shtMOKUJI = Me.Worksheets(cMOKUJI)
shtMOKUJI.Range("A:A").Clear
shtMOKUJI.Cells(1, "A").Value = "目次"
wkRow = 1
' A列のセルにハイパーリンクを設定する
For Each i In Me.Worksheets
If Not i.Name = cMOKUJI Then
wkRow = wkRow + 1
shtMOKUJI.Hyperlinks.Add _
Anchor:=shtMOKUJI.Cells(wkRow, "A") _
, Address:="" _
, SubAddress:=i.Name & "!A1" _
, TextToDisplay:=i.Name
End If
Next i
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim i As Worksheet
' 目次シートを表示する
Me.Worksheets(cMOKUJI).Visible = xlSheetVisible
' 目次シート以外を非表示にする
For Each i In Me.Worksheets
If Not i.Name = cMOKUJI Then
i.Visible = xlSheetVeryHidden
End If
Next i
' 上書き保存する
Me.Save
End Sub
Private Sub Workbook_SheetFollowHyperlink _
(ByVal Sh As Object, ByVal Target As Hyperlink)
If Not Sh.Name = cMOKUJI Then
Exit Sub
End If
' シートを表示する
Me.Worksheets(Split(Target.SubAddress, "!")(0)) _
.Visible = xlSheetVisible
' 目的にシートにジャンプする
Application.Goto Range(Target.SubAddress)
End Sub
For Eachループのネストなど色々やってみたのですが、
うまくいきませんでした。
◆の変数wkRowの箇所を for i=3to7 ←こんな感じで動かしたいのです。For Eachループ、使うのがほとんど初めてなので、勝手が全くわかりません・・・質問がおかしいかもしれませんが、宜しくお願い致します。
Private Sub Workbook_Open()
Dim shtMOKUJI As Worksheet
Dim i As Worksheet
Dim wkRow As Long
Dim j As Variant, N As Variant
実は、For Each 〜 Nextはシートに対してループさせているだけなので、今回の修正のポイントではありません。
寧ろ、wkRowでカウントしているところが注目すべきポイントです。
例えば、3シートずつにしたいなら、カウントが増える度に
0 … 1列目−1行目
1 … 1列目−2行目
2 … 1列目−3行目
3 … 2列目−1行目
4 … 2列目−2行目
5 … 2列目−3行目
6 … 3列目−1行目
7 … 3列目−2行目
8 … 3列目−3行目
となればいいですね?
そのためには、商と剰余を利用すればいいです。
試しにこう↓してみてください。
Private Sub Workbook_Open()
Dim i As Worksheet
Dim wkCount As Long
Dim wkRow As Long
Dim wkColumn As Long
Const cRowCount As Long = 3
wkCount = -1
For Each i In Me.Worksheets
If Not i.Name = cMOKUJI Then
wkCount = wkCount + 1
wkColumn = (wkCount \ cRowCount) + 1
wkRow = (wkCount Mod cRowCount) + 1
MsgBox wkCount & vbCrLf _
& i.Name & vbCrLf _
& wkColumn & "列目" & vbCrLf _
& wkRow & "行目"
End If
Next i
End Sub
これでメッセージが思ったとおりに出るなら、行と列の位置は分かりますね?
でも、1行目からハイパーリンクを作ってしまうのは拙いので、
wkRow = (wkCount Mod cRowCount) + 2
にして、2行目からにするのがおそらく妥当でしょう。
これを踏まえて、元のコードを直すと、
Private Sub Workbook_Open()
Dim shtMOKUJI As Worksheet
Dim i As Worksheet
Dim wkCount As Long
Dim wkRow As Long
Dim wkColumn As Long
Const cRowCount As Long = 3
Set shtMOKUJI = Me.Worksheets(cMOKUJI)
shtMOKUJI.UsedRange.Clear
shtMOKUJI.Cells(1, "A").Value = "目次"
' セルにハイパーリンクを設定する
wkCount = -1
For Each i In Me.Worksheets
If Not i.Name = cMOKUJI Then
wkCount = wkCount + 1
wkColumn = (wkCount \ cRowCount) + 1
wkRow = (wkCount Mod cRowCount) + 2
shtMOKUJI.Hyperlinks.Add _
Anchor:=shtMOKUJI.Cells(wkRow, wkColumn) _
, Address:="" _
, SubAddress:=i.Name & "!A1" _
, TextToDisplay:=i.Name
End If
Next i
End Sub
となります。
なお、3行毎に列を変えるのではなく、5行毎にしたいなら、
Const cRowCount As Long = 3
を
Const cRowCount As Long = 5
にすればいいです。
Private Sub Workbook_Open()
Dim shtMOKUJI As Worksheet
Dim i As Worksheet
Dim wkCount As Long
Dim wkRow As Long
Dim wkColumn As Long
Const cRowCount As Long = 10 'ハイパーリンク作成1列の行数
Set shtMOKUJI = Me.Worksheets(cMOKUJI)
shtMOKUJI.UsedRange.Clear
shtMOKUJI.Cells(2, "B").Value = "****** 目次 ******"
Cells(2, "B").HorizontalAlignment = xlCenter
With shtMOKUJI.Cells(2, "B").Font
.Bold = True
.ColorIndex = 9
.Size = 16
End With
shtMOKUJI.Cells(2, "C").Value = "※クリックしたシートに飛びます。"
' セルにハイパーリンクを設定する
wkCount = -1
For Each i In Me.Worksheets
If Not i.Name = cMOKUJI Then 'シート名が"目次"以外ならリンク作成
wkCount = wkCount + 1 '1回目-1+1=0 2回目0+1=1
wkColumn = (wkCount \ cRowCount) + 2 '1回目 0/10+2=2 2回目 1/10+2=2
wkRow = (wkCount Mod cRowCount) + 4 '1回目 0Mod10+4=4 2回目 1Mod10+4=5
Private Sub Workbook_SheetFollowHyperlink _
(ByVal Sh As Object, ByVal Target As Hyperlink)
'SheetFollowHyperlinkイベント Excel のハイパーリンクをクリックすると発生。
If Not Sh.Name = cMOKUJI Then 'シート名が"目次"以外ならExit Sub
Exit Sub
End If
' シートを表示する
Me.Worksheets(Split(Target.SubAddress, "!")(0)).Visible = xlSheetVisible
'Split 関数 各要素ごとに区切られた文字列から1 次元配列を作成し返す。
ついでに、Workbook_SheetFollowHyperlinkプロシージャも
これに合わせて、逆に ' を取るようにしておきます。
Private Sub Workbook_SheetFollowHyperlink _
(ByVal Sh As Object, ByVal Target As Hyperlink)
Dim SheetName As String
If Not Sh.Name = cMOKUJI Then
Exit Sub
End If
SheetName = Split(Target.SubAddress, "!")(0)
SheetName = Mid(SheetName, 2, Len(SheetName) - 2)
' シートを表示する
Me.Worksheets(SheetName).Visible = xlSheetVisible
' 目的にシートにジャンプする
Application.Goto Range(Target.SubAddress)
End Sub
Private Sub Workbook_Open()
Dim shtMOKUJI As Worksheet
Dim i As Worksheet
Dim wkCount As Long
Dim wkRow As Long
Dim wkColumn As Long
Const cRowCount As Long = 10 'ハイパーリンク作成1列の行数
Application.ScreenUpdating = False
Set shtMOKUJI = Me.Worksheets(cMOKUJI)
shtMOKUJI.UsedRange.Clear
shtMOKUJI.Cells(2, "B").Value = "****** 目次 ******"
Cells(2, "B").HorizontalAlignment = xlCenter
With shtMOKUJI.Cells(2, "B").Font
.Bold = True
.ColorIndex = 9
.Size = 16
End With
shtMOKUJI.Cells(2, "C").Value = "※クリックしたシートに飛びます。"
' セルにハイパーリンクを設定する
wkCount = -1
For Each i In Me.Worksheets
If Not i.Name = cMOKUJI Then 'シート名が"目次"以外ならリンク作成。(目次ページに目次ページへのリンクはいらない)
wkCount = wkCount + 1 '1回目-1+1=0 2回目0+1=1
wkColumn = (wkCount \ cRowCount) + 2 '1回目 0/10+2=2 2回目 1/10+2=2
wkRow = (wkCount Mod cRowCount) + 4 '1回目 0Mod10+4=4 2回目 1Mod10+4=5
Private Sub Workbook_Open()
Dim shtMOKUJI As Worksheet
Dim i As Worksheet
Dim wkCount As Long
Dim wkRow As Long
Dim wkColumn As Long
Const cRowCount As Long = 10 'ハイパーリンク作成1列の行数
Application.ScreenUpdating = False
Set shtMOKUJI = Me.Worksheets(cMOKUJI)
shtMOKUJI.UsedRange.Clear
shtMOKUJI.Cells(2, "B").Value = "****** 目次 ******"
shtMOKUJI.Cells(2, "B").HorizontalAlignment = xlCenter
With shtMOKUJI.Cells(2, "B").Font
.Bold = True
.ColorIndex = 9
.Size = 16
End With
shtMOKUJI.Cells(2, "C").Value = "※クリックしたシートに飛びます。"
wkCount = -1
For Each i In Me.Worksheets
' 目次シート以外の場合
If Not i.Name = cMOKUJI Then
' #### 目次シートのハイパーリンク ####
wkCount = wkCount + 1
wkColumn = (wkCount \ cRowCount) + 2
wkRow = (wkCount Mod cRowCount) + 4
' 目次シートにハイパーリンクを張る
shtMOKUJI.Hyperlinks.Add _
Anchor:=shtMOKUJI.Cells(wkRow, wkColumn) _
, Address:="" _
, SubAddress:="'" & i.Name & "'!A1" _
, TextToDisplay:=i.Name
With shtMOKUJI.Cells(wkRow, wkColumn).Font
.Size = 13
.ColorIndex = 11
End With
' #### 目次シート以外のハイパーリンク ####
If i.Cells(1, 1).Text = "目次へ戻る" Then
i.Cells(1, 1).Clear
Else
i.Rows("1:1").Insert Shift:=xlDown
End If
' 目次シート以外に目次へのリンクを作成する
i.Cells(1, 1).Hyperlinks.Add _
Anchor:=i.Cells(1, 1) _
, Address:="" _
, SubAddress:="'" & cMOKUJI & "'!A1" _
, TextToDisplay:="目次へ戻る"
End If
Next i
With ActiveWindow
.DisplayGridlines = False
.DisplayHeadings = False
End With
With shtMOKUJI.Cells
.Interior.ColorIndex = 19
.EntireColumn.AutoFit
.RowHeight = 22
End With
Application.Goto shtMOKUJI.Range("A1")