色deチェックや上書き翻訳ツールのユーザーさんからツールで作成したWordの対訳表をExcelファイルに貼り付けて管理をしたいと連絡がありました。
普通にコピペをしてもうまく表にならないのです。たとえば、Wordの表のセル内で改行されている場合には、Excelにコピペをしたときにセル内の改行位置で自動的にセルが分割されてしまいます。
その結果、原文(1列目)と訳文(2列目)との対応関係がくずれてしまう場合があります。
(Wordの対訳表)
(Excelに普通にコピペ)
B列の1行目と2行目が結合されてしまいます。
(Excelに「縁浸け先の書式に合わせる」貼り付け)
B列の2行目が空欄になってしまいます。
<目次>
このマクロでできること
Wordの2列の表をExcelのシート1のA列とB列にコピペします。
文字列のみをコピペします。文字書式(上付き、下付き、文字色など)が解除されますので、ご注意ください。
マクロ実行前
マクロ実行後
列幅は調整しませんが、原文と訳文の対応関係が維持されています。
マクロの解説
Wordファイルの先頭に記載されている2列の表を処理対象にします(23行目)。
Wordファイルの先頭の表が2列ではない場合には実行しませんので、ご注意ください。
WordからExcelを起動する方法はいくつかあるのですが、今回の例ではExcelのインスタンスを複数開いてしまわないように、現在Excelが起動中なのかを判定する処理をつけてみました(29行目~39行目)。
Wordのセル内の文字列をコピペする際に2点処理をします。
1つ目は、Wordのセル内の末尾の改行記号を削除することです(55行目)。
表のセル内の最後の改行記号は、実は通常の改行記号と異なりまして、Chr(13) & Chr(7) の文字コードで表現します。2文字なのです。
なので、この2文字をまず削除します。
2つ目はExcelのセル内改行にあわせて変換します(56行目)。Excelの場合、セル内の改行は [Alt] + [Enter] で挿入しますね。このときに挿入されているのは、vbLf という編集記号です。
そこで、Wordで使われている改行コード vbCr をExcelの改行コード vbLf に変換します。
マクロ
Sub Wordの表をExcelにコピペする()
Dim myExcelApp As Object
Dim myWorkBook As Object
Dim myWorkSheet As Object
Dim myDoc As Document
Dim myTable As Table
Dim myText As String
Dim i As Long
Dim j As Long
'-------------------------------------------
'前処理
'-------------------------------------------
Set myDoc = ActiveDocument
If myDoc.Tables.Count > 0 Then
Set myTable = myDoc.Tables(1)
Else
Exit Sub
End If
If myTable.Columns.Count <> 2 Then Exit Sub
'-------------------------------------------
'Excelブックを開く
'-------------------------------------------
'Excelが起動中かどうかを判定
On Error Resume Next
Set myExcelApp = GetObject(, "Excel.Application")
'Excelが起動していない場合にExcelを起動する
If Err.Number <> 0 Then
Err.Clear
Set myExcelApp = CreateObject("Excel.Application")
DoEvents
myExcelApp.Visible = True
End If
On Error GoTo 0
'ブックを開く
Set myWorkBook = myExcelApp.workbooks.Add
'シートを指定
Set myWorkSheet = myWorkBook.sheets(1)
'-------------------------------------------
'コピペの開始
'-------------------------------------------
For i = 1 To myTable.Rows.Count
'文字列のコピペ
For j = 1 To 2
myText = myTable.Cell(i, j).Range.Text
myText = Left(myText, Len(myText) - 2)
myText = Replace(myText, vbCr, vbLf)
myWorkSheet.Cells(i, j).Value = myText
Next j
'途中休憩
If i Mod 20 = 0 Then
DoEvents
End If
Next i
'-------------------------------------------
'後処理
'-------------------------------------------
'オブジェクト変数の解放
Set myDoc = Nothing
Set myTable = Nothing
Set myWorkBook = Nothing
Set myWorkSheet = Nothing
Set myExcelApp = Nothing
MsgBox "終了しました。"
End Sub










