2016-06-14 11 views
0

XML文字列を受け取り、XSLスタイルシートを使用してExcelに挿入するVBSスクリプトを作成しようとしています。Excel VBA - 文字列からXMLを挿入する

最近Wordで同様のことを行い、InsertXML関数がXSLファイルをパラメータの1つとして取りました。しかしExcelではそれほどシンプルではないようです。

私はマップとスキーマという概念全体に惑わされています。

XmlImportXml関数は文字列を受け取りますが、マップも必要です。

Maps.Add(strXML)を試しましたが、スタイルシートを適用するオプションはありません。

XMLDOMのtransformNode関数を使用してXMLを事前変換しようとしましたが、Maps.Addはレイアウトによって完全に混乱します。 (変換されたXMLをファイルにエクスポートし、そのXMLをExcelで開くと、それはまさに私が望むものです)。

スキーマを作成するにはXMLToolsが必要ですか?私はボックスをインストールするための管理者権限を持っていません。

XMLファイルを保存してスタイルシートを定義しようとしても、Excelを開いても定義済みのスキーマがありません。

Excel XLSスタイルシートの作成にはたくさんのリソースがありますので、使い方について非常に簡単なものを見逃しているはずです。あなたがそれを必要とする場合には

は、ここではいくつかのサンプルXMLです:

<?xml version="1.0" standalone="yes" ?> 
<?xml-stylesheet type="text/xsl" href="Snapshot_Excel.xsl"?> 
<RpcData SrcNm="SnapshotBuckets" SrcTyp="DIR" ClientID="000" LoanNo="0000000000" Borrower="" RsltCd="0"> 
    <RepeatingFieldSet Nm="Hazard" Type="All Data" Count="3"> 
    <Row Index="1"> 
     <Fld Nm="Type">A</Fld> 
     <Fld Nm="AgentCode">TESTAP</Fld> 
     <Fld Nm="Agent City">ANYTOWN</Fld> 
     <Fld Nm="Agent Desc Line 1">APPLE</Fld> 
     <Fld Nm="Agent Desc Line 2">PICKERS</Fld> 
     <Fld Nm="Agent Desc Line 3">123 MAIN ST</Fld> 
     <Fld Nm="Agent Phone">(718) 555-1212</Fld> 
     <Fld Nm="Agent State">AL</Fld> 
     <Fld Nm="Agent ZIP Code">00001</Fld> 
    </Row> 
    <Row Index="2"> 
     <Fld Nm="Type">B</Fld> 
     <Fld Nm="AgentCode">TESTBA</Fld> 
     <Fld Nm="Agent City">ANYTOWN</Fld> 
     <Fld Nm="Agent Desc Line 1">BANANA</Fld> 
     <Fld Nm="Agent Desc Line 2">BUNCHERS</Fld> 
     <Fld Nm="Agent Desc Line 3">456 MAIN ST</Fld> 
     <Fld Nm="Agent Phone">(718) 555-1213</Fld> 
     <Fld Nm="Agent State">AK</Fld> 
     <Fld Nm="Agent ZIP Code">00002</Fld> 
    </Row> 
    <Row Index="3"> 
     <Fld Nm="Type">C</Fld> 
     <Fld Nm="AgentCode">TESTCH</Fld> 
     <Fld Nm="Agent City">ANYTOWN</Fld> 
     <Fld Nm="Agent Desc Line 1">CHERRY</Fld> 
     <Fld Nm="Agent Desc Line 2">PITTERS</Fld> 
     <Fld Nm="Agent Desc Line 3">789 MAIN ST</Fld> 
     <Fld Nm="Agent Phone">(718) 555-1214</Fld> 
     <Fld Nm="Agent State">CA</Fld> 
     <Fld Nm="Agent ZIP Code">00003</Fld> 
    </Row> 
    </RepeatingFieldSet> 
</RpcData> 

そして、私のXSLファイル:事前に

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:x="urn:schemas-microsoft-com:office:excel"> 
    <xsl:template match="/RpcData"> 
     <xsl:variable name="col" select="RepeatingFieldSet/Row"/> 
     <xsl:variable name="row" select="RepeatingFieldSet/Row[1]/Fld"/> 
     <Workbook> 
      <Worksheet ss:Name="Sheet1"> 
       <Table> 
        <!-- header row --> 
        <Row> 
         <Cell> 
          <Data ss:Type="String">Field</Data> 
         </Cell> 
         <xsl:for-each select="$col"> 
          <Cell> 
           <Data ss:Type="String"><xsl:value-of select="@Index"/></Data> 
          </Cell> 
         </xsl:for-each> 
        </Row> 
        <!-- data rows --> 
        <xsl:for-each select="$row"> 
         <xsl:variable name="i" select="position()"/> 
         <Row> 
          <Cell> 
           <Data ss:Type="String"><xsl:value-of select="@Nm"/></Data> 
          </Cell> 
          <xsl:for-each select="$col"> 
           <Cell> 
            <Data ss:Type="String"><xsl:value-of select="Fld[$i]"/></Data> 
           </Cell> 
          </xsl:for-each> 
         </Row>  
        </xsl:for-each> 
       </Table> 
      </Worksheet> 
     </Workbook> 
    </xsl:template> 
</xsl:stylesheet> 

ありがとう!

答えて

0

Workbooks.OpenXMLメソッドを使用して、最初の処理命令にXSLTスタイルシートを示すために1を指定:<?xml-stylesheet type="text/xsl" href="Snapshot_Excel.xsl"?>

また
Workbooks.OpenXML "C:\Path\To\XML\File.xml", 1, xlXmlLoadImportToList 

、あなたは直接ソースXMLを変換するVBAのMSXMLオブジェクトにXSLTを処理することができますし、その後、ワークブックにロード:

Public Sub RunXSLT() 
    Dim xmlDoc As Object, xslDoc As Object, newDoc As Object 

    Set xmlDoc = CreateObject("MSXML2.DOMDocument") 
    Set xslDoc = CreateObject("MSXML2.DOMDocument") 
    Set newDoc = CreateObject("MSXML2.DOMDocument") 

    ' LOAD XML AND XSL ' 
    xmlDoc.Load "C:\Path\To\Input.xml" 
    xmlDoc.async = False 

    xslDoc.Load "C:\Path\To\Script.xsl" 
    xslDoc.async = False 

    ' TRANSFORM AND SAVE OUTPUT ' 
    xmlDoc.transformNodeToObject xslDoc, newDoc 
    newDoc.Save "C:\Path\To\Output.xml" 

    Set newDoc = Nothing 
    Set xslDoc = Nothing 
    Set xmlDoc = Nothing 

    ' LOAD OUTPUT INTO WORKBOOK ' 
    Workbooks.OpenXML "C:\Path\To\Output.xml", , xlXmlLoadImportToList 

End Sub 

ワークブック結果

Excel XML Output

+0

ありがとうございます!最初の方法では、ユーザーにXSLを選択するようメッセージが表示され、そのファイルが拡張子とは異なるファイル形式になっているというメッセージが表示されます。幸いにも、2番目のメソッドは、ユーザープロンプトなしで変換されたXMLを正しく読み込みます。 しかし、私は本当に文字列からXMLを直接挿入できることを期待していました。私はブック内の別のシートにロードしようとしている4つのXMLを持っています。私はそれができないと思いますか? – ImagineMBE

+0

xslがxml '<?xml-stylesheet ...?>'のprocess-instructionで宣言されている場合は、プロンプトを表示しないでください。 xslはxmlや子フォルダ 'href = 'childfolder/script.xsl'と同じディレクトリに存在しなければなりません。また、 'OpenXML'が.xmlファイルを必要とする時に1つのwbを実行するので、単にXML文字列をファイルに保存するだけです。 4つのワークシートを1つにまとめることを検討してください。 – Parfait