ワードマクロについて
MS WORD 2003ファイル中の「図の書式
設定」の「高さ」および「幅」を、インプットボックス
で入力した数値(%)で拡大・縮小するために、
下記マクロを作成しました。
下記マクロは、ケミドローで作成した化学式を
WORD文書にコピー・ペーストした図に対して
は正常に機能します。
しかし、特許・実用新案公報DB
(http://www.ipdl.inpit.go.jp/Tokujitu/tjsogodb.ipdl?N0000=101)
で検索した特許文献を、WORD文書にコピー・ペースト
した場合、その図に対してマクロを実行すると、「高さ」
および「幅」が入力値とは異なるというバグがあります。
例えば、上記サイトで検索した「特開2010-1」を
WORDファイルにコピー・ペーストした後、【図1】
に対して、このマクロで「30」(%)を入力すると、
「高さ」および「幅」に、それぞれ「10%」および
「22%」が入力されます。
このバグの原因および解決策をご教示下さい
ますようお願いします。
Sub Size_Each_Image()
' 選択イメージのサイズ変更。
'
' 現在のIMEの状態を格納する場所を宣言
Dim sinIME As Single
' インプットボックスで入力された%の格納場所を宣言
Dim varX As Variant
'
' 選択箇所が行内図でない場合、終了。
If Selection.Type <> wdSelectionInlineShape Then End
'
' 現在のIMEの状態を格納し、日本語入力をOFFにする
With ActiveWindow
sinIME = .IMEMode
.IMEMode = wdIMEModeOff
End With
'
' インプットボックスでサイズ入力。
varX = InputBox("選択イメージのサイズ(%)は?", "選択イメージのサイズ")
' キャンセルされた場合、日本語入力を元に戻して終了。
If varX = "" Then
ActiveWindow.IMEMode = sinIME
End
End If
'
' サイズ入力
With Selection.InlineShapes(1)
.ScaleHeight = varX
.ScaleWidth = varX
End With
'
' IMEを元に戻す
ActiveWindow.IMEMode = sinIME
'
End Sub
>WORD 2003ではコピー・ペーストできますが、WORD 2007ではコピー・ペーストできなかったという経験があります。
私の場合は、一旦、メモリ枠を手動で確保しないと、継続的にCtrl + C のClick コピーでは取れません。私の場合は、二重にセキュリティが掛かっていたはずですから、いきなりには出来ません。
また、おっしゃる現象は、クリップボードにいれたものを、BitMap 変換して貼り付けたものは、物理的なサイズは存在し、何らかの方法で取り出すことは可能かもしれませんが、VBAから取れませんので、いろいろ調べてみましたが、ScaleHeight やScaleWidth からでは、Original Size から割合は設定出来ません。以上が、私が調べた結果です。
図は、ダウンローダで一括ダウンロード出来ますが、問題点は、ファイル名は一律ですから、どれがどれだか分からなくなることです。そこで新たに元の図に対する考え方の違う、Shape に対する処理をするマクロを作りました。
以下のマクロの使い方:
・IEの図を右クリックでコピーして、クリップボードに入れます。
・ワード上で右クリックして、「図の割付」というメニューがありますから、クリックすると、「形式を選択して貼付け」ダイアログが出てきます。
・貼り付ける形式--[ビットマップ(DIB)]を選択して、[OK]をクリックします。(重要)
・貼り付けると、パーセントの問い合わせが出てきてきます。
・後は、1以上の数字を入れてください。
(貼り付けるとクリップボードは空になっているはずです。)
・既に貼り付けてある図に対しては、図を選択してから、右クリックして、「図の割付」をクリックすれば、そのまま実行出来ます。
(なお、図がクリップボードに入っていずに、テキストが入っている場合は、マクロは起動せずに、単に、文字が貼り付けされるだけです)
'//'標準モジュールのみ(出来れば、Normal.dot が良い。ただし、Word 2003 まで)
Public Declare Function IsClipboardFormatAvailable Lib "user32.dll" (ByVal wFormat As Long) As Long
Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function EmptyClipboard Lib "user32" () As Long
Public Declare Function CloseClipboard Lib "user32" () As Long
Public Const CF_TEXT As Long = 1
Public Const CF_BITMAP As Long = 2
Sub AutoOpen()
On Error Resume Next
With Application.CommandBars("TEXT")
.Controls("図の割付").Delete
End With
With Application.CommandBars("Inline Picture")
.Controls("図の割付").Delete
End With
On Error GoTo 0
With Application.CommandBars("TEXT").Controls.Add _
(Type:=msoControlButton, Temporary:=True)
.BeginGroup = False
.Caption = "図の割付"
.OnAction = "PastePicture"
End With
With Application.CommandBars("Inline Picture").Controls.Add _
(Type:=msoControlButton, Temporary:=True)
.BeginGroup = False
.Caption = "図の割付"
.OnAction = "PastePicture"
End With
On Error GoTo 0
End Sub
'//次へ(同じモジュール)
'//5の続き
Private Sub PastePicture()
Dim x As Single
Dim intIME As Integer
Dim i As Long
On Error Resume Next
If IsClipboardFormatAvailable(CF_BITMAP) > 0 Then
Application.Dialogs(wdDialogEditPasteSpecial).Show
ElseIf IsClipboardFormatAvailable(CF_TEXT) > 0 Then
If Selection.Type <> wdSelectionInlineShape Then
Selection.PasteAndFormat wdPasteDefault
Exit Sub
End If
End If
i = ActiveDocument.Shapes.Count
ActiveDocument.Shapes(i).Select
With ActiveWindow
intIME = .IMEMode
.IMEMode = wdIMEModeOff
End With
x = InputBox("選択イメージのサイズ(%)は?", "選択イメージのサイズ")
If Val(x) <= 0 Then
Exit Sub
ElseIf Val(x) < 1 Then
MsgBox "1 以上の数字を入力してください。", vbExclamation
Exit Sub
End If
With Selection
If .Type = wdSelectionShape Then
.ShapeRange.ScaleHeight x / 100, msoTrue
.ShapeRange.ScaleWidth x / 100, msoTrue
.ShapeRange.ConvertToInlineShape
.Range.Collapse Direction:=wdCollapseEnd
.Range.InsertAfter Text:=vbCrLf
Call ClipboardClear
ElseIf .Type = wdSelectionInlineShape Then
If .InlineShapes.Count > 0 Then
.InlineShapes(1).ScaleHeight = x
.InlineShapes(1).ScaleWidth = x
Call ClipboardClear
Else
MsgBox "設定に失敗しました。", vbExclamation
End If
End If
End With
With ActiveWindow
.IMEMode = intIME
End With
On Error GoTo 0
End Sub
Sub Auto_Close()
On Error Resume Next
With Application.CommandBars("TEXT")
.Controls("図の割付").Delete
End With
With Application.CommandBars("Inline Picture")
.Controls("図の割付").Delete
End With
On Error GoTo 0
End Sub
Private Function ClipboardClear() As Boolean
'クリップボードクリア
Dim ret As Long
ClipboardClear = False
If OpenClipboard(0) = 0 Then Exit Function
If EmptyClipboard() = 0 Then
ret = CloseClipboard()
Exit Function
End If
If CloseClipboard() = 0 Then Exit Function
ClipboardClear = True
End Function
'Word 2007 は、私の環境では、設定が出来ません。
お礼
Wendy02さん、詳しく情報を調べて下さり、本当にありがとうございます。 それに加えて、別の考え方のマクロを作成して下さり、感謝しています。 作成下さったマクロは、Functionプロシージャなど、プロの プログラマーが使用される知識がちりばめられており、感動しています。 ワードマクロは事例が少ないため、大変参考になります。 なお、作成下さったマクロは、素人の私には高度すぎて現時点 で理解できませんが、コツコツ勉強して、今後の参考にさせて頂きます。 どうもありがとうございました。