以前の記事で「Wordファイルを左右に並べるマクロ」をご紹介したところ、 D*isuke さんがWord 2010のバグを修正したマクロをご紹介してくださいました。
バグかも?とかいいながら、かなりゆるゆるのマクロだったのに、かっちりしたものに修正していただきました。
また、その後、kinuasa さんもコメントにて別の方法でマクロをご紹介してくださいました。
こんにちは。
普通にWindowオブジェクトを使えば良いような気がするのですが、Documentsに拘るのは何か理由があるのでしょうか(?_?)
Option Explicit
Public Sub Sample()
Dim n As Long
Dim w As Long, h As Long, ww As Long
Dim i As Longn = Application.Windows.Count
If n <= 1 Then Exit Sub
Application.ActiveWindow.WindowState = wdWindowStateMaximize
w = Application.ActiveWindow.Width - 10
h = Application.ActiveWindow.Height - 16
ww = w / n
For i = 1 To n
With Application.Windows(i)
.WindowState = wdWindowStateNormal
.Width = ww
.Height = h
.Top = 0
.Left = ww * (i - 1)
End With
Next
End Subちなみに上記コードは全く検証していません。
ただ書き直しただけです(^^;
どうもありがとうございます。
さて、もともと私は、ゆるゆるマクロのまま、選択したファイルだけを左右に並べるマクロを紹介しようと思っていたのですが、kinuasa さんのマクロをみて改良することにしました。
もともとは、選択したWordファイルだけを横に並べようと思っていたところを、VBEも選択できることに気がついたからです。
というわけで、こんなマクロをつくってみました。
無駄なコードもあるかもしれませんが、ある程度試運転をしていてとりあえず動いているようなので、このまま紹介します。
<目次>
このマクロでできること。
WordファイルおよびVBEのうちで最小化されていないものを左右に並べます。
つまり、Wordファイルを多数開いていたとしても、最小化してしまえばそれは左右に並べられないということです。
VBEを横に並べることができますので、デバッグやマクロの動きを確認する場合に便利ですね。これが欲しかった!
マクロの解説
kinuasaさんから教えていただいたTasks コレクション オブジェクトを使いました。
どうやら、Tasks コレクション オブジェクトで数えた場合にも、文書が重複して数えられてしまうらしいことがわかり(今回もあまりしっかり検証しておりません)、重複しないように最近覚えたDictionaryオブジェクト(インストラクターのネタ帳の記事 )を無理矢理つかってしまいました。
こんな使い方で良いのかわかりませんが、やりたいことは達成できたのでひとまずいいとしておきます。
なお、VBEも他のWordファイルのウィンドウと同様にTasksオブジェクトで管理をしたかったのですが、同列には扱えなかったため、Dictionaryオブジェクトにはメンバーとしていれずに独立して管理しています。
マクロ
Sub 選択したファイルだけを左右に並べるマクロ()
Dim n As Long
Dim w As Long, h As Long, ww As Long
Dim t As Word.Task
Dim i As Long
Dim dic1 As Object '最小化されたファイル用
Dim dic2 As Object '最小化されていないファイル用
Dim key As Variant
Const myVBE As String = "microsoft visual basic"
Set dic1 = CreateObject("Scripting.Dictionary")
Set dic2 = CreateObject("Scripting.Dictionary")
For Each t In Application.Tasks
If (t.Visible = True) And (InStr(LCase$(t.Name), "microsoft word")) Then
If t.WindowState = wdWindowStateMinimize Then
'最小化されたファイル
On Error Resume Next
dic1.Add t.Name, ""
On Error GoTo 0
Else
'左右に並べるファイル
On Error Resume Next
dic2.Add t.Name, ""
On Error GoTo 0
End If
End If
Next
'左右に並べるファイルの数
n = dic2.Count
'VBEが表示されているか、また最小化されていないか確認
If Application.Tasks(myVBE).Visible = True And _
Application.Tasks(myVBE).WindowState <> wdWindowStateMinimize Then
n = n + 1
End If
'ウィンドウのサイズの取得
With ActiveWindow
.WindowState = wdWindowStateMaximize
w = .Width - 10
h = .Height - 12
ww = w / n
i = 1
.WindowState = wdWindowStateMinimize
End With
'最小化されたファイル
For Each key In dic1.keys
With Application.Tasks(key)
.WindowState = wdWindowStateNormal
.WindowState = wdWindowStateMinimize
End With
Next key
'左右に並べるファイル
For Each key In dic2.keys
With Application.Tasks(key)
.WindowState = wdWindowStateNormal
.Width = ww
.Height = h
.Top = 0
.Left = ww * (i - 1)
End With
i = i + 1
Next key
'VBEを並べる
With Application.Tasks(myVBE)
If .Visible = True And .WindowState <> wdWindowStateMinimize Then
.WindowState = wdWindowStateNormal
.Width = ww
.Height = h
.Top = 0
.Left = ww * (n - 1)
End If
End With
Set dic1 = Nothing
Set dic2 = Nothing
End Sub
関連記事
VBAでWordのウィンドウを水平方向に並べようとしたらWin32APIを連呼していた(紹介)
文書に含まれる単語を調べるマクロ(Collectionオブジェクト)
文書に含まれる単語を調べるマクロ (インストラクターのネタ帳の記事→Dictionaryオブジェクトを利用)
-
1. Re:選択したファイルだけを左右に並べるマクロ
こんにちは。
最小化されていないウィンドウを並べるのでしたら、実はShellオブジェクトに「TileVertically」というメソッドが用意されています。
コードで書くと、CreateObject("Shell.Application").TileVertically
上記一行だけでタイル表示が可能です。
TileVerticallyメソッド以外にも全ウィンドウの最小化を行う「MinimizeAll」メソッドや"デスクトップの表示"を行う「ToggleDesktop」メソッド等が用意されていますので、知っておくと中々便利ですよ~(^^)






コメント