• ベストアンサー

VBAからxml・スタイルシートを作成すると、一度保存しないと正常に動作しない

お世話になります。 現在エクセルのVBAで(1)のようなソースで(2)を書き出しています。 (2)の「<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 」もVBAで「indate=<?xml version="1.0" encoding="UTF-8"?xsl:stylesheet version="1.0" lns:xsl="http://www.w3.org/1999/XSL/Transform">」とそのまま打ち込んでいます。 スタイルシートを使用して返還しようとすると、「パラメータが違う」旨メッセージがでてきて、(2)を一度開き、何も変更しないで保存すると正常にスタイルシートの変換処理が行われます。 (2)のVBAで書き出したxmlがUTF-8で保存されていないように感じるのですが、どのように変更すればUTF-8で書き出せるのでしょうか? 以上お手数ですが、よろしくお願いします。 (1) Const ForReading = 1, ForWriting = 2, ForAppending = 3 Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0 Dim fs, f, ts Set fs = CreateObject("Scripting.FileSystemObject") fs.CreateTextFile "F:\EXCEL→XML\問題形式" & Worksheets("設問形式設定シート").Range(設問形式設定シート大問列 & 設問形式設定シート行).Value & ".xsl" 'ファイルの作成 Set f = fs.GetFile("F:\EXCEL→XML\問題形式" & Worksheets("設問形式設定シート").Range(設問形式設定シート大問列 & 設問形式設定シート行).Value & ".xsl") Set ts = f.OpenAsTextStream(ForWriting, TristateTrue) ts.Write indate ts.Close (2) <?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:import href="設定.xsl" /> <xsl:output method="xml" encoding="UTF-8" indent="yes" /> <xsl:param name="形式番号" >10001</xsl:param> <xsl:template match="/"> <xsl:call-template name="問題形式" /> </xsl:template> xsl:stylesheet>

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

こんにちは。 > (2)の...中略....とそのまま打ち込んでいます。 の意味がよくわからないのです。そのまま打ち込んでいるとは? > スタイルシートを使用して返還しようとすると スタイルシートを使用して変換するとは? > 保存しなおさないと正しく認識しない状態です。 ご提示のソースでは (2) の結果が得られないですよね。 テキストファイルの書き出し部だけなのですから。 したがって、#2 のソースは変数 src に代入された文字列を UTF-8 の テキストファイルに保存するものにとどまっています。 単体プロシージャでのテストで間違いなく動作することは確認済みです から、上手くいかない理由はご質問文にはでてこないその他の要因に よるものでしょう。そもそも、XSL の内容が正しいかどうかも、現在の ところこちらには判断できません。 また、Excel のバージョンは? どのような過程で、どのようなデータを、どのようなソースで実行して して、どのような結果にならずお困りなのか回答者側に見えてこない のです。 もっと具体的に説明していただけませんか?

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんにちは。 ■ 1点目 FSO (FileSystemObject)について FSO の CreateTextFile はテキストストリームを返しますので、   Set txt = fso.CreateTextFile("C:\test.txt")   txt.WriteLine "あああああ"   txt.Close のように使います。したがって、CreateTextFile したものをわざわざ GetFile, OpenAsTextStream し直す必要はありません。 この点については、下記ページが参考になります。 http://officetanaka.net/excel/vba/filesystemobject/filesystemobject.htm#CreateTextFile ■ 2点目 UTF-8での出力方法について ご提示のソースでは、変数 indate の内容が不明ですから、仮に indate には出力内容が文字列で代入されており、それを UTF-8 で出力したい とのご質問と解釈して回答します。 まず、UTF-8 でという時点で FSO のテキストストリームでは面倒です。 ADODB.Stream を使って下さい。 Sub test()   Const adTypeText As Long = 2   Const adSaveCreateOverWrite As Long = 2   Dim srcStm As Object ' ADODB.Stream   Dim outStm As Object ' ADODB.Stream   Dim src   As String      src = "出力内容の文字列" ' セルから取ってきたもの?          Set srcStm = CreateObject("ADODB.Stream")   Set outStm = CreateObject("ADODB.Stream")      With srcStm     .Type = adTypeText     .Charset = "Unicode"     .Open     .WriteText src     .Position = 0   End With      With outStm     .Type = adTypeText     .Charset = "UTF-8"     .Open   End With      srcStm.CopyTo outStm   outStm.SaveToFile "C:\test.xsl", adSaveCreateOverWrite      srcStm.Close: Set srcStm = Nothing   outStm.Close: Set outStm = Nothing End Sub なお、上記ソースは BOM 無し UTF-8 で、改行コードは規定値 CRLF です。 Office カテにしては、ちょっと難しい内容かもしれませんね。

kgyqk433
質問者

補足

ご返事ありがとうございます。 教えていただいた方法を試したのですが、状況がかわらず、やはり、保存しなおさないと正しく認識しない状態です。

  • nyasu_nc
  • ベストアンサー率50% (12/24)
回答No.1

こんばんわ VBAからUTF-8出力は、StrConv()WINAPIでいけるようです http://okwave.jp/qa112893.html もしくは、 Before:<?xml version="1.0" encoding="UTF-8"?> After :<?xml version="1.0" encoding="UTF-16"?> と保存すると意外と動きませんか?(両方ともに16へ) すみません、未確認で回答しています…

kgyqk433
質問者

補足

ご返事ありがとうございます。 教えていただいた方法を試したのですが、状況がかわらず、やはり、保存しなおさないと正しく認識しない状態です。