2009-02-26 152 views
1

我需要在Word 2003中使用VBA創建主要來自先前存在的片段和本地數據庫的文檔(約150個報表,字母)。然後,我需要更改這些代碼片段中的特定部分如日期,短語,用戶信息,& c。顯然,我也會在程序中生成一些內容。使用VBA創建Word或XML文檔

當前,這個相同的任務是由一些可怕的傳統VBA完成(排序)。 (嵌套的IF和FOR,以及超過200個文本框都稱爲TextBox#)它通過向Word應用程序發送指令(例如Selection.MoveDown Unit:wdLine, Count:=1)完成作業。因此,即使生成一個簡單的字母也需要30秒,並鎖定Office。

我完全能夠對範圍和書籤和改進的邏輯做同樣的事情,但我的直覺是,這應該很容易用XML來實現,而且這樣做在未來會有優勢,因爲這些報告/信件將被訪問,並可能被許多不同的用戶和應用程序多次編程讀取。

我一直在閱讀關於XML和WordML架構,但感覺就像我失去了一些東西。

我想要的代碼上做發佈這是什麼:

  1. 抓鬥預定義的XML片斷(頁眉,頁腳等)
  2. 生成新的字符串並連接預定義的XML字符串
  3. 另存爲XML
  4. 在XML文件(日期,用戶名等)

現有的標籤,我可以做到這一點的變化值。

我的問題是:

  • 我一直有麻煩我周圍的架構和命名空間的頭。數據已經由VBA代碼驗證過,那麼我需要一個模式用於什麼?

  • 通過創建一個包含整個文檔的XML的長連接字符串來創建文檔比較好,銘記在我的模型中,大部分XML將來自現有片段,或者使用XML Dom並創建它編程:

20 Set oElementName = oDOM.createElement("Name")

30 oElement.appendChild oElementName

40 oElementName.Text = "This is the text of name"

  • 如何打印文檔? (從概念上講,這給我造成了最大的麻煩。)我並不是特別想從Word生成的WordML中進行逆向工程。我需要它,我需要先將其轉換爲HTML?我可以在Word中創建樣式表,以便自動格式化它嗎?

這是否有任何意義?我應該只使用範圍和書籤嗎?

XML對我來說似乎很強大,但它可能是一個扭曲的錘子和指甲問題,即「我想學習錘子,所以每個問題看起來像釘子,給我一個很好的理由來學習錘子。」

(我知道我不應該學習如何做,因爲我是做這些事情的!但我只是一個盲目的無人機,抱怨我們的文檔生成系統的質量,他們說:「閉嘴並修復它那麼!哦,你不知道任何VBA?那麼,我們不能給你任何課程或任何東西,所以你要學習。「這是我工作生活中最好和最差的2個月。)

我很感謝你閱讀所有這些,如果你有,並且你可能有任何幫助/建議!

回答

0

好的,所以我找到了我的問題的造型部分的答案。 (我在提交問題後不久就會發現這些東西!)

而且閱讀過它後,它對我來說更有意義!

來源:http://www.tkachenko.com/blog/archives/000024.html

<?xml-stylesheet type="text/xsl" href="style.xsl"?> 
<chapter title="XSLT Programming"> 
    <para>It's <i>very</i> simple. Just ask <link 
url="http://google.com">Google</link>.</para> 
</chapter> 

然後XSLT樣式表(相當大的一個因冗長的元素爲基礎的WordML語法):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:o="urn:schemas-microsoft-com:office:office" 
xmlns:w="http://schemas.microsoft.com/office/word/2003/2/wordml"> 
    <xsl:template match="/"> 
     <xsl:processing-instruction 
name="mso-application">progid="Word.Document"</xsl:processing-instruction> 
     <w:wordDocument> 
      <xsl:apply-templates/> 
     </w:wordDocument> 
    </xsl:template> 
    <xsl:template match="chapter"> 
     <o:DocumentProperties> 
      <o:Title> 
       <xsl:value-of select="@title"/> 
      </o:Title> 
     </o:DocumentProperties> 
     <w:styles> 
      <w:style w:type="paragraph" w:styleId="Heading3"> 
       <w:name w:val="heading 3"/> 
       <w:pPr> 
        <w:pStyle w:val="Heading3"/> 
        <w:keepNext/> 
        <w:spacing w:before="240" w:after="60"/> 
        <w:outlineLvl w:val="2"/> 
       </w:pPr> 
       <w:rPr> 
        <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/> 
        <w:b/> 
        <w:sz w:val="26"/> 
       </w:rPr> 
      </w:style> 
      <w:style w:type="character" w:styleId="Hyperlink"> 
       <w:rPr> 
        <w:color w:val="0000FF"/> 
        <w:u w:val="single"/> 
       </w:rPr> 
      </w:style> 
     </w:styles> 
     <w:body> 
      <w:p> 
       <w:pPr> 
        <w:pStyle w:val="Heading3"/> 
       </w:pPr> 
       <w:r> 
        <w:t> 
         <xsl:value-of select="@title"/> 
        </w:t> 
       </w:r> 
      </w:p> 
      <xsl:apply-templates/> 
     </w:body> 
    </xsl:template> 
    <xsl:template match="para"> 
     <w:p> 
      <xsl:apply-templates/> 
     </w:p> 
    </xsl:template> 
    <xsl:template match="i"> 
     <w:r> 
      <w:rPr> 
       <w:i/> 
      </w:rPr> 
      <xsl:apply-templates/> 
     </w:r> 
    </xsl:template> 
    <xsl:template match="text()"> 
     <w:r> 
      <w:t xml:space="preserve"><xsl:value-of 
select="."/></w:t> 
     </w:r> 
    </xsl:template> 
    <xsl:template match="link"> 
     <w:hlink w:dest="{@url}"> 
      <w:r> 
       <w:rPr> 
        <w:rStyle w:val="Hyperlink"/> 
        <w:i/> 
       </w:rPr> 
       <xsl:apply-templates/> 
      </w:r> 
     </w:hlink> 
    </xsl:template> 
</xsl:stylesheet> 
1

我不知道你的任務的情況下,有可能是推進技術合作的好理由,但似乎應該重新考慮在Office 2003中投入如此巨大的投資(150份報告很大)。雖然微軟說VBA不會消失,但我認爲Open XML SDK的前景更加光明。

這是一個excellent introduction到XML標記。

+0

感謝您的回答。我一直在閱讀Open XML,它看起來不錯,並且有人談到Office 2007將在今年晚些時候推出到辦公室,但是我最近已經證實,這至少要到2010年中期纔會發生。所以這是我不幸的地方。 – user51498 2009-02-26 02:08:51