【Word VBA】Wordファイルを左右に並べるWordマクロ

2012年8月28日

追記
後日、このマクロをブラッシュアップしました。あわせてご覧ください。
【コード】選択したファイルだけを左右に並べるWordマクロ 

先日のWordマクロセミナー(プログラミング編) にてご質問をいただきまして、作ってみました。

あまり試運転していませんが、ひとまず動くと思います。どうぞご利用ください。

このマクロでできること

開かれているWordファイルを左右に並べます。

作業環境

作業環境

マクロの解説

現在開かれている文書の数に従って、横幅を計算して配置するマクロです。

処理していることはわかりやすいと思いますので、ご覧ください。

19行、20行の数値は、パソコン環境にあわせて適宜修正してみてください。

なお、Word 2010は、現在開かれている文書を正確に取得できないことがございます。

このマクロを作成してみて気づきました。怖いですねぇ。

Word 2010だと上記の理由にて、適切な場所に配置されない文書が存在することがあります。

バグについては、こちらの記事をご覧ください。

Word 2010 Documents collection corrupted if work with several documents

Word 2003/2007では動作確認いたしました。

マクロ


Sub ウィンドウを左右に並べるマクロ()
 
 Dim ttlHeight As Integer 'Word画面の横幅
 Dim ttlWidth As Integer  'Word画面の縦幅
 Dim indivWidth As Integer '個別のファイルの横幅
 Dim i As Integer
 Dim nDoc As Integer '開かれているファイルの数
 
 '開かれているファイルの数を取得
 nDoc = Documents.Count
 
 If nDoc < 1 Then Exit Sub
 
 'ファイルの1つを最大化(Word画面のサイズを計測するため)
 Documents(1).Activate
 ActiveWindow.WindowState = wdWindowStateMaximize
 
 'Word画面のサイズの取得
 ttlWidth = Application.Width - 10  '調整してください。
 ttlHeight = Application.Height - 16 '調整してください。
 
 '個別ファイルの横幅の設定(縦幅はWord画面のサイズを採用)
 indivWidth = ttlWidth / nDoc
 
 For i = 1 To nDoc
  Documents(i).Activate
  With ActiveWindow
  .WindowState = wdWindowStateNormal
  .Width = indivWidth
  .Height = ttlHeight
  .Top = 0
  .Left = indivWidth * (i - 1)
  End With
 Next i
 
End Sub

コメント

  • 6. Re:Re:Wordファイルを左右に並べるマクロ
    >kinuasaさん
    こちらもどうもありがとうございます。
    ウィンドウのタイトル名まで認識できると
    応用範囲が広がりますね。
    妄想も一緒に広がります(笑)。
    いつもどうもありがとうございます!
  • 5. Re:Re:Wordファイルを左右に並べるマクロ
    >kinuasaさん
    コメントを毎度どうもありがとうございます。
    このような方法があるのですね。
    これからの検証に使わせていただきます。
    ありがとうございます。
  • 4. Re:Wordファイルを左右に並べるマクロ
    別プロセスも意識するのであれば下記のような感じでしょうか?
    ウィンドウのタイトル名でWordか否かを判断する方法です。Public Sub Sample2()
    Dim n As Long
    Dim w As Long, h As Long, ww As Long
    Dim t As Word.Task
    Dim i As Longn = CountWordApp
    Application.ActiveWindow.WindowState = wdWindowStateMaximize
    w = Application.ActiveWindow.Width - 10
    h = Application.ActiveWindow.Height - 16
    ww = w / n
    i = 1
    For Each t In Application.Tasks
    If (t.Visible = True) And (InStr(LCase$(t.Name), "microsoft word")) Then
    t.WindowState = wdWindowStateNormal
    t.Width = ww
    t.Height = h
    t.Top = 0
    t.Left = ww * (i - 1)
    i = i + 1
    End If
    Next
    End Sub

    Private Function CountWordApp() As Long
    Dim t As Word.Task
    Dim ret As Long

    ret = 0 '初期化
    For Each t In Application.Tasks
    If (t.Visible = True) And (InStr(LCase$(t.Name), "microsoft word")) Then ret = ret + 1
    Next
    CountWordApp = ret
    End Function

    kinuasa返信する
  • 3. Re:Wordファイルを左右に並べるマクロ

    こんにちは。

    普通に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返信する
  • 2. Re:Office2010で動作しない点と、それ以外の問題点について

    >D*isukeさん

    お久しぶりです。コメントをどうもありがとうございました。

    私は、APIはプログラミングしたことがなく、読めませんが、ブログの解説が非常にわかりやすく、おおよそ想像できます。

    何より、完全にプログラムを理解していなくてもひとまずは使えますから、それがいいですね(笑)。

    細かな分析やその代替案のご提案など、本当にありがとうございます。

    大変参考になります。

  • 1. Office2010で動作しない点と、それ以外の問題点について

    ご無沙汰しております。

    Office2010で正しく動作しない件、気になったので、自分でも確認してみました。
    たしかにバグっぽいですね。

    ところで、上記のコードなのですが、
    ・マルチディスプレイ環境や、
    ・タスクバーの位置を変えている場合
    に加え、
    ・Office2010以外(2003,2007) であっても
    正常に動作しない場合があります。
    この辺りの話は長くなったので、
    詳しくはblogにまとめました。

    それと、Office2010で動かないというのも面白くないので、
    どのVer.でも動くように変えたマクロも作ってみました。
    (といっても、主要な部分で、Win32API を使うようになったので(実質C言語で書いたプログラムと大差なく)、
    もはやVBAのマクロというには微妙な感じなのですが・・・^^;)

    参考になれば幸いです。

    D*isuke

-コード
-, ,