版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Outlook2010中的VBA编程您是否面临从Outlook2010中重复清除多个联系人的难题?是否必须将大量电子邮件附件逐一保存到硬盘?是否想从某些电子邮件消息中自动创建日历项目?还是不知道如何将MicrosoftOutlook2010中的联系人高效地导入MicrosoftExcel2010电子表格?使用VisualBasicforApplications(VBA)可以执行上述任务并实现更多功能,VBA是一种简单而又强大的会程语言,可为Office2010应用程序扩展新功能,还可以自动执行重复性任务。本文面向有经验的Outlook用户,他们希望了解有关VBA的信息,还希望深入了解编程对其根
2、据需要定制Outlook2010有何帮助。在阅读本文之前,您可能要阅读介绍性文章Office2010中的VBA入门,其中详细介绍了有关VBA编程的基础知识。Office2010中的VBA编程的强大功能在于,使用VBA可以完成用鼠标、键盘或对话框可以执行的几乎所有操作。而且,如果使用VBA可以执行一次,就可以轻松地执行上百次、上千次。(实际上,自动执行重复性任务是VBA在Office中的一种最常见用法。)除了可通过编写VBA脚本来加速执行日常任务,还可以使用VBA为Office2010应用程序添加新功能,或以特定于您的业务需要的方式来提示文档用户并与之交互。例如,在Outlook2010中,您可
3、以使用VBA通过标准用户界面中未提供的方式对联系人、电子邮件、日历项目或任务执行排序、导出和修改操作。本文中的教程可使用VBA实现Outlook的自动化。该教程是一个实际示例,研究为有经验的Outlook用户提供的编程、VBA和开发工具。选择方法VBA编程是一种功能强大的解决方案,但并不总是最佳方法。有时候使用其他途径来实现目标更合适。关键问题在于是否有更简单的方法。在开始VBA项目之前,请考虑内置工具和标准功能。例如,如果需要在Outlook中执行一项费时的操作,可考虑使用规则来解决此问题。是否可以执行一次任务然后使用Ctrl+Y(重做)来重复该任务?Outlook2010是一种功能强大的应
4、用程序;您需要的解决方案可能已经准备就绪了。花些时间了解有关Outlook2010的更多信息,再跳转到编程过程。在开始VBA项目之前,确保您有时间使用VBA。需要关注编程,编程结果可能无法预知。尤其是初学者,除非有时间仔细研究,否则切勿依靠编程。当期限迫近会造成极大压力时,可尝试编写快速脚本”来解决问题。如果您的时间很紧,可以使用较传统的方法,即使这些方法单调又重复,也必须这样做。VBA编程101通过代码使应用程序执行操作您可能认为编写代码是一项神秘而又复杂的工作,但基本原则是使用日常推理,并且很容易掌握。Office2010应用程序的创建方式如下:公开可以接收指令的对象,类似于为了与电话交互
5、而设计带按键的电话。按下按键时,电话会识别指令并按照拨号顺序包括对应的号码。在编程时,您是通过向应用程序中的各个对象发送指令来与应用程序交互。这些对象是可扩展的,但有限制。这些对象只能执行为其设计的操作,并且只按照您的指令执行操作。例如,请考虑这样的用户:他在Outlook中创建电子邮件、选择收件人、键入邮件主题,然后单击发送"。在VBA编程中,Outlook会公开一个Mailltem对象。使用VBA代码,您可以设置Mailltem的主题和正文,并告诉它执行保存”或发送操作。阅读本文后,您将了解有关这些对象、这些对象的组织方式及其描述和操作方式的更多信息。对象、方法和属性开发人员通过
6、层次结构来组织编程对象,该层次结构称为应用程序的对象模型。例如,Outlook中的收件箱”是OutlookNamespace寸象中白一个Folder对象。Folder对象包含Mailltem对象,等等。对象模型概略地对用户界面中显示的内容进行镜像,对象模型是应用程序及其功能的概念图。从编程角度而言,Folder对象可以包含任意类型的项目对象,但通常Outlook用户界面中的几个文件夹都主要由特定类型的项目对象组成。例如,Outlook用户界面提供一个主要包含Contactitem对象的联系人”文件夹,和一个主要包含Appointmentitem和Meetingitem对象的日历”文件夹。对象的
7、定义称为类,因此您可能会看到互换使用这两个术语的情况。从技术上讲,类是用于创建或实例化对象的说明或模板。只要对象存在,便可通过设置其属性和调用其方法来处理该对象。如果您认为对象是一个名词,则属性是描述该名词的形容词,方法是为名词赋予行动的动词。更改属性会更改对象的外观或行为的质量。调用对象的一个方法可使对象执行某个操作。在了解Outlook中对象模型的基本布局以及Application、Explorer和Folder对象的一些关键属性(允许您访问当前状态)后,便可以开始使用VBA扩展和处理Outlook了。宏和VisualBasic编辑器既然您已了解Outlook2010应用程序如何公开其对象
8、模型,可能已等不及要尝试调用对象方法、设置对象属性以及响应对象事件。为此,您必须在一个位置以Office可以理解的方法编写代码;通常使用是VisualBasic编辑器。尽管该编辑器是在默认情况下安装的,但在功能区中启用该编辑器之前,许多用户都不知道该编辑器的存在。打开开发工具”选项卡所有Ofice2010应用程序都使用功能区。功能区中有一个开发工具”选项卡,在此可以访问VisualBasic编辑器和其他开发人员工具。由于Office2010在默认情况下不显示开发工具”选项卡,因此必须使用以下过程启用该选项卡:启用开发工具”选项卡1 .在文件”选项卡上,选择选项”打开“Outloo选项”对话框。
9、2 .单击该对话框左侧的自定义功能区3 .在该对话框左侧的从下列位置选择命令”下,选择常用命令”。4 .在该对话框右侧的自定义功能区”下,选择主选项卡”,然后选中开发工具”复选框。5 .单击确定”。注释:在Office2007中,显示开发工具”选项卡的方法是单击Office按钮、单击选项”,然后在选项”对话框中的常用”类别下选中在功能区显示,开发工具破项卡复选框。启用开发工具”选项卡后,可以轻松找到“VisualBasi丽”宏”按钮图1.Outlook2010中的开发工具”选项卡2'日:彳库星人-Outloak数据文件-Mk开谄发送,按收文件夹视图开发*出口宏,代眄COM禁用现目加延期
10、加奉函3£)IJ_选撵表手设计用体目定义窗体安全问题默认情况下,为了使您免受病毒和其他恶意代码的侵害,Outlook中会禁用VBA宏。若要启用这些宏,请使用以下过程:启用宏1 .在文件”选项卡上,选择“Outloo选项”打开“Outloo艇项”对话框,然后单击信任中心”。2 .单击信任中心设置”,然后单击左侧的宏设置”选项。3 .选择为所有宏提供通知”,然后单击确定”。该选项允许在Outlook中运行宏,但在宏运行之前,Outlook会提示您确认是否要运行宏。4 .重新启动Outlook以使配置更改生效。VisualBasic编辑器在显示开发工具”选项卡后,可以打开VisualBas
11、ic编辑器,该编辑器是用于编写和编辑用于Outlook的VBA代码的内置工具。使用以下过程可以打开VisualBasic编辑器:打开VisualBasic编辑器1 .单击开发工具”选项卡上的宏”按钮。2 .在随后出现的宏”对话框中的宏名称”下键入Test。3 .单击创建"按钮打开VisualBasic编辑器,其中包含已键入的新宏的大纲VisualBasic编辑器包含下列代码。VBASubTest()EndSubSub代表Subroutine”(子例程),可将其暂时定义为宏”。运行Test宏将运行SubTest()与EndSub之间的所有代码。现在,请编辑宏,使其类似如下代码。VBAS
12、ubTest()MsgBox("Helloworld")EndSub图2.在VisualBasic编辑器中测试宏注意VisualBasic编辑器的左面板。Test宏位于Project1的Module1中。一个项目模块包含多个模块,每个模块包含可以作为.bas文件导入或导出的VBA代码的集合。只要对象存在,便可通过设置其属性和调用其方法来处理该对象。您编辑过的子例程中包含一个方法,该方法是用于执行操作的代码。该子例程中的Test()方法现在是对象Project1的一个成员。注释:其他Ofice应用程序可能会在VisualBasic编辑器中列出多个项目,但在OutlookVBA
13、中,只列出一个项目,并且该项目始终名为Projectl。返回到Outlook中的开发工具”选项卡,再次单击宏”按钮。在随后出现的列表中选择“Projectl.Tes宏,”然后单击运行”显示包含文本“Hello,world!的小消息框。祝贺您!您刚刚在Outlook中创建并实现了VBA代码!在消息框中单击确定”关闭消息框并完成宏的运行。如果未出现消息框,请检查宏安全性设置并重新启动Outlook。使宏可供访问如果您经常使用宏,可能会发现用键盘快捷方式或快速访问工具栏”按钮访问宏更为方便。若要在快速访问工具栏”中为“Test®创建按钮,请使用以下过程:在快速访问工具栏”中为宏创建按钮1
14、.单击文件”选项卡。2 .单击选项”打开“Outloo选项”对话框,然后单击快速访问工具栏3 .在从下列位置选择命令:'下的列表中,选择宏”。在随后出现的列表中查找类似于“Project1.Module1.Tes的文本,并选择该文本。4 .单击添加>>”按钮将宏添加到右侧的列表中,然后单击修改”按钮选择与该宏关联的按钮图像。5 .单击确定”。现在,您应在快速访问工具栏”中的文件”选项卡上方看到新按钮。现在,您不必使用开发工具”选项卡,便可随时快速运行宏,赶快试试吧。图3.向快速访问工具栏分配宏UuLLovk选质特规网口历膝条孔行帝锣如H记号常手曲=息iSsm定£功
15、能国体定距靛-不建斌阎st快出向界网恒叱曜的令。:0雌窟邕拴也再=丈件是另白孟前走百宝出匕的It目之之义t也更访ar反后:口瞿逞第fci斯尔伴实町的用3PrcjectL*Te>l:而口囿-a<廿忘三传*回JIr区为浅区下方显示唬运方可工后后整白罡山jg(L.*号.>/导H®联系人编辑宏假设您在名为ExampleSystems的公司中有多个联系人,每个联系人的电子邮件地址都包含域。现在,假定ExampleNetworks收购了ExampleSystems,并将所有员工的电子邮件地址更改为如果您只有一个或两个联系人在ExampleSystems则手动更改这些地址是很简单
16、的工作。但如果有20、50或100个联系人,则自动执行此类重复性任务便是VBA在Office中的常见用途了。本文探讨如何使用Outlook中的VBA修改联系人,还对一些VBA概念做了解释访问联系人文件夹按照您创建Test宏时使用的步骤创建名为CompanyChange的新宏并在VisualBasic编辑器中打开该宏。第一个任务是在Outlook中访问联系人”文件夹对象,然后将对该对象的引用存储在一个变量中。在编程中,变量是一个临时的命名对象,可保存值或对对象的引用。下面的示例代码使用一个名为ContactsFolder的变量。该代码指示VBA,它将把一个Folder对象放入其中并运行Sessi
17、oM象的GetDefaultFolder方法,以查找Contacts文件火并将对它的引用存储在该变量中。VisualBasic编辑器中包含一种有帮助的自动代码条目,名为智能感知"。在键入Session.GetDefaultFolder时要仔细查看,然后按下左括号作为其参数。在执行此操作期间,VisualBasic编辑器会显示选项列表。使用下拉箭头或鼠标选择olFolderContacts(这是一种可用的文件夹类型),然后按下Tab键将其选中。图4.使用智能感知”选取文件夹类型actDie*ttVisv&J,Eae;ie1atApplie-niinni-n»flJFr
18、aj*et.段跑J慢的)国:蹄咬件E球H现酊M晦F屿心黄酒星际印叫D相造序间渐口物砧如卡VC'咽去号通Tb=tU二JJJ与OcejflisiDktiCmbi(4CIjld-ciAziFuldcl5i1CoitactsFoL6ei=常播iQ。gUfef轨liTulder11L=Faldssrjlylkclan£LL>LFcl4«tjJtlat-euttnE*LBclderlikb'xilFcld*rJ才arralTOiT:IW1按竽毋予ICmtKftFfildiir益丫上不文,F血d打虽然在处理代码时使用复制和粘贴功能是可以有效避免键入错误的极好做法,但
19、直接在VisualBasic编辑器中键入代码可以亲自体验编辑器对您有何帮助。VBASubCompanyChange()DimContactsFolderasFolderSetContactsFolder=Session.GetDefaultFolder(olFolderContacts)EndSub再添加一行,以获取一些反馈并在宏的运行过程中测试宏。(而且可以像在使宏可供访问”一节中那样,花一分钟的时间为CompanyChange创建一个快速访问工具栏”按钮。)VBASubCompanyChange()DimContactsFolderasFolderSetContactsFolder=Ses
20、sion.GetDefaultFolder(olFolderContacts)MsgBox("ContactsFound:"&ContactsFolder.Items.Count)EndSubItems是Folder对象的一个属性,Count是Items属性的一个属性。运行宏;Outlook中的联系人数应出现在消息框中。如果尚未执行此操作,请打开联系人”文件夹,创建一些为虚构的ExampleSystems公司工作的示例联系人。为每个示例联系人给定公司名称ExampleSystems并为每个联系人创建一个与someone目似的不同电子邮件地址。对象集合集合是现代编程语
21、言(如VBA)中最强大的功能之一。集合是可以存储在属性中的一组对象,通过轻松演练”可以访问每个对象。在该示例中,代码必须遍历联系人的集合以查找ExampleSystems勺人员。如上所述,ContactsFolder变量可提供对Folder的Items集合的访问权限。联系人Folder的Items集合将返回ContactItem类型的对象。创建一个变量,来保存对每个ContactItem的引用。VBADimContactAsContactItem请注意,如果您不知道从集合中返回何种类型的对象,也可以使用通用Object类型。但如果您知道对象的类型,精确指定类型有许多优点。VBADimConta
22、ctAsObject在拥有Contactitem后,必须检查每个人的公司名称。由于Contactitem对象用于存储有关联系人的信息,因此必须存在一个用于存储公司名称的属性,但由于您不知道该属性的名称,因此必须使用下列两种方法之一来查找该名称。确定属性名称为了在VBA中充分利用对象,必须了解其属性和方法。虽然使用在Web中找到的示例代码可以执行许多任务,但您可以通过系统地检查所使用的对象来增加选项、减少调试和节省时间。例如,您可以通过在代码中选择Contactitem并按下F1来在帮助”的“Outlool#发人员参考”中查找有关Contactitem的信息,也可以在帮助”中搜索Contacti
23、tem请务必研究各个主题中的链接,以深入了解相关对象。开发人员参考”是用于VBA编程的强大工具,也是查找您的代码所需属性的一种方法。在阅读有关Contactitem对象的一般信息后,可单击“Contactitem寸象成员”链接查看方法和属性的列表(属性和方法统称为成员)。如果您继续查看该列表,您会看到一个CompanyName属性。此属性听起来似乎很有用。除了使用“Outloo研发人员参考”查找属性或方法外,还可以使用VisualBasic编辑器中的智能感知功能。在将变量Contact定义为Contactitem后,键入Contact和句点可以显示与帮助”中所列内容相同的成员列表。若要选择一个
24、智能感知选项,请使用向上和向下箭头或鼠标突出显示该选项,然后使用Tab键将其选中。智能感知不提供各个成员的说明,因此当上下文使您的选择很明显或您已了解成员的名称但无法记住其准确拼写时,使用此方法将很有帮助。成员名称拼写错误会产生VisualBasic编辑器在您运行宏之前一直无法标记的错误。循环访问集合现在,您有一个集合,您了解该集合中包含的对象类型,并且要访问找到的对象中的一个属性。您已准备好要使用ForEach循环来遍历集合并处理它所包含的对象。在伪代码中,您准备执行下列操作。VBAForEachobjectvariableinacollectionthatcontainsthattypeo
25、fobjectdosomethingwithobjectvariable.PropertyNext在实际代码中,上述代码转换为下列代码,其中涉及包含MsgBox语句的行。VBAForEachContactInContactsFolder.ltemsDebug.PrintContact.CompanyNameNext再次运行宏之前,请在VisualBasic编辑器中打开立即窗口。为此,请在菜单栏中单击视图”,然后单击立即窗口”。前面,您使用MsgBox从脚本中获取反馈。虽然MsgBox很有用,但它总是等待您单击确定”,然后才显示下一条消息。相反,Debug.Print每次都向立即窗口发送一行输出
26、,而不等待您确认。运行此脚本后,您应该能够在立即窗口中看到公司名称的列表。注意,该列表对于开发人员非常有用,但与您共享此宏的用户看不到该列表。使用If语句做决定在您已完成的解决方案中,您希望宏只更改在ExampleSystemsX作的联系人,而不更改其他联系人。这种条件逻辑正是编程的优势所在。这里,您可以使用If语旬告知VBA仅在所提供条件为真时运行代码;否则,它应跳到EndIf语句之后的代码。VBAIfsomeconditionistrueThen'dothingsEndIf'continueonwhetherornottheconditionwastrue在您所处理的问题中
27、,决定条件是当前Contactitem的CompanyName属性是否设置为字符用“ExampleSystems”在下面的代码中,请注意双引号。字符串值(即文本值)与数字值相反,始终包含在双引号内。VBA忽略单引号,单引号用于您和其他开发人员的注释中。在代码中添加条件,使完整脚本类似于如下代码。VBASubCompanyChange()DimContactsFolderAsFolderSetContactsFolder=Session.GetDefaultFolder(olFolderContacts)MsgBox("ContactsFound:"&Contacts
28、Folder.Items.Count)DimContactAsContactItemForEachContactInContactsFolder.ItemsIfContact.CompanyName="ExampleSystems"ThenDebug.Print"Found:"&Contact.FullNameEndIfNextEndSub运行代码后,应在立即窗口中看到ExampleSystems系人的姓名图6.使用立即窗口进行输出注意Debug.Print和前面的MsgBox为了清晰起见而合并已修复字符串的方法,例如"Found:&q
29、uot;后跟属性返回的值。为使此方法起作用,必须使用字符串连接运算符(&)来合并这两个文本字符串。重要信息:重要信息:在继续此教程的过程中,请务必谨慎。您使用的是实际的Outlook联系人列表,其中包含几个来自ExampleSystems的虚构联系人。将每个联系人的公司名称都修改为“ExampleNetworks并不合适。更改公司名称该操作已接近尾声。您已经加载了联系人,现在可以循环访问这些联系人并将您的联系人与来自ExampleSystems的联系人相区分。若要对ExampleNetworks进行更改,您可以更改CompanyName属性并调用Save方法来提交更改。VBAIfCon
30、tact.CompanyName="ExampleSystems"ThenContact.CompanyName="ExampleNetworks"Contact.SaveDebug.Print"Changed:"&Contact.FullNameEndIf运行宏,然后查看ExampleSystems系人;现在,这些联系人的公司名称应该已改为ExampleNetworks请注意,为了以后测试脚本,必须手动将公司名称更改回ExampleSystem葭创建可为您执行该更改的另一个宏。虽然Debug.Print语句不是脚本运行所必需
31、的语句,但请将其保留。您和您的用户从宏中获取的反馈越多越好。更改电子邮件地址更改CompanyName属性只是简单更改整个字符串。若要将电子邮件地址的域由更改为,需要执行字符串操作。每个字符串都有一个内置的编号系统,其中每个字符都有一个从1开始的索引号。您可以使用各种VBA函数来处理部分或全部字符串。由于存在许多需要检查子字符串或更改部分字符串的编程情况,因此了解这些字符串操作可显著增加您作为VBA程序员时的选择。(在Web中搜索“VBA字符串函数”可提供许多有用的列表和示例。)可以使用Replace函数来执行将一个子字符串替换为另一个子字符串的简单替换,但您可能经常会面临需要用更复杂的代码来
32、处理字符串的情况。在紧邻代码之前的位置添加下面的行,将调用Contact.Save。VBAContact.EmaillAddress=Replace(Contact.Email1Address,"","")请从左至右认真阅读代码。该代码指示将联系人的EmaillAddress属性(第一个电子邮件地址)设置为新值。提供新值的方法是让Replace函数在当前的Contact.EmaillAddress属性中查找字符串“将其替换为“”确保虚构联系人的公司名称已设置为ExampleSystems然后运行该脚本。电子邮件地址应全都更改为公司名称应全都更改为Exam
33、pleNetworks。使代码通用现在,您有一个强大的宏,但功能有限,因为指定新公司名称的唯一方法是编辑代码。若要使您的代码更加有用,可以使用InputBox函数提示用户输入。下列代码是最终脚本。这是一个有用并且完整的Outlook解决方案。VBASubCompanyChange()DimContactsFolderAsFolderSetContactsFolder=Session.GetDefaultFolder(olFolderContacts)DimOldCompanyNameAsStringDimNewCompanyNameAsStringDimOldEmailDomainAsStri
34、ngDimNewEmailDomainAsStringDimContactsChangedCountAsInteger'AskuserforinputsMsgBox("Thisscriptwillchangeallofyourcontactsfromonecompanytoanother.")OldCompanyName=InputBox("UnderwhatnamearethecontactslistedinOutlooknow?")NewCompanyName=InputBox("Whatisthenewcompanynametos
35、etthemto?")OldEmailDomain=InputBox("Whatisthee-maildomainnamecurrentlylistedafterthesign?")NewEmailDomain=InputBox("Whatshouldthee-maildomainbesetto?LeaveblankandclickOKifnochange")ContactsChangedCount=0DimContactAsContactItem'loopthroughContactsandsetthosewhoneeditForEa
36、chContactInContactsFolder.ItemsIfContact.CompanyName=OldCompanyNameThenContact.CompanyName=NewCompanyNameIfNewEmailDomain<>""ThenContact.Email1Address=Replace(Contact.Email1Address,OldEmailDomain,NewEmailDomain)EndIfContact.SaveContactsChangedCount=ContactsChangedCount+1Debug.Print&q
37、uot;Changed:"&Contact.FullNameEndIfNext'confirmandcleanupMsgBox(ContactsChangedCount&"contactswerechangedfrom'"&OldCompanyName&"'to'"&NewCompanyName)SetContact=NothingSetContactsFolder=NothingEndSub分发代码从开发所在计算机向其他计算机移动代码的过程被称为部署,这是编程项目的一个重要部分。本节介绍如何将新宏移动到其他计算机中。首先需要一个小型后台。OutlookVisualBasicforApplications代码设计用作个人宏开发环境;并非设计用于部署或分发。因此,无法像处理其他Office应用程序(如Excel或Word)那样在文档内保存宏。若要将OutlookVBA宏从一台计算机移至另一台计算机,可从第一台计算机中导出代码模块并将其导入第二台计算机。也可以
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 基层死因监测培训-乡镇及村培训案例
- 2023年直播电商行业调研分析报告
- 医院保洁员培训
- 舒伯职业生涯发展理论
- 儿科血友病教学查房
- 小学二年级数学100以内加减法竖式计算同步作业训练题
- 计算函数y=24x8+13x+arcsin4.x的导数
- 心理一社会状况哮喘病人的性格特征以自我为中心依赖性强过分
- 凝血功能障碍护理问题
- 元宵节亲子活动
- 有效教学 崔允漷 读书汇报
- 铝合金模板工程设计与施工专项方案技术交底
- 新材料产业产品和服务统计指导目录
- 抗病毒治疗依从性教育培训会
- 《建设工程监理合同(示范文本)》(GF-2012-0202)
- 肩周炎的治疗及护理
- 通信工程投标专家继续教育题库(附答案)
- 2023年01月四川凉山州木里重点国有林保护局招考聘用18人参考题库+答案详解
- 三垦变频器使用说明书SAMCO
- YBT-4190-2018-工程用机编钢丝网及组合体
- 加油站全年12月消防灭火疏散应急演练
评论
0/150
提交评论