• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセル画面を上下に2分割した場合のマクロについて)

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

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

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

  • ベストアンサー
  • 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