
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
No.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
'//
以上ですが、これは、ワークシート上のボタンやコマンドボタン類に登録が一見できたように思えても、登録したマクロ名がなくなってしまいます。(マクロ自体は残っています)
そこで、右クリックメニューに入れることを考えました。興味がおありでしたら紹介します。
ただ、このマクロの方向性は、アドイン型に移行するのが良いようです。
No.4
- 回答日時:
こんばんは。
>動作条件の提示をうまく表現できず、申し訳ありません。
条件よりも手順に食い違いがあるかもしれませんが、こちらが、分かっていても、思ったようには、VBAで動かないというのも事実です。コードをみていただければ分かるはずですが、命令していても、Excel2010では動いていません。
>・画面を閉じること⇒これは、意味がわかりません。ごめんなさい(m_m)
画面を割ったものは、もとの画面に戻さないと、後が使いづらいと思いましたが、そういう認識はないようでしたら、もしも改良策ができたら、その場合は機能はなくします。
>・Windows枠の固定を3行目にすること⇒できていません。
どのようになっていますか?
ここは、ネックです。この解消はおそらく無理なのかもしれません。
エクセルの仕様か、バグが潜んでいるようなので、2画面を同じように、3行目の固定というのは、うまくいかないようです。片方が指定できません。片方もしくは、両方を「画面の分割」なら可能かもしれません。
こちらでは、ひとつの抜け道を探し出し、ひとまず成功とは思ったので、アップロードに至りましたが、うまくない場合は、そこは手動で行うしかないように思います。
>右ウィンドウのシートはvbaを実行したシートにしたいことです。右ウインドウはどんどん変えていきます。
>上下左右のシンクロ状態を作りたいわけです。
シートはご自身で替えるとは思いますが、画面を割った状態のまま、シートを替えれば、シンクロ状態は消えます。今の状態では、それを上下左右のシンクロ状態にするだけの機能しか付けられないかもしれません。
それと忘れていましたが、Excel 2013とそれ以下では、画面構成が違います。前者は、SDI(シングルドキュメント・インターフェイス)で、後者は、MDI(マルチプルドキュメント・インターフェイス)ですから、この辺りの仕様が変わるのではないかと思っています。Excel 2013で、再度検査して、こちらで使えるように考えてみます。
WindFallerさん、こんなに丁寧にお答えいただきまして、ありがとうございます。感謝です。
画面を閉じること⇒これは、意味がわかりません。ごめんなさい(m_m)
このことについて、意味が分かりました。ウィンドウを新しく作っているわけだから、見た目は2画面だけど、その裏側にどんどんウィンドウができていてそれを消さないと行けないわけですね。投稿してからそのことに気づきました。大変失礼しました。
もしも改良策ができたら、その場合は機能はなくします。⇒なくさないでください。
Windows枠の固定を3行目にすること⇒できていません。
どのようになっていますか?⇒一行目から普通にスクロールしています。
まだ検査してくださるという内容でホッとしています。WindFallerさんにとっても大変なことになってしまったかもしれませんが、よろしくお願いします。
No.3
- 回答日時:
こんにちは。
>私がやりたいのは右側ウィンドウ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
WindFallerさん、またも対応していただきありがとうございます。
で、失礼を顧みず、更にお願いできればと思います。
現在の情況として、
・画面を縦に割ること⇒できています。
・Windows枠の固定を3行目にすること⇒できていません。
・画面を閉じること⇒これは、意味がわかりません。ごめんなさい(m_m)
やりたいことは、縦に割ったとき左ウィンドウのシートは同じブック内の【暦data合体】というシートに固定して、右ウィンドウのシートはvbaを実行したシートにしたいことです。右ウインドウはどんどん変えていきます。でも、左ウインドウは【暦data合体】というシートのままです。
また、どんな状態でも左右のWindows枠の固定を3行目にすることです。2画面を解除するまでは、上記のような表示をして、上下左右のシンクロ状態を作りたいわけです。
動作条件の提示をうまく表現できず、申し訳ありません。よろしくお願いします。
No.2
- 回答日時:
一度、これで試してみてください。
'//
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
WindFallerさん、さっそくありがとうございます。
ただ、うまくいきません。確かに左右に表示されます。左側の新しいウインドウ2に暦data合体シートが出ます。ここまでは思い通りです。
ただ、私がやりたいのは右側ウィンドウ1に、別なアクティブシート上でWindFallerさんの作ってくれたvbaを実行して、2つのウインドウ(左右の2つの画面)で【比較&同時にスクロール】したいのです。しかも、どちらもウィンドウ枠の固定で3行目以下を(2行目までを固定)上下左右スクロール(連動して)したいです。最初の質問で、動作条件をうまく入れられなかった私の責任です。すみませんでした。さらに、vbaを入れ込んでくださるとありがたいです。よろしくお願いします。
No.1
- 回答日時:
前回の動作の影響を受けるようです。
当方 2010 ですので、2013 の動作確認ができません。
ActiveWindow.NewWindow
ActiveWorkbook.Windows.Arrange ArrangeStyle:=xlArrangeStyleVertical ' この行を追加
bonaronさん、またも回答していただいてうれしいです。ありがとうございます。苦しくも2010でトライしていただき、重ね重ねありがとうございます。
現状では横に新しいウィンドウが並びますが、アクティブシートが2つ分、表示されていて、暦data合体シートと合わせて3つのウィンドウが出ています。しかも、3つともバラバラの位置に表示され、デスクトップもあらわになっています。連動もしていません。
バージョンが違ってしまうとこんなにも違ってしまうんですね。せっかくお答えいただいたのですが、うまく動かないことになってしまいました。すみませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 複数のブックに同じ列を表示させる方法 2 2022/07/20 23:49
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Excel(エクセル) ②Excel 簡単にシートコピーしたら前日の残高と日付を変更させたい→マクロの記録でエラーが出ます 8 2022/07/16 20:40
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- Excel(エクセル) vbaで列幅について 1 2022/11/15 08:31
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】【相談】Excelブック...
-
エクセルのチェックボックス
-
エクセルのVBAで集計をしたい
-
エクセルを開いたとき常に同じ...
-
コマンドボタンがデザインモー...
-
シートを保護した時でも並べ替...
-
エクセルで串刺ししたシートの...
-
VBA シート名を先月の名前に...
-
マクロで複数シートに条件付き...
-
エクセルVBAでcmbBoxのプロパテ...
-
【 Excel】シートの見出しに自...
-
エクセルのマクロでMACアドレス...
-
エクセルシートの見出しの文字...
-
EXCELで存在しないシート...
-
EXCELで複数のシートを一度に「...
-
エクセルファイルを開く時、常...
-
PDFファイルをコピーしてエクセ...
-
excelの不要な行の削除ができな...
-
1ヶ月分の日付を一度に出す方法...
-
特定のセルに数値が入っている...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドボタンがデザインモー...
-
エクセルのVBAで集計をしたい
-
エクセルを開いたとき常に同じ...
-
マクロを複数シートに実行する...
-
【 Excel】シートの見出しに自...
-
Excelのマクロの呼び出し元を知...
-
EXCELでマクロを使わずに図形の...
-
マクロ 各シートの決められた位...
-
エクセルでシートの並び替えで...
-
EXCELのエラー
-
EXCELでワークシートを開いたら...
-
メッセージボックスでシート名...
-
マクロを特定の複数シートで実...
-
VBA シート名を先月の名前に...
-
マクロで複数シートに条件付き...
-
エクセルで、マクロボタンの表...
-
VBAで条件によってシート見出し...
-
【Excel】複数あるシート上の住...
-
エクセルVBAでcmbBoxのプロパテ...
-
エクセルのチェックボックス
おすすめ情報