プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。

現在エクセルの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>

A 回答 (3件)

こんにちは。



> (2)の...中略....とそのまま打ち込んでいます。

の意味がよくわからないのです。そのまま打ち込んでいるとは?

> スタイルシートを使用して返還しようとすると

スタイルシートを使用して変換するとは?

> 保存しなおさないと正しく認識しない状態です。

ご提示のソースでは (2) の結果が得られないですよね。
テキストファイルの書き出し部だけなのですから。

したがって、#2 のソースは変数 src に代入された文字列を UTF-8 の
テキストファイルに保存するものにとどまっています。

単体プロシージャでのテストで間違いなく動作することは確認済みです
から、上手くいかない理由はご質問文にはでてこないその他の要因に
よるものでしょう。そもそも、XSL の内容が正しいかどうかも、現在の
ところこちらには判断できません。

また、Excel のバージョンは?

どのような過程で、どのようなデータを、どのようなソースで実行して
して、どのような結果にならずお困りなのか回答者側に見えてこない
のです。

もっと具体的に説明していただけませんか?
    • good
    • 0

こんにちは。



■ 1点目 FSO (FileSystemObject)について

FSO の CreateTextFile はテキストストリームを返しますので、

  Set txt = fso.CreateTextFile("C:\test.txt")
  txt.WriteLine "あああああ"
  txt.Close

のように使います。したがって、CreateTextFile したものをわざわざ
GetFile, OpenAsTextStream し直す必要はありません。

この点については、下記ページが参考になります。
http://officetanaka.net/excel/vba/filesystemobje …

■ 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 カテにしては、ちょっと難しい内容かもしれませんね。

この回答への補足

ご返事ありがとうございます。

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

補足日時:2009/03/12 13:48
    • good
    • 0

こんばんわ



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へ)


すみません、未確認で回答しています…

この回答への補足

ご返事ありがとうございます。

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

補足日時:2009/03/12 13:50
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!