对word,excel等offfice软件进行操作,是我们大多数人再也熟悉不过的事情了。但是,如何在代码中对这些软件进行操作呢?对不同的软件操作,代码差距会很大吗?为了解决这些问题,VBA技术产生了。
Visual Basic for Applications(VBA)是一种Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件。也可说是一种应用程式视觉化的Basic Script。直白点说就是它提供一种通用的语言,可以被所有的Microsoft可编程应用软件所共享。
在没有它之前,一些应用软件如Excel、Word、Access、Project等都采用自己的宏语言供用户开发使用,但每种宏语言都是独立的,需要用户专门去学习,它们之间互不兼容,使得应用软件之间不能在程序上互联。拥有一种可跨越多个应用软件,使各应用软件产品具有高效、灵活且一致性的开发工具是至关重要的。VBA 作为一种新一代的标准宏语言,具有上述跨越多种应用软件并且具有控制应用软件对象的能力,使得程序设计人员仅需学习一种统一的标准宏语言,就可以转换到特定的应用软件上去,程序设计人员在编程和调试代码时所看到的是相同的用户界面,而且VBA 与原应用软件的宏语言相兼容,以保障用户在代码和工作上的投资。有了VBA 以后,多种应用程序共用一种宏语言,节省了程序人员的学习时间,提高了不同应用软件间的相互开发和调用能力。
在word中,几乎所有的操作都要调用Document对象本身或其内容.当您用VBA操作Word时,Document对象表示一个打开的文档,而且所有的Document对象都是Application对象的Documents集合的成员.
文档都是由字符、单词、句子和段落组成的集合,字符组成单词,单词组成句子,句子组成段落。对应于VBA上来说,每一个Document对象都具有Characters、Words、Sentences和Paragraphs四个集合。对word的操作当然也包括对文字的处理。如果我们想对某段或某句文字进行处理的话,当然,少不了Selection和Range对象。
下面,我们以段落为例,来具体看一下VBA是怎样实现对word的操作的。其实,每一篇文章粒度大一些划分的话都是由段落进行划分的。在操作过程中,我们要设置格式,然后进行书写。下面看一下实例。
namespace VBATest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//定义
Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
Microsoft.Office.Interop.Word.Document doc = null;
int paracount=0; //记录总够有多少段落
//Word文档的名称
object strFileName = "F:\VBATest\test.doc"; //你的word文档所保存的目录
//如果存在这个文档就先删除
if (System.IO.File.Exists((string)strFileName))
{
System.IO.File.Delete((string)strFileName);
}
object nothing = System.Reflection.Missing.Value;
//打开一个word
doc = app.Documents.Add(ref nothing, ref nothing, ref nothing, ref nothing);
/***************************************************************
* 加入试卷标题,是哪里的哪次考试的什么考试
***************************************************************/
//写试卷标题 哪场考试哪个科目
//定义一个段落
Microsoft.Office.Interop.Word.Paragraph para1; //定义一个段落
para1 = doc.Content.Paragraphs.Add(ref nothing); //对para1进行初始化
//给内容设置样式 内容样式设置一定要放到内容之前。否则,设置时无效的。
para1.Range.Font.Bold = 1; //粗体
para1.Range.Font.Size = 20; //大小为20
//添加这段的内容
para1.Range.Text = "廊坊师范学院数学与信息科学学院\n 2011-2012年第二学期期末考试\n2008级信息与计算科学专业\n 《马克思主义哲学》考试A卷\n";
//将段落para1添加到文档中
para1.Range.InsertParagraphAfter();
//居中
for (int i = 0; i < app.ActiveDocument.Paragraphs.Count; i++)
{
app.ActiveDocument.Paragraphs[i + 1].Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter; //居中
}
/**********************************************************************
* 添加姓名班级得分等学生信息
**********************************************************************/
Microsoft.Office.Interop.Word.Paragraph para2; //定义新段落
para2 = doc.Content.Paragraphs.Add(ref nothing);
//给内容设置样式
para2.Range.Font.Bold = 0;
para2.Range.Font.Size = 10;
//添加内容
para2.Range.Text = "姓名:———————— 班级:————————— 得分:———————\n";
para2.Range.InsertParagraphAfter();
app.ActiveDocument.Paragraphs[app.ActiveDocument.Paragraphs.Count-2].Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphRight;
/************************************************************************
* 添加试题类型
************************************************************************/
Microsoft.Office.Interop.Word.Paragraph para3; //定义新段落
para3 = doc.Content.Paragraphs.Add(ref nothing);
//给内容设置样式
para3.Range.Font.Bold = 1;
para3.Range.Font.Size = 16;
//添加内容
para3.Range.Text = "一、选择题(共有5道小题,每题2分,共10分)";
para3.Range.InsertParagraphAfter();
app.ActiveDocument.Paragraphs[app.ActiveDocument.Paragraphs.Count - 1].Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft;
paracount=app.ActiveDocument.Paragraphs.Count; //记录下此时共有多少段
//*************************************************************************
/**************************************************************************
* 添加试题内容
**************************************************************************/
Microsoft.Office.Interop.Word.Paragraph para4; //定义新段落
para4 = doc.Content.Paragraphs.Add(ref nothing);
//给内容设置样式
para4.Range.Font.Bold = 0;
para4.Range.Font.Size = 14;
string[]questionContent=new string[5];
questionContent[0] = "人类解放就是( )\n A.实现绝对自由\n B.摆脱规律的支配\n C.摆脱盲目必然性和社会关系的奴役\n D.不受任何束缚";
questionContent[1] = "人民群众的主体( )。\n A.是体力劳动者\n B.是进步的知识分子\n C.是各个时代的进步阶级\n D.包括体力劳动者和脑力劳动者";
questionContent[2] = "技术社会形态是( )。\n A.以生产力和技术发展水平以及与此相适应的产业结构划分\n B.以生产关系性质划分\n C.以生产力和生产关系统一的程度划分\n D.以生产资料所有制性质划分";
questionContent[3] = "使人们对微观宇宙的认识达到前所未有水平的是( )。\n A.夸克禁闭理论\n B.达尔文进化论\n C.相对论\n D.细胞学说";
questionContent[4] = "现代化生产中科学、技术、生产三者的关系是( )\n A.科学、技术、生产三者浑然一体\n B.基本上体现为“生产--技术--科学”的过程\n C.“科学--技术--生产”的过程不占主导地位\n D.“科学--技术--生产”的过程占主导地位";
//添加内容
para4.Range.Text = "1、"+questionContent[0]; //直接用循环插入会多一个段落符号。
for(int i=1;i<5;i++){
para4.Range.Text+=(i+1)+"、"+questionContent[i];
}
para4.Range.InsertParagraphAfter();
for (int i = paracount-1; i < app.ActiveDocument.Paragraphs.Count; i++)
{
app.ActiveDocument.Paragraphs[i].Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft;
}
app.Visible = true;
//将wordDOC文档对象保存为DOC文档
doc.SaveAs(ref strFileName, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing);
//关闭doc文档
doc.Close(ref nothing, ref nothing, ref nothing);
//关闭WordApp组件对象
app.Quit(ref nothing, ref nothing, ref nothing);
}
}
}
我们看一下运行效果图
-------------------------------------------------------------------------------------------------------------------------------------
当然,除了段落外,vba中还包含有很多的功能,留给大家自己去探索吧!!!