- ベストアンサー
エクセル画面を上下に2分割した場合のマクロについて
- エクセル画面を上下に2分割する方法として、下記のマクロを使用しています。
- 上部のシートはA1:S30までスクロール可能であり、下部のシートはA50:S80までスクロール可能です。
- しかし、操作中に上部のシートや下部のシートが意図しない位置までスクロールしてしまう問題が発生します。上部のシートと下部のシートが表示列を守るようにする方法はありますか?
- みんなの回答 (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
その他の回答 (1)
- Wendy02
- ベストアンサー率57% (3570/6232)
ご質問のマクロ自体は、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
お礼
ありがとうございます。 ご丁寧に例まで示していただき、大変感謝しております。 やはり、画面のスクロールがうまくいったり、いかなかったり、、、不安定でした。 シートにグラフを表示していることもあるかと思います。 グラフを選択した状態では、スクロールができてしまうときがあるので。 また、IIFをIFにしたら、できなくなりました。
お礼
より具体的にご教示いただきありがとうございます。 >非表示と保護を使って、その他のセルにはアクセス出来ないようにするという方法があるのではないでしょうか? このような方法があるとは知りませんでした。(恥ずかしながら) 早速、試して見たいと思います。 本当にありがとうございました。