重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

9月3日に次の質問を出して、bonaronさんからVBAをいただいて解決済みと思っていたら、エクセル2007で動作していたものが2013では動きません。特に2画面が左右ではなく、上下に表示されてしまいます。どなたか分かる方、どの部分にどのような記述を入れたら良いか、教えてください。

9月3日に質問した内容
同じブック内の2つのシートで【比較&同時にスクロール】がうまくできません
エクセル2007を使用して、同じブック内の【暦data合体】というシートと現在見ているシートを整列(左右に並べて表示)して、並べて【比較&同時にスクロール】したいと思っています。
 下のとおり動かすと、最初の画面では予定通り、2画面が正しく表示されています。しかし、そこからスクロールすると、なぜか左側のブック1と右側のブック2が2行分ずれて表示されてしまいます。
 最初の画面が出てから、スクロールする前に表示タブの【同時にスクロール】のチェックを外し、またチェックを入れ直すと、思い通りの動きになりますが、そのようなことをしなくても【比較&同時にスクロール】したいです。どなたか、分かる方、よろしくお願いします。

9月3日の内容に対して、bonaronさんが回答してくださったベストアンサー(ただし、2013には画面が左右ではなく上下になってしまう)

Sub ウインドウの分割による編集()
  Dim strBookName As String
  Dim sh As Worksheet
  
  strBookName = ThisWorkbook.Name
  ActiveWindow.NewWindow
  
  Windows(strBookName & ":1").Activate
  Range("A3").Select
  ActiveWindow.FreezePanes = True
  ActiveWindow.Zoom = 100
  Sheets("暦data合体").Select
  Range("A3").Select
  ActiveWindow.FreezePanes = True
  ActiveWindow.Zoom = 100
  
  Windows.CompareSideBySideWith strBookName & ":2"
  Windows(strBookName & ":2").Activate
  Set sh = ActiveSheet
  Range("A3").Select
  ActiveWindow.FreezePanes = True
  ActiveWindow.Zoom = 100
  Sheets("暦data合体").Select
  Range("A3").Select
  ActiveWindow.FreezePanes = True
  ActiveWindow.Zoom = 100
  sh.Select
End Sub

A 回答 (5件)

こんばんは。



一応、直しました。

>私がやりたいのは右側ウィンドウ1に、
>別なアクティブシート上
>2つのウインドウ(左右の2つの画面)で【比較&同時にスクロール】したいのです。

この部分をメインにして、右がずっと変わっていくものだとします。
この手のマクロは、深く研究したことがないし、誰も手を付けていない分野なので、通常ありきたりのコードしかないはずです。まして、バグっぽい動きがあります。

'------------------------------------------------
'仕様書
'Excel 2013(SDI用)
'・最初のマクロで、同じブック内の同じシートを、画面(Window)を縦にし二分し、左右半半になり、左側の画面の2行目と3行目の間が固定されます。
' しかし、同じシートの場合は、右側の画面の行の固定はなりません。これは、できないようです。また、同じシートの場合は、しないほうがよいでしょう。マクロでは誤動作が発生します。

'・右側のシートを別のシートに、再び同じマクロで実行すると、シンクロと右側の画面の行の固定が可能になります。

・他のブックを開いているとに画面にならないことがありますので、必ず単独のブックで行ってください。他のブックを開いてシンクロさせることは、まだ深く検証されていません。まったく別のプログラムになるらしいです。

'なお、汎用性を求めるために、Sheets("暦data合体").Selectは、加えていません。
必要に応じて、文頭のシングルクォートを外してください。

それから、もしかしてなのですが、このマクロはワークシートのデータを修正するためのものでしょうか。修正だけのためでしたら、ほぼEXCELが中心になる、大変に強力な専用ツール・WinMerge があります。(日経PC21にも紹介されました)

http://www.geocities.co.jp/SiliconValley-SanJose …

'-----------------------------------------------
'Option Explicit
Private shName As String
Sub LRWinsSyncro()
 Dim arSh(1) As Variant
 Dim wnNames(1) As Variant
 Static ignoflg As Boolean
 Dim i As Long
 Dim ret As VbMsgBoxResult
 Const SPLINE As Integer = 3 '画面割の行位置
 If ActiveWorkbook.Name <> ThisWorkbook.Name Then
  MsgBox "現在のバージョンはアドイン型ではないので、" & vbCrLf & _
   "別のブックでは使えません。", vbExclamation
  Exit Sub
 ElseIf Workbooks.Count > 1 Then
  If ignoflg = False Then
   For i = 1 To Workbooks.Count
    If Workbooks(i).Name Like "xls?" Or Workbooks(i).Name Like "Book*#" Then
     ret = MsgBox("他のブックを開いていると誤動作します。無視して続行しますか?", vbYesNo) '一度だけ聞いてくる
     If ret = vbNo Then
      MsgBox "他のブックを終了してください。", vbInformation
     ElseIf ret = vbYes Then
      ignoflg = True
      Exit Sub
     End If
    End If
   Next
  End If
 End If
 With ActiveWorkbook.Windows
  If .Count = 1 Then
   'Worksheets("暦date合体").Select
   shName = ActiveSheet.Name '暦date合体
   .Item(1).NewWindow
   .Arrange , True, True, True
  End If

  If .Count = 2 Then
   If .Item(1).ActiveSheet.Name = shName Then
    wnNames(0) = .Item(1).Caption
    wnNames(1) = .Item(2).Caption
    arSh(0) = .Item(wnNames(0)).ActiveSheet.Name
    arSh(1) = .Item(wnNames(1)).ActiveSheet.Name
   Else
    wnNames(1) = .Item(1).Caption
    wnNames(0) = .Item(2).Caption
    arSh(0) = .Item(wnNames(1)).ActiveSheet.Name
    arSh(1) = .Item(wnNames(0)).ActiveSheet.Name
    If shName = "" Then shName = arSh(1)
   End If
  End If
 End With
 If arSh(0) = arSh(1) Then
  With Windows(wnNames(0))
   .Activate
   .FreezePanes = False
   .ActiveSheet.Range("A1").Select
   .ActiveSheet.Rows(SPLINE).Select
   .FreezePanes = True
   .ActiveSheet.Range("A1").Select
  End With
  Windows.Arrange , True, True, True
  Windows.CompareSideBySideWith wnNames(0)
 Else
  With Windows(wnNames(1))
   .Activate
   .FreezePanes = False
   .ActiveSheet.Range("A1").Select
   .ActiveSheet.Rows(SPLINE).Select
   .FreezePanes = True
  End With
  With Windows
   .Item(wnNames(0)).Activate
   .CompareSideBySideWith wnNames(1)
   Windows.Arrange ArrangeStyle:=xlVertical
  End With
 End If
End Sub

Sub ReleasedWindows()
'Window(窓) を一つにするマクロ(別のマクロとして残した)
Dim Ac As Worksheet
Dim sh As Worksheet
With ActiveWorkbook.Windows
 If .Count = 2 Then '画面を戻す
  .Item(2).Close
  .Item(1).WindowState =xlNormal
  ActiveWindow.FreezePanes = False
 End If
End With
Set Ac = ActiveSheet
For Each sh In Worksheets
ActiveWindow.FreezePanes = False '画面固定も外す
Next
Ac.Activate
End Sub

'//
以上ですが、これは、ワークシート上のボタンやコマンドボタン類に登録が一見できたように思えても、登録したマクロ名がなくなってしまいます。(マクロ自体は残っています)
そこで、右クリックメニューに入れることを考えました。興味がおありでしたら紹介します。
ただ、このマクロの方向性は、アドイン型に移行するのが良いようです。
    • good
    • 0
この回答へのお礼

今まで、たくさんおつきあいくださり、ありがとうございました。感謝です。今後も分からないことにサポートしていただけたら幸いです。

お礼日時:2018/09/21 14:27

こんばんは。



>動作条件の提示をうまく表現できず、申し訳ありません。
条件よりも手順に食い違いがあるかもしれませんが、こちらが、分かっていても、思ったようには、VBAで動かないというのも事実です。コードをみていただければ分かるはずですが、命令していても、Excel2010では動いていません。

>・画面を閉じること⇒これは、意味がわかりません。ごめんなさい(m_m)
画面を割ったものは、もとの画面に戻さないと、後が使いづらいと思いましたが、そういう認識はないようでしたら、もしも改良策ができたら、その場合は機能はなくします。

>・Windows枠の固定を3行目にすること⇒できていません。
どのようになっていますか?
ここは、ネックです。この解消はおそらく無理なのかもしれません。

エクセルの仕様か、バグが潜んでいるようなので、2画面を同じように、3行目の固定というのは、うまくいかないようです。片方が指定できません。片方もしくは、両方を「画面の分割」なら可能かもしれません。

こちらでは、ひとつの抜け道を探し出し、ひとまず成功とは思ったので、アップロードに至りましたが、うまくない場合は、そこは手動で行うしかないように思います。

>右ウィンドウのシートはvbaを実行したシートにしたいことです。右ウインドウはどんどん変えていきます。

>上下左右のシンクロ状態を作りたいわけです。
シートはご自身で替えるとは思いますが、画面を割った状態のまま、シートを替えれば、シンクロ状態は消えます。今の状態では、それを上下左右のシンクロ状態にするだけの機能しか付けられないかもしれません。

それと忘れていましたが、Excel 2013とそれ以下では、画面構成が違います。前者は、SDI(シングルドキュメント・インターフェイス)で、後者は、MDI(マルチプルドキュメント・インターフェイス)ですから、この辺りの仕様が変わるのではないかと思っています。Excel 2013で、再度検査して、こちらで使えるように考えてみます。
    • good
    • 0
この回答へのお礼

WindFallerさん、こんなに丁寧にお答えいただきまして、ありがとうございます。感謝です。

画面を閉じること⇒これは、意味がわかりません。ごめんなさい(m_m)

このことについて、意味が分かりました。ウィンドウを新しく作っているわけだから、見た目は2画面だけど、その裏側にどんどんウィンドウができていてそれを消さないと行けないわけですね。投稿してからそのことに気づきました。大変失礼しました。

もしも改良策ができたら、その場合は機能はなくします。⇒なくさないでください。

Windows枠の固定を3行目にすること⇒できていません。
どのようになっていますか?⇒一行目から普通にスクロールしています。

まだ検査してくださるという内容でホッとしています。WindFallerさんにとっても大変なことになってしまったかもしれませんが、よろしくお願いします。

お礼日時:2018/09/17 21:22

こんにちは。



>私がやりたいのは右側ウィンドウ1に、
>別なアクティブシート上
>2つのウインドウ(左右の2つの画面)で【比較&同時にスクロール】したいのです。

最終的には、同じ画面を2つに割って使うわけではないのですね。
No.2のマクロとは内容が変わり、もとの質問のコードの仕様に似ています。

注意点は、
ひとつのボタン(フォームコントロール)やQATボタンひとつで、全て行ってしまいます。
 ・画面を縦に割ること
 ・Windows枠の固定を3行目にすること
 ・画面を閉じること

最初は、画面を2つに割った後、シートを替えることを要求してきます。
(別なアクティブシート)は、右・左どちらの画面でも構いません。

右か左かで、シートを選択してから、再度同じマクロを実行してください。
動作試験は、Excel 2010と、Excel 2013 の両方で行っています。

しかし、ひじょうに微妙な部分があるようにも思われます。うまくいかない場合は、
No.2 のマクロに、再度シンクロさせるコードを取り付ける方法も考えています。


'//標準モジュール
Sub SideBySideWindows2()
Dim arSh(1) As Variant
Dim wnName As String
Dim wn As Window
With ThisWorkbook.Windows 'もし別なブックから行う時は、ActiveWorkbook
 If .Count = 1 Then
  .Item(1).NewWindow
  .Arrange , True, True, True
 End If
 If .Count = 2 Then
  arSh(0) = .Item(1).ActiveSheet.Name
  arSh(1) = .Item(2).ActiveSheet.Name
  If arSh(0) = arSh(1) Then
  MsgBox "片方のシートを別のシートにするにはもう一度このマクロを実行してください。", vbInformation
  Exit Sub
  ElseIf .Item(1).FreezePanes And .Item(2).FreezePanes Then
  '二つ画面割を戻す(トグル)
  With ActiveWorkbook.Windows
   .Item(2).Close
   .Item(1).WindowState = xlMaximized
   ActiveWindow.FreezePanes = False
  End With
  Exit Sub
  End If
 End If
 wnName = .Item(2).Caption
 .Item(2).Close
 With .Item(1)
  .Activate
  .FreezePanes = False
  Application.Goto Worksheets(arSh(0)).Range("A1")
  Worksheets(arSh(0)).Rows(3).Select
  .FreezePanes = True
  .NewWindow
  Worksheets(arSh(1)).Select
 End With
 .CompareSideBySideWith wnName
 Windows.Arrange ArrangeStyle:=xlVertical
 If .Item(1).FreezePanes = False Then
  Set wn = .Item(1)
 ElseIf .Item(2).FreezePanes = False Then
  Set wn = .Item(2)
 Else
  Exit Sub
 End If
 With wn
  .Activate
  .FreezePanes = False
  .ActiveSheet.Select
  Application.Goto Range("A1"), True
  ''Debug.Print .ActiveSheet.Name '検査用
  .ActiveSheet.Rows(3).Select
  .FreezePanes = True
  .ActiveSheet.Range("A1").Select
 End With
End With
End Sub
    • good
    • 0
この回答へのお礼

WindFallerさん、またも対応していただきありがとうございます。
で、失礼を顧みず、更にお願いできればと思います。
現在の情況として、
・画面を縦に割ること⇒できています。
・Windows枠の固定を3行目にすること⇒できていません。
・画面を閉じること⇒これは、意味がわかりません。ごめんなさい(m_m)

やりたいことは、縦に割ったとき左ウィンドウのシートは同じブック内の【暦data合体】というシートに固定して、右ウィンドウのシートはvbaを実行したシートにしたいことです。右ウインドウはどんどん変えていきます。でも、左ウインドウは【暦data合体】というシートのままです。

また、どんな状態でも左右のWindows枠の固定を3行目にすることです。2画面を解除するまでは、上記のような表示をして、上下左右のシンクロ状態を作りたいわけです。

動作条件の提示をうまく表現できず、申し訳ありません。よろしくお願いします。

お礼日時:2018/09/17 09:51

一度、これで試してみてください。



'//
Sub SheetDevideSync()
Dim i As Long
Worksheets("暦data合体").Select
Range("A1").Select
With ActiveWorkbook.Windows
 If .Count = 1 Then
  .Item(1).NewWindow
  .Arrange , True, True, True
  For i = 1 To 2
  .Item(i).Activate
  .Item(i).ActiveSheet.Rows(3 + i).Select '同じ位置で割ろうとすると、後のWindowは、かけ離れた場所に行く
  ActiveWindow.FreezePanes = True
  .Item(i).ActiveSheet.Range("A1").Select
  .Item(i).Zoom = 100
  Next
 ElseIf .Count = 2 Then '画面を戻す
  .Item(2).Close
  .Item(1).WindowState = xlMaximized
  ActiveWindow.FreezePanes = False
 Else
  For i = .Count To 3 Step -1
  .Item(i).Close
  Next
 End If
End With
End Sub
    • good
    • 0
この回答へのお礼

WindFallerさん、さっそくありがとうございます。
ただ、うまくいきません。確かに左右に表示されます。左側の新しいウインドウ2に暦data合体シートが出ます。ここまでは思い通りです。

ただ、私がやりたいのは右側ウィンドウ1に、別なアクティブシート上でWindFallerさんの作ってくれたvbaを実行して、2つのウインドウ(左右の2つの画面)で【比較&同時にスクロール】したいのです。しかも、どちらもウィンドウ枠の固定で3行目以下を(2行目までを固定)上下左右スクロール(連動して)したいです。最初の質問で、動作条件をうまく入れられなかった私の責任です。すみませんでした。さらに、vbaを入れ込んでくださるとありがたいです。よろしくお願いします。

お礼日時:2018/09/15 09:47

前回の動作の影響を受けるようです。


当方 2010 ですので、2013 の動作確認ができません。

ActiveWindow.NewWindow
ActiveWorkbook.Windows.Arrange ArrangeStyle:=xlArrangeStyleVertical ' この行を追加
    • good
    • 0
この回答へのお礼

bonaronさん、またも回答していただいてうれしいです。ありがとうございます。苦しくも2010でトライしていただき、重ね重ねありがとうございます。

現状では横に新しいウィンドウが並びますが、アクティブシートが2つ分、表示されていて、暦data合体シートと合わせて3つのウィンドウが出ています。しかも、3つともバラバラの位置に表示され、デスクトップもあらわになっています。連動もしていません。

バージョンが違ってしまうとこんなにも違ってしまうんですね。せっかくお答えいただいたのですが、うまく動かないことになってしまいました。すみませんでした。

お礼日時:2018/09/15 09:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!