- ベストアンサー
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>
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 > (2)の...中略....とそのまま打ち込んでいます。 の意味がよくわからないのです。そのまま打ち込んでいるとは? > スタイルシートを使用して返還しようとすると スタイルシートを使用して変換するとは? > 保存しなおさないと正しく認識しない状態です。 ご提示のソースでは (2) の結果が得られないですよね。 テキストファイルの書き出し部だけなのですから。 したがって、#2 のソースは変数 src に代入された文字列を UTF-8 の テキストファイルに保存するものにとどまっています。 単体プロシージャでのテストで間違いなく動作することは確認済みです から、上手くいかない理由はご質問文にはでてこないその他の要因に よるものでしょう。そもそも、XSL の内容が正しいかどうかも、現在の ところこちらには判断できません。 また、Excel のバージョンは? どのような過程で、どのようなデータを、どのようなソースで実行して して、どのような結果にならずお困りなのか回答者側に見えてこない のです。 もっと具体的に説明していただけませんか?
その他の回答 (2)
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。 ■ 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 カテにしては、ちょっと難しい内容かもしれませんね。
- nyasu_nc
- ベストアンサー率50% (12/24)
こんばんわ 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へ) すみません、未確認で回答しています…
補足
ご返事ありがとうございます。 教えていただいた方法を試したのですが、状況がかわらず、やはり、保存しなおさないと正しく認識しない状態です。
補足
ご返事ありがとうございます。 教えていただいた方法を試したのですが、状況がかわらず、やはり、保存しなおさないと正しく認識しない状態です。