エクセル画面を上下に2分割した場合のマクロについて

このQ&Aのポイント
  • エクセル画面を上下に2分割する方法として、下記のマクロを使用しています。
  • 上部のシートはA1:S30までスクロール可能であり、下部のシートはA50:S80までスクロール可能です。
  • しかし、操作中に上部のシートや下部のシートが意図しない位置までスクロールしてしまう問題が発生します。上部のシートと下部のシートが表示列を守るようにする方法はありますか?
回答を見る
  • ベストアンサー

エクセル画面を上下に2分割した場合のマクロについて

エクセル画面を上下に2分割したく、下記のマクロを用いております。 すなわち、上下2分割した上のほうのシートは、A1:S30 までスクロール可能とし、 下のほうのシートは、A50:S80までスクロール可能です。 しかし、操作中に、上のシート表示が、いけないはずの50列あたりまでスクロールしてしまい、戻せなくなってしまいます。また、下のシートも同様です。 難しいかと思いますが、上下のシートが表示列を守るようにできますでしょうか。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) On Error Resume Next If ActiveWindow.Panes.Count = 1 Then ActiveSheet.ScrollArea = "" Exit Sub End If ActiveSheet.ScrollArea = IIf(ActiveWindow.ActivePane.Index = 1, "A1:S30 ", "A50:S80") End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

>やはり、画面のスクロールがうまくいったり、いかなかったり、、、不安定でした。 スクロール自体が動かなくなる現象の原因は、何かは分からないのですが、こちらでは、再ロードすることで直るというのは、プログラムの仕様に関わっている問題だと思いますので、今、不具合がある状態では、この方法は、やめておいたほうが無難ですね。 VBAのコード自体では触っても直るものだとは思えません。こちらでは、片方の画面がロックしてしまうようです。 もともと、分割というのは、メニューやフィールドとして使って、上部の画面を止めておくためのものですね。だから、そちらを動かすということ自体が間違いなのかもしれません。 "A1:S30" と "A50:S80" ですから、それ以外の行の部分は、非表示と保護を使って、その他のセルにはアクセス出来ないようにするという方法があるのではないでしょうか? その間には、ラインを引いておくわけです。それも一興だと思います。(一応、試してみましたが、セルの保護は不要かもしれません。ただし、これは、私のアイデアではなくて、古くからある方法です。) >IIFをIFにしたら、できなくなりました。 少し、解説しておきます。IIF というのは、本来、あまりExcel VBAなどで使われない理由は、 IIf(ActiveWindow.ActivePane.Index = 1, "A1:S30 ", "A50:S80") IIFは、IFのような分岐ではなく、一応、左から右に、すべてコードが走っていくので、真偽とも、両方は成り立たなくてはならないことと、万が一に、片方でエラーが発生したりすると、実行時エラーが発生してしまうからです。私個人、まったく使わないわけではありませんが、単純なものに限ったほうがよいです。だから、VBAでは、IF分岐のほうがよいとされています。 同じ意味のはずですが、違いは分かりますね。 Sub Test1()  Dim a As Long  Dim b As Long  Dim ret As Double  a = 0: b = 4  ret = IIf(a = 0, 1, b / a) 'こちらはエラーになります。  MsgBox ret End Sub Sub Test2()  Dim a As Long  Dim b As Long  Dim ret As Double  a = 0: b = 4  If a = 0 Then   ret = 1  Else   ret = b / a  End If  MsgBox ret End Sub

a26vNvvub
質問者

お礼

より具体的にご教示いただきありがとうございます。 >非表示と保護を使って、その他のセルにはアクセス出来ないようにするという方法があるのではないでしょうか? このような方法があるとは知りませんでした。(恥ずかしながら) 早速、試して見たいと思います。 本当にありがとうございました。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

ご質問のマクロ自体は、Aceess ではないので、IIf は使わないというだけで、後は、問題ないと思います。良く分かりません。 >上下のシートが表示列を守るようにできますでしょうか。 完全には出来ないと思いますが、思い当たる部分を念の為にいくつか入れてみました。 一旦、保存し、ブックを終了してから再度開けて試したほうが良いようです。二種類のイベントを交互に試したら、片方のペインのスクロールが動かなくなりました。 '// Private Sub Worksheet_SelectionChange(ByVal Target As Range)  'シートの分割に限る  Dim pn1 As Pane, pn2 As Pane  Const mAREA1 As String = "A1:S30"  Const mAREA2 As String = "A50:S80"  With ActiveWindow   '2分割のみ   If .Panes.Count = 1 Then: Me.ScrollArea = "": Exit Sub   If .Panes.Count > 2 Then Exit Sub   Set pn1 = .Panes(1): Set pn2 = .Panes(2)    Me.ScrollArea = ""   Application.EnableEvents = False   If .ActivePane.Index = 1 Then    'Targetが外れている場合    If Intersect(Target, Range(mAREA1)) Is Nothing Then     Application.Goto Range(mAREA1).Cells(1), True    End If    Me.ScrollArea = mAREA1    .Panes(1).Activate   ElseIf .ActivePane.Index = 2 Then    'Targetが外れている場合    If Intersect(Target, Range(mAREA2)) Is Nothing Then     Application.Goto Range(mAREA2).Cells(1), True    End If    Me.ScrollArea = mAREA2    .Panes(2).Activate   End If   Application.EnableEvents = True  End With End Sub

a26vNvvub
質問者

お礼

ありがとうございます。 ご丁寧に例まで示していただき、大変感謝しております。 やはり、画面のスクロールがうまくいったり、いかなかったり、、、不安定でした。 シートにグラフを表示していることもあるかと思います。 グラフを選択した状態では、スクロールができてしまうときがあるので。 また、IIFをIFにしたら、できなくなりました。

関連するQ&A

  • 再び質問です。1つのシートを上下に分割した状態で、

    できれば、新しいウィンドウを開かずに、 ウィンドウ⇒分割 1つのシートを上下に分割した状態で、 上半分のシートは、縦のスクロールが1から50までに制限し、 下半分のシートは、縦のスクロールが60から100までに制限したいのです。 ↑ここまでは、解決しました。(下記マクロ) Private Sub Worksheet_SelectionChange(ByVal Target As Range) If ActiveWindow.Panes.Count = 1 Then ActiveSheet.ScrollArea = "" Exit Sub End If ActiveSheet.ScrollArea = IIf(ActiveWindow.ActivePane.Index = 1, "1:50", "60:100") End Sub できれば、同時に水平のスクロールをA列からP列までに制限したいのですが、 マクロの続きを教えていただけると幸いです。

  • エクセル マクロを利用して繰り返して入力する方法

    マクロでA1B1C1D1E1F1セルに入力しF1入力後A2B2C2D2E2F2と 下方向へ繰り返し800行くらいまで入力し、それとB列はスキップしたいのですが下記の方法で別々のシートでは うまくいくのですが同じシ-ト内ではエラ-になってしまいます 次の行への移動 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 7 Then Cells(Target.Row + 1, 1).Select End If End Sub B列のスキップ Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Range("G1") <> "" Then If Target.Column = 2 Then Target.Offset(0, 1).Select End If End If End Sub どなたかご存じの方教えて下さい

  • エクセルで特定のセルしか選択させない方法?

    エクセル97です。シートの連続しない特定のセル数箇所だけをカーソルで選択できるようにし、他の部分はカーソルが移動しないようにしたいのです。過去の書き込みをみて Sub Test() ActiveSheet.ScrollArea = "F10" ActiveSheet.ScrollArea = "F12" ActiveSheet.ScrollArea = "F14" End Sub と、やってみましたが、F10で止ったままになってしまいました。 連続しないセルを指定するのはどうすればいいのでしょうか? また、この制限を解除する方法も教えてくださいますようお願いします。

  • マクロの疑問

    Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address <> "A2" Then Range("A2").Select End If End Sub とすると、どのセルを選んでもA2に飛ぶのに、 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "A3" Then Range("A2").Select End If End Sub とすると、A3を選んでも全く移動しないのはなぜでしょうか。 なにか落とし穴がありそうで。。。 よろしくお願いします。

  • [EXCEL] シートを統合するマクロ

    下記は全てのシートを"ALL"という名前のシートに統合するマクロのようですが、"ALL"というシートの一番上 一行が 空きになってしまいます。1行目から使用したいのですが、 どこをどう書き換えれば良いのでしょうか? Sub copy() s0 = ActiveSheet.Name Sheets.Add.Name = "ALL" s1 = ActiveSheet.Name For Each mySH In Sheets If mySH.Name <> s0 Then If mySH.Name <> s1 Then myE = Range("A65536").End(xlUp).Row + 1 myE2 = mySH.Range("A65536").End(xlUp).Row mySH.Range("1:" & myE2).copy Range(myE & ":" & myE) End If End If Next End Sub

  • Excelマクロについて

    先日、OKWEBで教えてもらったマクロに手を加えて作ろうとしたのですが、エラーがでて動かなくなりました。 わかる方がいましたら教えてください。 よろしくおねがいします。 Sub 見積書() Application.ScreenUpdating = False '見積書(完成)シートを選択 Sheets("見積書(完成)").Select '行の高さを「15」にする。 Rows("6:67").Select Range("F6").Activate Selection.RowHeight = 15 'S列のS6:S56をコピーしてE6:E7に貼り付ける。 Range("S6:S56").Select Selection.Copy Range("E6:E7").Select ActiveSheet.Paste '5列目(工数)が「0」のとき該当する行の高さを「0」にする。 For i = ActiveSheet.UsedRange.Rows.Count To 1 Step -1 If Cells(i, 5).Value = "0" And Cells(i, 7).Value = "0" Then Rows(i).RowHeight = 0 End If Next '「E8:E55」の範囲を四捨五入する。 For i = ActiveSheet.UsedRange.Rows.Count To 1 Step -1 Range("E8:E55") = Application.Round(Range("E8:E55"), 0) '工数を四捨五入 Next 'C列の中に含まれる「小計」を検索しそこから6列目が「0」だったら行の高さを「0」にする。 Dim Rng As Range Const Retu = "C" For Each Rng In Range(Retu & "1", Range(Retu & "100").End(xlUp)) If Trim(Rng.Value) = "小   計" And _ Rng.Offset(, 6) = 0 Then Rng.EntireRow.Hidden = True End If Next Rng End Sub

  • VBA 画面分割でアクティブセルの太枠が消える

    EXCEL VBA初心者です。 アクティブXコントロールを使って画面分割させようと考えています。 コントロールでウィンドウの分割をするとアクティブセルが太枠表示されないことがあります。されることもあります。 表示されない状態の時に他のウィンドウに一旦飛んでから戻って来ると表示されます。具体的サンプルは以下です。 基本アクティブXコントロールに埋め込んで動かしていますが、マクロでも基本的に同様です。 '画面分割のコントロール Private Sub ウィンドウ分割_Click() '初期画面の位置設定 With ActiveWindow .ScrollColumn = 1 .ScrollRow = 1 End With '本題はここから Worksheets("sheet1").Range("F3").Select '太枠確認用 With ActiveWindow .SplitColumn = 5 .SplitRow = 2 End With End Sub '分割解除のコントロール Private Sub 分割の解除_Click() ActiveWindow.Split = False End Sub 太枠表示されない原因をお分かりの方教えていただきたくお願いします。

  • エクセルマクロの分割方法について

    Sub リスト登録() ' ' Macro3 Macro ' マクロ記録日 : 2008/6/2 ' ActiveSheet.Unprotect Password:="1234" If Range("G33").Value > 5 Then Sheets("リスト").Select ActiveSheet.Shapes("AutoShape 44").Select Selection.Copy Sheets("シート").Select Range("A15").Select ActiveSheet.Paste End If Dim Btn As Integer Dim strMsg As String strMsg = "リストに登録しますか?" Btn = MsgBox(strMsg, vbYesNo + vbQuestion, "MsgBox") If Btn = vbNo Then Dim YU As Shape For Each YU In ActiveSheet.Shapes If YU.Type = msoAutoShape Then YU.Delete End If Next If Btn = vbYes Then End If ActiveSheet.Protect Password:="1234", DrawingObjects:=True, Contents:=True, Scenarios:=True Range("C11").Select End End If Dim newRange1 As Range, newRange2 As Range, newRange3 As Range Select Case Sheets("").Range("B3").Value Case 1 Set newRange1 = Sheets("リスト").Range("I6") Set newRange2 = Sheets("リスト").Range("AH6") Set newRange3 = Sheets("リスト").Range("AI6") 中略 Case 1000 Set newRange1 = Sheets("リスト").Range("I1005") Set newRange2 = Sheets("リスト").Range("AH1005") Set newRange3 = Sheets("リスト").Range("AI1005") ActiveWorkbook.Save Case Else End Select Application.ScreenUpdating = False Sheets("シート").Range("G8,G10,G12:G23,G25:G29,G31:G32").Copy newRange1.PasteSpecial Paste:=xlPasteValues, _ Operation:=xlNone, SkipBlanks:=False, Transpose:=True newRange1.UnMerge Sheets("シート").Range("D34").Copy newRange2.PasteSpecial Paste:=xlPasteValues, _ Operation:=xlNone, SkipBlanks:=False, Transpose:=False Sheets("シート").Range("I29").Copy newRange3.PasteSpecial Paste:=xlPasteValues, _ Operation:=xlNone, SkipBlanks:=False, Transpose:=False Sheets("シート").Select Range("C11").Select Range("D34,G8:G32,I29").Select Selection.ClearContents Range("C11").Select Dim SP As Shape For Each SP In ActiveSheet.Shapes If SP.Type = msoAutoShape Then SP.Delete Range("D34:K34").Select Application.CutCopyMode = False Selection.Merge Range("B3").Select End If Next ActiveSheet.Protect Password:="1234", DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub 上記のマクロを作成しましたが、64Kを超えてしまう為、分割したいのですが、どのように分割すればよいのか方法がわかりません、どなたかお分かりの方がいらっしゃいましたら宜しくお願いします。 マクロシート1~2~3といったつなぎの構文がわかりません宜しくお願い致します。

  • エクセル マクロで教えてください

    下記のマクロがうまく働きません SUB印刷01は単独ではいくのですが、繰返しをするとプレビューの行で止まります。SHEETオブジェクトがおかしいというのですが私には分かりません宜しくお願いします Sub 印刷01() With ActiveSheet.PageSetup .PrintQuality = 600 .CenterHorizontally = True .CenterVertically = False .Orientation = xlLandscape .Draft = False .PaperSize = xlPaperA4 .FirstPageNumber = xlAutomatic .Order = xlDownThenOver .BlackAndWhite = False .Zoom = 47 .PrintErrors = xlPrintErrorsDisplayed End With ActiveWindow.SelectedSheets.PrintPreview ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1, Collate:=True End Sub Sub 印刷繰返し() Dim WS As Object For Each WS In Sheets WS.Activate Call 印刷01 Next End Sub

  • エクセルのマクロをスッキリさせたい

    Sub 範囲指定()   A下 = Range("A65536").End(xlUp).Row   B下 = Range("B65536").End(xlUp).Row   If A下 > B下 Then    仮下 = A下   Else    仮下 = B下   End If   If 仮下 > 4 Then    下 = 仮下   Else    下 = 4   End If   Range(Cells(4, 3), Cells(下, 3)).Select   Range("C3").Copy.Paste End Sub もっと良い方法が有ると思うのですが、どうしたら良いでしょうか。

専門家に質問してみよう