将数据从VISUALBASIC传输到EXCEL的方法.pdf
- 文档编号:14659267
- 上传时间:2023-06-25
- 格式:PDF
- 页数:9
- 大小:143.12KB
将数据从VISUALBASIC传输到EXCEL的方法.pdf
《将数据从VISUALBASIC传输到EXCEL的方法.pdf》由会员分享,可在线阅读,更多相关《将数据从VISUALBASIC传输到EXCEL的方法.pdf(9页珍藏版)》请在冰点文库上搜索。
将数据从将数据从VisualBasic传输到传输到Excel的方法的方法INFO:
将数据从VisualBasic传输到Excel的方法适用于概要本文介绍将数据从MicrosoftVisualBasic应用程序传输到MicrosoftExcel的多种方法。
本文还介绍了每种方法的优缺点,这样您可以选择最适合您的解决方案。
更多信息将数据传输到Excel工作簿最常用的方法是“自动化”功能。
“自动化”功能为您提供了指定数据在工作簿中所处位置的最大的灵活性,以及对工作簿进行格式设置和在运行时进行各种设置的功能。
利用“自动化”功能,您可以使用多种方法传输数据:
逐单元格传输数据将数组中的数据传输到单元格区域使用CopyFromRecordset方法向单元格区域传输ADO记录集中的数据在Excel工作表上创建一个QueryTable,它包含对ODBC或OLEDB数据源进行查询的结果。
将数据传输到剪贴板,然后将剪贴板内容粘贴到Excel工作表中。
您还可以使用一些其他方法将数据传输到Excel,而不必使用“自动化”功能。
如果您正在运行服务器端应用程序,这是一种将批量数据处理从客户端移走的好方法。
在没有“自动化”功能的情况下,可以使用下列方法来传输数据:
将数据传输到制表符分隔或逗号分隔的文本文件,然后Excel可以将该文本文件分析为工作表上的单元格使用ADO将数据传输到工作表使用动态数据交换(DDE)将数据传输到Excel下面的部分提供了每种解决方案的详细信息。
使用“自动化”功能逐单元格传输数据利用“自动化”功能,您可以逐单元格地向工作表传输数据:
DimoExcelAsObjectDimoBookAsObjectDimoSheetAsObjectStartanewworkbookinExcelSetoExcel=CreateObject(Excel.Application)SetoBook=oExcel.Workbooks.AddAdddatatocellsofthefirstworksheetinthenewworkbookSetoSheet=oBook.Worksheets
(1)oSheet.Range(A1).Value=LastNameoSheet.Range(B1).Value=FirstNameoSheet.Range(A1:
B1).Font.Bold=TrueoSheet.Range(A2).Value=DoeoSheet.Range(B2).Value=JohnSavetheWorkbookandQuitExceloBook.SaveAsC:
Book1.xlsoExcel.Quit如果数据量较少,逐单元格传输数据是一种完全可以接受的方法。
您可以灵活地将数据放到工作簿中的任何位置,并可以在运行时根据条件对单元格进行格式设置。
不过,如果需要向Excel工作簿传输大量数据,则不建议您使用此方法。
您在运行时获取的每一个Range对象都会产生一个接口请求;因此,以这种方式传输数据速度较慢。
另外,MicrosoftWindows95和Windows98在接口请求上有64K限制。
如果在接口请求上达到或超过这一64K限制,自动化服务器(Excel)可能停止响应,或者您可能收到表明内存不足的错误。
Windows95和Windows98中的这一限制在下面的知识库文章中进行了讨论:
216400PRB:
Cross-ProcessCOMAutomationCanHangClientApplicationonWin95/98需要再次强调的是,逐单元格传输数据仅适用于传输少量数据。
如果需要将大量的数据集传输到Excel,应考虑下文提供的解决方案之一。
有关自动化Excel的更多示例代码,请参见以下Microsoft知识库文章:
219151HOWTO:
在VisualBasic中自动运行MicrosoftExcel使用“自动化”功能将数据数组传输到工作表上的区域一次可以将一个数据数组传输到多个单元格区域:
DimoExcelAsObjectDimoBookAsObjectDimoSheetAsObjectStartanewworkbookinExcelSetoExcel=CreateObject(Excel.Application)SetoBook=oExcel.Workbooks.AddCreateanarraywith3columnsand100rowsDimDataArray(1To100,1To3)AsVariantDimrAsIntegerForr=1To100DataArray(r,1)=ORD&Format(r,0000)DataArray(r,2)=Rnd()*1000DataArray(r,3)=DataArray(r,2)*0.7NextAddheaderstotheworksheetonrow1SetoSheet=oBook.Worksheets
(1)oSheet.Range(A1:
C1).Value=Array(OrderID,Amount,Tax)TransferthearraytotheworksheetstartingatcellA2oSheet.Range(A2).Resize(100,3).Value=DataArraySavetheWorkbookandQuitExceloBook.SaveAsC:
Book1.xlsoExcel.Quit如果您使用数组传输数据而不是逐单元格传输数据,则在传输大量数据时,传输性能会大大增强。
请注意上述代码中的以下行,该行将数据传输到工作表中的300个单元格:
oSheet.Range(A2).Resize(100,3).Value=DataArray此行表示两个接口请求(一个用于Range方法返回的Range对象,另一个用于Resize方法返回的Range对象)。
另一方面,逐单元格传输数据需要请求指向Range对象的300个接口。
只要有可能,您就可以从批量传输数据以及减少所发出的接口请求的数量中受益。
使用“自动化”功能将ADO记录集传输到工作表区域Excel2000引入了CopyFromRecordset方法,使您能够将ADO(或DAO)记录集传输到工作表上的某个区域。
下面的代码说明了如何自动化Excel2000、Excel2002或OfficeExcel2003,以及使用CopyFromRecordset方法传输罗斯文示例数据库中订单表的内容。
CreateaRecordsetfromalltherecordsintheOrderstableDimsNWindAsStringDimconnAsNewADODB.ConnectionDimrsAsADODB.RecordsetsNWind=_C:
ProgramFilesMicrosoftOfficeOfficeSamplesNorthwind.mdbconn.OpenProvider=Microsoft.Jet.OLEDB.4.0;DataSource=&_sNWind&;conn.CursorLocation=adUseClientSetrs=conn.Execute(Orders,adCmdTable)CreateanewworkbookinExcelDimoExcelAsObjectDimoBookAsObjectDimoSheetAsObjectSetoExcel=CreateObject(Excel.Application)SetoBook=oExcel.Workbooks.AddSetoSheet=oBook.Worksheets
(1)TransferthedatatoExceloSheet.Range(A1).CopyFromRecordsetrsSavetheWorkbookandQuitExceloBook.SaveAsC:
Book1.xlsoExcel.QuitClosetheconnectionrs.Closeconn.CloseExcel97还提供了一种CopyFromRecordset方法,但它只能用于DAO记录集。
Excel97中的CopyFromRecordset不支持ADO。
有关使用ADO和CopyFromRecordset方法的更多信息,请参见以下Microsoft知识库文章:
246335HOWTO:
使用“自动化”功能将数据从ADO记录集传输到Excel使用“自动化”功能在工作表上创建QueryTableQueryTable对象代表由外部数据源返回的数据构建的表。
当您自动运行MicrosoftExcel时,只须提供指向OLEDB或ODBC数据源的连接字符串和SQL字符串就可以创建QueryTable。
Excel假定能够生成记录集,并负责将其插入工作表中您指定的位置。
使用QueryTables可提供优于CopyFromRecordset方法的多种优点:
Excel处理记录集的创建并将其放置到工作表中。
查询可以保存在QueryTable中,以便在以后能够刷新,以获取更新的记录集。
当向工作表中添加新的QueryTable时,可以指定将工作表上的单元格中已经存在的数据移位,以便放置新数据(有关详细信息,请查看RefreshStyle属性)。
下面的代码演示了如何自动运行Excel2000、Excel2002或OfficeExcel2003,以便使用罗斯文示例数据库中的数据在Excel工作表中创建新的QueryTable:
CreateanewworkbookinExcelDimoExcelAsObjectDimoBookAsObjectDimoSheetAsObjectSetoExcel=CreateObject(Excel.Application)SetoBook=oExcel.Workbooks.AddSetoSheet=oBook.Worksheets
(1)CreatetheQueryTableDimsNWindAsStringsNWind=_C:
ProgramFilesMicrosoftOfficeOfficeSamplesNorthwind.mdbDimoQryTableAsObjectSetoQryTable=oSheet.QueryTables.Add(_OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;DataSource=&_sNWind&;,oSheet.Range(A1),Select*fromOrders)oQryTable.RefreshStyle=xlInsertEntireRowsoQryTable.RefreshFalseSavetheWorkbookandQuitExceloBook.SaveAsC:
Book1.xlsoExcel.Quit使用剪贴板Windows剪贴板还可以用作将数据传输到工作表的一种机制。
要将数据粘贴到工作表上的多个单元格中,可以复制列由制表符分隔、行由回车符分隔的字符串。
下面的代码说明了VisualBasic如何使用其剪贴板对象将数据传输到Excel:
CopyastringtotheclipboardDimsDataAsStringsData=FirstName&vbTab&LastName&vbTab&Birthdate&vbCr_&Bill&vbTab&Brown&vbTab&2/5/85&vbCr_&Joe&vbTab&Thomas&vbTab&1/1/91Clipboard.ClearClipboard.SetTextsDataCreateanewworkbookinExcelDimoExcelAsObjectDimoBookAsObjectSetoExcel=CreateObject(Excel.Application)SetoBook=oExcel.Workbooks.AddPastethedataoBook.Worksheets
(1).Range(A1).SelectoBook.Worksheets
(1).PasteSavetheWorkbookandQuitExceloBook.SaveAsC:
Book1.xlsoExcel.Quit创建可由Excel分析为行和列的带分隔符的文本文件Excel可以打开由制表符或逗号分隔的文件并正确地将数据分析为单元格。
当您希望向工作表传输大量数据而只使用少量“自动化”功能(如果有)时,可以使用此功能。
这对于客户端-服务器应用程序而言可能是一种好方法,因为文本文件可以在服务器端生成。
然后,可以在客户端根据需要使用“自动化”功能打开文本文件。
下面的代码说明了如何从ADO记录集创建逗号分隔的文本文件:
CreateaRecordsetfromalltherecordsintheOrderstableDimsNWindAsStringDimconnAsNewADODB.ConnectionDimrsAsADODB.RecordsetDimsDataAsStringsNWind=_C:
ProgramFilesMicrosoftOfficeOfficeSamplesNorthwind.mdbconn.OpenProvider=Microsoft.Jet.OLEDB.4.0;DataSource=&_sNWind&;conn.CursorLocation=adUseClientSetrs=conn.Execute(Orders,adCmdTable)Savetherecordsetasatab-delimitedfilesData=rs.GetString(adClipString,vbTab,vbCr,vbNullString)OpenC:
Test.txtForOutputAs#1Print#1,sDataClose#1Closetheconnectionrs.Closeconn.CloseOpenthenewtextfileinExcelShellC:
ProgramFilesMicrosoftOfficeOfficeExcel.exe&_Chr(34)&C:
Test.txt&Chr(34),vbMaximizedFocus如果文本文件具有.CSV扩展名,则Excel将打开该文件,而不显示“文本导入向导”,并自动假定该文件是逗号分隔文件。
类似地,如果文件具有.TXT扩展名,Excel将自动使用制表符分析此文件。
在前面的代码示例中,Excel使用Shell语句启动,文件名用作命令行参数。
前面的示例中没有使用“自动化”功能。
不过,如果希望,您可以使用最少量的“自动化”功能打开文本文件,并以Excel工作簿格式保存它:
CreateanewinstanceofExcelDimoExcelAsObjectDimoBookAsObjectDimoSheetAsObjectSetoExcel=CreateObject(Excel.Application)OpenthetextfileSetoBook=oExcel.Workbooks.Open(C:
Test.txt)SaveasExcelworkbookandQuitExceloBook.SaveAsC:
Book1.xls,xlWorkbookNormaloExcel.Quit有关使用VisualBasic应用程序中“文件I/O”的更多信息,请参见以下Microsoft知识库中文章:
172267RECEDIT.VBPDemonstratesFileI/OinVisualBasic下面的文章还讨论并提供了控制VisualBasicforApplications中的“文件I/O”的示例代码:
FileAccesswithVisualBasicforApplications(VisualBasicforApplications中的文件访问)使用ADO将数据传输到工作表使用MicrosoftJetOLEDB提供程序,您可以将记录添加到现有Excel工作簿的一个表中。
Excel中的“表”仅是带有定义名称的一个区域。
区域中的第一行必须包含标题(或字段名),而且所有后续行都包含记录。
下列步骤说明了如何使用名为MyTable的空表创建工作簿:
在Excel中启动一个新工作簿。
将下面的标题添加到Sheet1中的A1:
B1单元格:
A1:
FirstNameB1:
LastName将单元格B1的格式设置为右对齐。
选择A1:
B1。
在插入菜单上,选择名称,然后选择定义。
输入名称MyTable,并单击确定。
将新工作簿另存为C:
Book1.xls并退出Excel。
要使用ADO将记录添加到MyTable中,您可以使用与以下内容类似的代码:
CreateanewconnectionobjectforBook1.xlsDimconnAsNewADODB.Connectionconn.OpenProvider=Microsoft.Jet.OLEDB.4.0;&_DataSource=C:
Book1.xls;ExtendedProperties=Excel8.0;conn.ExecuteInsertintoMyTable(FirstName,LastName)&_values(Bill,Brown)conn.ExecuteInsertintoMyTable(FirstName,LastName)&_values(Joe,Thomas)conn.Close在以此方式将记录添加到该表中后,工作簿中的格式将会保留。
在前面的示例中,添加到B列中的新字段的格式设置为右对齐。
添加到行中的每个记录都将继承它前面的行的格式。
请注意,在将一个记录添加到工作表中的一个或多个单元格时,该记录将会覆盖这些单元格中以前存在的任何数据;也就是说,在添加新记录时,工作表中的行不会“向下推移”。
在工作表中设计数据的布局时应考虑到这一点。
有关使用ADO访问Excel工作簿的其他信息,请参见以下Microsoft知识库中文章:
195951HOWTO:
QueryandUpdateExcelDataUsingADOFromASP使用DDE将数据传输到Excel在与Excel通信和传输数据方面,DDE是“自动化”的替代方法;不过,由于“自动化”和COM的出现,DDE不再是与其他应用程序通信的首选方法,而且应仅在没有其他可用的解决方案时才使用该方法。
要使用DDE将数据传输到Excel,您可以:
使用LinkPoke方法将数据发送到特定的单元格区域,-或-使用LinkExecute方法发送Excel将执行的命令。
下面的代码示例说明了如何建立DDE与Excel的会话,以便能够将数据发送到工作表中的单元格,并执行命令。
要使用此示例成功建立DDE与LinkTopicExcel|MyBook.xls的会话,名为MyBook.xls的工作簿必须在正运行的Excel实例中已打开。
注意:
在此示例中,Text1代表VisualBasic窗体上的文本框控件:
InitiateaDDEcommunicationwithExcelText1.LinkMode=0Text1.LinkTopic=Excel|MyBook.xlsText1.LinkItem=R1C1:
R2C3Text1.LinkMode=1PokethetextinText1totheR1C1:
R2C3inMyBook.xlsText1.Text=one&vbTab&two&vbTab&three&vbCr&_four&vbTab&five&vbTab&sixText1.LinkPokeExecutecommandstoselectcellA1(sameasR1C1)andchangethefontformatText1.LinkExecuteSELECT(R1C1)Text1.LinkExecuteFONT.PROPERTIES(TimesNewRoman,Bold,10)TerminatetheDDEcommunicationText1.LinkMode=0在Excel中使用LinkPoke时,您需要在行-列(R1C1)批注中为LinkItem指定区域。
如果您要将数据发送到多个单元格,则可以使用列由制表符分隔、行由回车符分隔的字符串。
在使用LinkExecute请求Excel执行命令时,必须为Excel提供Excel宏语言(XLM)语法的命令。
XLM文档未包括在Excel97版和更高版本中。
有关如何获取XLM文档的更多信息,请参见以下Microsoft知识库文章:
143466DownloadtheExcel97MacroFunctionsHelpFileforXLMDocumentation不建议使用DDE解决方案与Excel通信。
“自动化”功能提供了最大的灵活性,让您能够访问Excel提供的更多新功能。
参考有关其他信息,请单击下面的文章编号,以查看Microsoft知识库中相应的文章:
306022HOWTO:
使用VisualBasic.NET向Excel工作簿传输数据
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 VISUALBASIC 传输 EXCEL 方法