VBでワード文書をHTMLに変換

タグの編集
投稿者 すさん  () 投稿日時 2007/9/2 03:52:00
こんにちは。先週から勉強させていただいており、大変分かりやすく、かつ包括的な内容でとても助かっています。 
実は、ご相談があって書き込みさせていただきました。 
私はPHPやASPを使ったウェブ開発が得意でウェブ開発者のお仕事を探しています。それで今回、ある会社の面接に行きました。その会社ではそこのウェブサイトを6カ国語に訳して同じ内容を載せたい、とのこと。そこで社長が「前にいた開発者がVisual Basicを使ってワード文書に書かれた翻訳内容を読み取り、それをHTMLに変換していた」そうで、それはその人もやっているところを見た、というのです。私はVBは初心者なのでわからないのですが、実際にそういうことは可能なのでしょうか。可能だとしたら、どのようにしたらできるのでしょうか。分かる方いたらお願いします。
投稿者 るきお  () 投稿日時 2007/9/2 05:41:00
すさんさん、こんにちは。 
 
>Visual Basicを使ってワード文書に書かれた翻訳内容を読み取り、それをHTMLに変換 
実際のところこれだけではどのような手法かわからないです。 
VBを使えばWordの制御はほぼ完全に可能なので、Wordの標準機能を使用してWordのドキュメントをhtml形式に変換することは可能です。 
それだけのことでしたら次のようにします。 
Dim WordApp As New Microsoft.Office.Interop.Word.Application 
        Dim Doc As Microsoft.Office.Interop.Word.Document 
        Dim FileName As String = "C:\Test\Test.docx" 
        Dim HTMLFileName As String = IO.Path.ChangeExtension(FileName, ".htm") 
 
        Doc = WordApp.Documents.Open(FileName) 
        Doc.SaveAs(htmlfilename, Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatHTML) 
        Doc.Close() 
        WordApp.Quit() 
 
VBのバージョンが書き込まれていなかったので、VB2005を前提にしています。 
このサンプルを動作させるためにはMicrosoft Word x.x Object Libraryへの参照設定が必要です。 
 
単純に変換するだけでなく、なんらかの処理を介在させて、カスタマイズした形でhtml化するには自分で文書の構造を解析して出力するプログラムを書く必要があります。 
次の投稿にそのもっとも単純なサンプルを掲載します。 
これも上記と同じ参照設定が必要です。 
 
これらの情報はそのまま実際の業務にすぐに使えるわけではありませんが、手がかりとしては十分なはずです。 
逆にこの手がかりを利用できるだけのスキルがなければその仕事はお断りした方がいいかもしれません。 
なお、サンプルにはCOMオブジェクトの解放部分は記述していませんので別途追加しておいてください。
投稿者 るきお  () 投稿日時 2007/9/2 05:41:00
'▼Wordのドキュメントから文章を取得 
        Dim WordApp As New Microsoft.Office.Interop.Word.Application 
        Dim Doc As Microsoft.Office.Interop.Word.Document 
        Dim FileName As String = "C:\Test\Test.docx" 
        Dim Contents As String 
 
        Doc = WordApp.Documents.Open(FileName) 
 
        Contents = Doc.Range.Text 
 
        Doc.Close() 
        WordApp.Quit() 
 
        '▼HTMLに保存 
        Dim HTMLFileName As String = IO.Path.ChangeExtension(FileName, ".htm") 
        Dim Writer As New IO.StreamWriter(HTMLFileName, False) 
 
        Writer.WriteLine("<HTML>" & vbNewLine) 
        Writer.WriteLine("<HEAD>" & vbNewLine) 
        Writer.WriteLine("<meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"">" & vbNewLine) 
        Writer.WriteLine("</HEAD>" & vbNewLine) 
        Writer.WriteLine("<BODY>" & vbNewLine) 
        Contents = Contents.Replace("<", "&lt;") 
        Contents = Contents.Replace(">", "&gt;") 
        Writer.WriteLine(Contents & vbNewLine) 
        Writer.WriteLine("</BODY></HTML>" & vbNewLine) 
 
        Writer.Close() 
 
        MsgBox(HTMLFileName & "を作成しました。")
投稿者 すさん  () 投稿日時 2007/9/2 07:32:00
こんにちは。 
早速お返事いただいて、コードまで書いていただき(__;すごい感謝しています。どちらも試してみたのですが、エラーになってしまい、いろいろウェブを検索してみたのですが、糸口がみつからず・・・戻ってきました。 
 
Microsoft.Office.Interop.Word._ApplicationとMicrosoft.Office.Interop.Word.Documentなのですが、「型""が定義されていません」と出ます。これは私のVB 2005の設定で何かが間違っているのでしょうか。 
いまのところほぼコピーしてファイル名を変えただけですが、2番目のコードはこのようになっています。 
 
Public Class Form1 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
        '▼Wordのドキュメントから文章を取得  
        Dim WordApp As New Microsoft.Office.Interop.Word._Application 
        Dim Doc As Microsoft.Office.Interop.Word.Document 
        Dim FileName As String = "C:\Documents and Settings\jennifer\Test.docx" 
        Dim Contents As String 
 
        Doc = WordApp.Documents.Open(FileName) 
 
        Contents = Doc.Range.Text 
 
        Doc.Close() 
        WordApp.Quit() 
 
        '▼HTMLに保存  
        Dim HTMLFileName As String = IO.Path.ChangeExtension(FileName, ".htm") 
        Dim Writer As New IO.StreamWriter(HTMLFileName, False) 
 
        Writer.WriteLine("<HTML>" & vbNewLine) 
        Writer.WriteLine("<HEAD>" & vbNewLine) 
        Writer.WriteLine("<meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"">" & vbNewLine) 
        Writer.WriteLine("</HEAD>" & vbNewLine) 
        Writer.WriteLine("<BODY>" & vbNewLine) 
        Contents = Contents.Replace("<", "&lt;") 
        Contents = Contents.Replace(">", "&gt;") 
        Writer.WriteLine(Contents & vbNewLine) 
        Writer.WriteLine("</BODY></HTML>" & vbNewLine) 
 
        Writer.Close() 
 
        MsgBox(HTMLFileName & "を作成しました。") 
    End Sub 
End Class 
 
一応、VBがメインのお仕事ではなく、会社側からはいい反応が来ているようなのですが・・・。*__
投稿者 るきお  () 投稿日時 2007/9/2 07:53:00
Microsoft.Office.Interop.Word._Applicationの方はエラーになりませんか? 
両方エラーなら、参照設定がされていないと思いますので、下記ページを参考にMicrosoft Word x.x Object Libraryに参照設定を追加してみてください。 
 
http://homepage1.nifty.com/rucio/main/kiso/Kiso13Reference.htm 
 
Documentの方だけがエラーだとしたら原因はわかりません。 
考えられるのは、私とWordのバージョンが違うということくらいですが、基本的な部分はバージョンが多少異なっていても同じと思うので少し考えにくいです。 
ただし、私はVBからWordを操作することはほとんどしないのでこのあたりの知識はありません。 
私のバージョンは2007です。 
正確な情報はMSDNライブラリをご覧ください。
投稿者 すさん  () 投稿日時 2007/9/2 08:38:00


ご返答ありがとうございました。 
無事に参照を追加しました。 
(エラーはApplicationも、Documentもどちらもです) 
 
ただ、私のワードのバージョンは1997なので、 
すこしMsdnで調べてみます。ありがとうございました。
投稿者 るきお  () 投稿日時 2007/9/2 21:48:00
参照設定してもエラーはなくなりませんか?
投稿者 すさん  () 投稿日時 2007/9/3 06:09:00
はい、やはりエラーは直らないようです。(__;
投稿者 るきお  () 投稿日時 2007/9/3 06:21:00
うーん…。そうですか。 
ひょっとして97は違う型になるのか…。 
何かご存知の方フォローお願いします。 
 
Object型で宣言しておいてCreateObjectを使う手もあります。実際にOffice97 + VB2005の環境があればすぐに試せるのですが、なかなかそういう環境はないですね。
投稿者 すさん  () 投稿日時 2007/10/14 03:28:00
どうもご回答ありがとうございました。 
なんと!その会社に採用されてしまいました。 
前の人が自分でつくったのかどうかはわかりませんが、コードも見ることが出来ました。(実はVisual BasicではなくAccessについてるVBAだということが判明) 
コード全部書くとすごいことになるのでちょっとだけご紹介します: 
Sub MakeProdDetailPage(p_cnt As Integer, f_name As String, bgclr As String) 
 
    Debug.Print f_name 
    Debug.Print ProductList(p_cnt).ProdDescript 
     
    If bgclr = "" Then bgclr = "550000" 
 
    bgclr = bgcolor 
 
    pdfh = FreeFile 
    OutputFile = OutDir & f_name 
    Open OutputFile For Output As #pdfh 
 
    DoProdDetTop pdfh 
     
    f3 = FreeFile 
    MidBlkFile = InDir & "cmlk_detail_blk.html" 
    Open MidBlkFile For Input As #f3 
   
  While Not EOF(f3) 
round_again: 
      Line Input #f3, temp 
       
      If InStr(temp, "DETAIL_IMAGE") > 0 Then 
          Print #pdfh, "<img border=""0"" src=""Prod_Img/" & ProductList(p_cnt).Large_img & """ alt = """ & ProductList(p_cnt).MetaTitle & """ > " 
           
          GoTo round_again: 
      End If 
      If InStr(temp, "DETAIL_NAME_CLR") > 0 Then 
          out_str = "<td width=""99%"" colspan=""2"" bgcolor=""#" & bgclr & """>" 
          Print #pdfh, out_str 
          Debug.Print out_str 
          GoTo round_again: 
      End If 
以下条件が続く・・・ 
 
End Sub 
 
一応、できてしまったプログラムなので私自身はそんなにわからなくても、という感じがしました。しかしVBAのコード内にHTMLコードが入っているためページ内の色の変更など、コードを変える必要性も出てきます。 
VBもせっかくはじめたのでもうちょっと勉強しようと思います。ありがとうございました。