我需要在Word 2003中使用VBA创建大部分来自预先存在的代码段和本地数据库的文档(~150个报表,字母)。然后,我需要更改这些代码段的特定部分,例如日期,短语,用户信息,& c。显然,我将在程序中生成一些位。
目前,一些可怕的传统VBA完成了同样的任务(某种程度)。 (嵌套的IF和FOR,以及200多个文本框都称为TextBox#)它可以完成任务,并通过向Word应用程序(例如Selection.MoveDown Unit:wdLine, Count:=1
)发送指令来完成。因此,生成一个简单的字母需要30秒,并锁定Office。
我完全可以使用范围和书签以及改进的逻辑来做同样的事情,但我的直觉是,使用XML可以很容易地做到这一点,并且这样做将在未来具有优势,因为这些报告/字母将被访问,并且很可能被许多不同的用户和应用程序以编程方式读取。
我一直在阅读有关XML和WordML架构的内容,但感觉我错过了一些东西。
我希望代码在提交时做的是:
我可以这样做。
我遇到的问题是:
我无法理解架构和命名空间。数据已经过VBA代码验证,那么我需要一个架构呢?
通过创建一个包含整个文档的XML的长连接字符串来创建文档更好,请记住在我的模型中,大部分XML都来自现有的片段,或者使用XML Dom和以编程方式创建它:
20 Set oElementName = oDOM.createElement("Name")
30 oElement.appendChild oElementName
40 oElementName.Text = "This is the text of name"
这有什么意义吗?我应该只使用范围和书签吗?
XML对我来说似乎很强大,但它可能是锤子和钉子问题的扭曲案例,即“我想学习锤子,所以每个问题看起来像钉子,给我一个学习锤子的充分理由。” / p>
(我知道我不应该像我一样学习如何做事!但我只是一个无心的无人机抱怨我们的文档生成系统的质量,他们说“闭嘴并修复它然后哦,你不知道任何VBA?好吧,我们不能把你送上课程或任何东西,所以你要去学习。“这是我工作生涯中最好和最差的2个月。)
感谢您阅读所有内容,如果您这样做,以及您可能提供的任何帮助/建议!
答案 0 :(得分:1)
我不知道您的任务的情况,并且可能有充分的理由推进您的技术堆栈,但似乎应该重新考虑Office 2003中的这么大的投资(150个报告很大)。 虽然微软表示VBA不会消失,但我认为Open XML SDK有更光明的未来。
这是XML标记中的excellent introduction。
答案 1 :(得分: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>