【Word VBA】選択したファイルだけを左右に並べるWordマクロ

2012年9月4日

以前の記事で「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 Long

n = 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オブジェクトを利用)

コメント

  • 2. Re:Re:選択したファイルだけを左右に並べるマクロ

    >kinuasaさん

    コメントをどうもありがとうございます!

    あまりにも簡単に左右に並んだので拍子抜けでした。

    動きの癖はまだ理解できていませんが、Wordからいろいろできることがわかりますね。

    いつもヒントをありがとうございます!

  • 1. Re:選択したファイルだけを左右に並べるマクロ

    こんにちは。

    最小化されていないウィンドウを並べるのでしたら、実はShellオブジェクトに「TileVertically」というメソッドが用意されています。
    コードで書くと、

    CreateObject("Shell.Application").TileVertically

    上記一行だけでタイル表示が可能です。
    TileVerticallyメソッド以外にも全ウィンドウの最小化を行う「MinimizeAll」メソッドや"デスクトップの表示"を行う「ToggleDesktop」メソッド等が用意されていますので、知っておくと中々便利ですよ~(^^)

    kinuasa

-コード
-, ,