excel - 使用 VBA 从 Excel 生成 VCard

标签 excel automation contacts vcf-vcard vba

我正在考虑创建一个 Excel 文件,在其中手动填写多个联系人信息,以便我可以将联系人(一个接一个)或全部导出到指定目录中的各个 vcf 文件。我想最好的方法是通过 VBA,但我知识不太丰富,需要一点插入。

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

enter image description here

任何指导将不胜感激。

好的,所以我首先开始解决将每一行导出到单独的 vcard 的问题。我遵循以下策略:

  1. 创建临时的新工作表 (tmp)
  2. 粘贴标题: 开始:电子卡 版本:3.0
  3. 根据我的图像复制粘贴第四行,以便它包含 VCARD 的 ID 以及我尝试导出的行(在第一种情况下为第 6 行)。我将它们粘贴到工作表 tmp 中。

我在这个阶段陷入困境,因为 vcard 用于某些字段的方式是用“;”分隔它们。并且他们处于不同的位置。我不知道如何通过查看第 4 行的字段在 VBA 中生成这些内容。即:N1 和 N2 应该为我创建行:N:Stuart;Carol。 ADR 字段也是如此。

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

此时如有任何帮助,我们将不胜感激。

最佳答案

我会这样做。创建一个名为 CContact 的类,其中包含这些属性的 getter 和 setter。

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

创建一个 CContacts 类来保存所有 CContact 实例。在 CContacts 中,创建一个 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

创建过程来填充类,如下所示

Public Sub Auto_Open()

    Initialize

End Sub

Public Sub Initialize()

    Set gclsContacts = New CContacts

    gclsContacts.FillFromRange Sheet1.Range("C6").CurrentRegion

End Sub

在此示例中,我使用双击事件。当您双击联系人时,就会创建电子名片。您需要修改才能使用按钮。获取单击的按钮的 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

这只是构建一个字符串并写入文件。此示例不符合 VCard 规范,因此您必须计算出这些细节。对于此方法,您需要一些常量和一个用于创建文件名的属性。

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

关于excel - 使用 VBA 从 Excel 生成 VCard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13294356/

相关文章:

excel - Excel工作簿已损坏和已修复现在工作表说代码错误时内存不足

Excel VBA,使用评估(MAX(IF))条件的自定义搜索 - 不匹配错误

bash - 在 mac OS X 中登录时运行脚本

java - Selenium 网络驱动程序 : How can I click these links?

swift - GameScene.sks 中具有相同名称的多个节点

python - 使用 openpyxl 改变所有单元格的样式

excel - 删除所有没有#3作为主键开头的行

本地化语言的 API 自动化测试

ios - CNContactViewController - 编辑按钮未显示

java - ArrayList.add() 不添加,不返回错误