使用VBA从Excel生成VCards

我正在创build一个Excel文件,我将手动填写多个联系人信息,以便我可以将联系人(一个接一个)或全部导出到指定目录中的单个vcf文件。 我想最好的方法是通过VBA,但我不是很熟悉,需要一点点的推动。

请参阅下面的联系人字段的Excel文件的截图。

在这里输入图像说明

任何指导将不胜感激。

好吧,所以我最初开始着手将每行导出到一个单独的vcard。 我正在遵循以下策略:

  1. 创build一个临时的新工作表(tmp)
  2. 粘贴标题:BEGIN:VCARD VERSION:3.0
  3. 按照我的图像复制粘贴第四行,以便它包含VCARD的ID以及我试图导出的行(在第一种情况下为第六行)。 我将它们粘贴到工作表tmp。

我在这个阶段卡住了,因为vcard用于某些领域的方式是用“;”来分隔它们。 他们处于不同的位置。 我不知道如何通过查看第4行的字段来在VBA中生成这些数据。例如:N1和N2应该为我创build行:N:Stuart; Carol。 ADR领域也是如此。

一旦完整的代码生成,我有代码来生成VCARD文件。

任何帮助在这一点将不胜感激。

这是我将如何做到这一点。 用这些属性的getter和setter创build一个名为CContact的类。

Private mlContactID As Long Private msLastName As String Private msFirstName As String Private msJobTitle As String Private msCompany As String Private msDepartment As String Private msEmail As String Private msBusinessPhone As String Private msCellPhone As String Private msPager As String Private msFax As String 

创build一个CContacts类来保存所有的CContact实例。 在CContacts中,创build一个FillFromRange方法来加载所有的联系人。

 Public Sub FillFromRange(rRng As Range) Dim vaValues As Variant Dim i As Long Dim clsContact As CContact vaValues = rRng.Value For i = LBound(vaValues, 1) To UBound(vaValues, 1) Set clsContact = New CContact With clsContact .ContactID = vaValues(i, 1) .LastName = vaValues(i, 2) .FirstName = vaValues(i, 3) .JobTitle = vaValues(i, 4) .Company = vaValues(i, 5) .Department = vaValues(i, 6) .Email = vaValues(i, 7) .BusinessPhone = vaValues(i, 8) .CellPhone = vaValues(i, 9) .Pager = vaValues(i, 10) .Fax = vaValues(i, 11) End With Me.Add clsContact Next i End Sub 

创build程序来填充类,就像这样

 Public Sub Auto_Open() Initialize End Sub Public Sub Initialize() Set gclsContacts = New CContacts gclsContacts.FillFromRange Sheet1.Range("C6").CurrentRegion End Sub 

对于这个例子,我正在使用双击事件。 双击联系人时,将创build电子名片。 您需要修改才能使用button。 获取单击的button的TopLeftCell属性以确定该行。

 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim lContactID As Long lContactID = Me.Cells(Target.Row, 3).Value If gclsContacts Is Nothing Then Initialize If lContactID <> 0 Then gclsContacts.Contact(CStr(lContactID)).CreateVCardFile End If End Sub 

这从C列获取ID并调用CreateVCardFile方法来写出文件。

 Public Sub CreateVCardFile() Dim sFile As String, lFile As Long Dim aOutput(1 To 12) As String lFile = FreeFile sFile = ThisWorkbook.Path & Application.PathSeparator & Me.VCardFileName Open sFile For Output As lFile aOutput(1) = gsBEGIN aOutput(2) = gsLASTNAME & Me.LastName aOutput(3) = gsFIRSTNAME & Me.FirstName aOutput(4) = gsTITLE & Me.JobTitle aOutput(5) = gsCOMPANY & Me.Company aOutput(6) = gsDEPARTMENT & Me.Department aOutput(7) = gsEMAIL & Me.Email aOutput(8) = gsBUSINESSPHONE & Me.BusinessPhone aOutput(9) = gsCELLPHONE & Me.CellPhone aOutput(10) = gsPAGER & Me.Pager aOutput(11) = gsFAX & Me.Fax aOutput(12) = gsEND Print #lFile, Join(aOutput, vbNewLine) Close lFile End Sub 

这只是build立一个string,并写入一个文件。 这个例子不是针对VCard规范的,所以你必须弄清楚这些细节。 对于这个方法,你需要一些常量和一个创build文件名的属性。

 Public Const gsBEGIN As String = "BEGIN:VCARD VERSSION: 3.0" Public Const gsEND As String = "END" Public Const gsLASTNAME As String = "N1;" Public Const gsFIRSTNAME As String = "N2;" Public Const gsTITLE As String = "TITLE;" Public Const gsCOMPANY As String = "ORG1;" Public Const gsDEPARTMENT As String = "ORG2;" Public Const gsEMAIL As String = "EMAIL,TYPE=WORK;" Public Const gsBUSINESSPHONE As String = "TEL,TYPE=WORK;" Public Const gsCELLPHONE As String = "TEL,TYPE=CELL;" Public Const gsPAGER As String = "TEL,TYPE=PAGER;" Public Const gsFAX As String = "TEL,TYPE=WORK,TYPE=FAX;" 

和文件名属性

 Public Property Get VCardFileName() As String VCardFileName = Me.LastName & "_" & Me.FirstName & ".vcf" End Property 

您可以通过下载此文件来查看省略的细节以及它们如何一起工作。

http://dailydoseofexcel.com/excel/VCardCreator.zip

编辑:如果你承认你几乎没有Visual Basic语言的有用的知识,并且事实上你需要一个解决scheme,而不仅仅是一个提示或“推”你称之为。 一个解决scheme是不要与简单的“帮助”混淆。 我会想出一个更短的代码来实现你的Excel工作表的目标,导出到任何格式,只要你提到你想要的具体结果(我的意思是一个vCard代码的例子)在一个非常短的时间而不需要你方的帮助。 但是,如果有这样的事情,你就像一个只需要推动的专业人员。 再次,这不是自豪感,也不是(我希望)我是冒犯性的,我只是在批评这个行为,放弃关于这个特定网站的限制的暗示。

你的问题是相当普遍的,我认为这个网站的目的是find特定问题的答案,而不是解决应用程序复杂性的问题。 这是我的第一次尝试,也许我错了,但我这个问题似乎有资格获得每个描述的投票“这个问题没有显示任何研究工作,它是不清楚或不是有用的”。

然而,如果你所需要的只是一个推动,那么你可以在Wikipedia上find有关VCard文件格式的信息(有例子) – 它说最新版本的格式是XML,所以如果你知道如何操作,应该很容易Visual Basic中的string并从脚本访问Excel单元格内容。 http://en.wikipedia.org/wiki/VCard

如果你不这样做,你可以按照需要通过练习来学习,比如http://www.excel-vba-easy.com/

尝试,并返回一个更具体的问题。 我只是简单地评论这个问题,而不是“回答”,但我还没有find办法。

Interesting Posts