在单个单元格中查找嵌入了多个字符串的字符串

时间:2015-12-29 14:47:15

标签: excel vba excel-vba

使用大型宏来自动完成一天结束的电子邮件流程,该流程涉及向不同的客户发送电子邮件。除了几个公司为不同员工提供不同电子邮件的情况外,一切工作都相当不错。如果这些员工是唯一将被发送到该电子邮件的员工,那将很简单,但当然不是这样。

我很难找到找到名字和引用电子邮件的解决方案。但是引用多个名称而不知道它可以提前有多少名称(意味着未来公司可能有10名员工使用相同的电子邮件确认,有些可能只有1名(对于那些需要每位员工单独发送电子邮件的人)) 。我会使用一个数组来测试数组吗?我还需要存储员工姓名,以确保不会创建重复项。请参阅下面的文本示例和代码:

这些名称以这种格式存储在名为emailMaster的工作表中,例如从单元格(1,3)开始(Joe GoodGuy; James Johanson; Jimmy TheHat(全部封装在一个单元格中)),他们对应的电子邮件位于.Offset(0,1)。为了澄清,这些绅士可能会为“CodersUnited”公司工作,但他们可能是来自“CodersUnited”公司的另一个团体,他们需要一个不同的电子邮件地址作为他们的日终收据,他们可以在单元格(1,5) (Jimmy John; Franky TwoToes; Jimmy Hendrix)以及他们在.Offset(0,1)中找到的相应电子邮件。

public class DestinationClass
{
    private IList<string> strings;

    public IList<string> Strings { get { return this.strings; } }

    public DestinationClass(List<string> strings = null)
    { 
        this.strings = strings ?? new List<string>();
    }
   //...
}

以下解决方案只有在与一封电子邮件对应的名称时才有效。需要有多个名称对应一封电子邮件。

Row   ____________________C____________________  __D___  ___________________E____________________  __F__
 1    Joe GoodGuy; James Johanson; Jimmy TheHat  Emails  Jimmy John; Frank TwoToes; Jimmy Hendrix  Email

2 个答案:

答案 0 :(得分:1)

在我看来,你混合了三个任务:

  1. 建模数据
  2. 确定在Excel中保存该数据的便捷方法
  3. 确定将数据保存在VBA变量中的便捷方法
  4. 您需要按顺序处理这些任务,但如果您在尝试当前任务时遇到问题,则愿意恢复到之前的任务。

    以下是我从您的问题中推断出的数据模型。此模型不符合任何标准建模符号,但如果您不是数据建模器,我认为您会发现这种符号更容易理解。

    您需要向所有客户发送电子邮件。我展示了三个示例客户。在Customer1,只有一个人向您发送电子邮件给谁拥有自己的电子邮件地址。在Customer2,有三个人向您发送电子邮件,每个人都有自己的电子邮件地址。 Customer3更复杂。 Person13有自己的地址,但其他联系人共享地址。例如,EmailAddr5由Person5,Person6和Person7共享。

    Customer1────EmailAddr1────Person1
    
    Customer2─┬──EmailAddr2────Person2
              ├──EmailAddr3────Person3
              └──EmailAddr4────Person4
    
    Customer3─┬──EmailAddr5─┬──Person5
              │             ├──Person6
              │             └──Person7
              ├──EmailAddr6─┬──Person8
              │             ├──Person9
              │             ├──Person10
              │             ├──Person11
              │             └──Person12
              └──EmailAddr7────Person13
    

    这是您数据的正确表示吗?我将其概括为:

    • 每个EMAILADDR有一个或多个PERSON
    • 每个CUSTOMER有一个或多个EMAILADDR

    如果您不熟悉建模数据,一开始可能会让人感到困惑,但我相信通过一点研究就会变得清晰。

    您需要回答的问题是:“这是对我的数据的完整描述吗?”只有当您确信没有此模型未涵盖的特殊情况时,才能继续执行任务2.

    除非您的最终模型比我的复杂得多,否则我认为您不需要两个或更多工作表来保存此数据。因此,任务2是将您的数据模型映射到Excel工作表。

    在任务2期间,要考虑的人是将创建和维护此数据的用户。例如,我原本以为在一个单元格中容纳多个人将难以维护。这些数据是如何到达的? Acme Supplies是否告诉您联系John Smith,他的电子邮件地址是Sales@AcmeSuppliers.Com,或者他们告诉您使用Sales@AcmeSuppliers.Com联系以下任何一个:Angela Brown,Cherry White和John Smith?如果数据以“名称 - 地址”的形式到达,则上述模型可能正确但不方便。这是一种方便的数据安排,供用户维护吗?

    Acme Supplies  |  Brown, Angela  |  Sales@AcmeSuppliers.Com
    Acme Supplies  |  Chester, Neal  |  Admin@AcmeSuppliers.Com
    Acme Supplies  |  Smith, John    |  Sales@AcmeSuppliers.Com
    Acme Supplies  |  White, Cherry  |  Sales@AcmeSuppliers.Com
    

    通过这种安排,每个公司每人都有一排。

    如果你真的认为你的数据模型是正确的,那么:

    Acme Supplies|Admin@AcmeSuppliers.Com|Chester, Neal|Sales@AcmeSuppliers.Com|Brown, Angela|Smith, John|White, Cherry|
    

    我使用垂直线来表示单元格边界。

    我做的是:

    Customer3─┬──EmailAddr5─┬──Person5
              │             ├──Person6
              │             └──Person7
              ├──EmailAddr6─┬──Person8
              │             ├──Person9
              │             ├──Person10
              │             ├──Person11
              │             └──Person12
              └──EmailAddr7────Person13
    

    并将其安排为:

    Customer3|EmailAddr5|Person5|Person6|Person7|EmailAddr6|Person8|Person9| and so on
    

    这可能有效,因为每个地址都包含符号“@”,而没有名称包含此符号。

    在开发从数据模型到Excel的映射时,您可能需要修改数据模型。您的原始模型在技术上可能是正确的,但在Excel中实现可能不方便。如果您修改后的模型可以处理您可以设想的任何公司,地址和名称的组合,并将修改后的模型映射到Excel,那么您就可以了。

    最后,任务3是将Excel工作表映射到VBA变量。这取决于您处理数据的方式。例如,您可能有一个列表:

    CompanyA, PersonZ
    CompanyB, PersonY
    CompanyB, PersonX
        :        :
    

    有了这个,可能更容易将数据留在工作表中,并且代码如下:

    For each line of list
      Search for Person
      If not found
        Report “No such person”
      Else
        Record row on which first Person found 
        Do While True
          If Person belongs to Company Then
            Generate email
            Exit Do
          End If
          Search for next Person
          If row for Person is the row for the first Person Then
            Report “No such person”
            Exit Do
          End If
         Loop
      End If
    Next
    

    我认为上述内容与我能提供的一样多,因为您的要求存在太多不确定性。这可能足以让您解决自己的问题。如果没有,您需要更新您的问题,澄清您的要求。

答案 1 :(得分:0)

也许你想要一个像下面这样的功能:

Function FoundEMail(groupArray As Variant, emailArray As Variant) As Boolean

    Dim PersonInGroup As Variant, PersonInEMail As Variant, PersonFound As Boolean

    For Each PersonInGroup In groupArray
        PersonFound = False
        For Each PersonInEMail In emailArray
            PersonFound = StrConv(Trim(PersonInGroup), vbUpperCase) = StrConv(Trim(PersonInEMail), vbUpperCase)
            If PersonFound Then Exit For
        Next PersonInEMail
        If Not PersonFound Then Exit Function
    Next PersonInGroup
    FoundEMail = True

End Function

因此,If firmName = emailMaster.Cells(emrow_num, 1) Then代替If FoundEMail(Split(firmName,";"),Split(emailMaster.Cells(emrow_num, 1),";")) Then,而不是int main() { printf ("Welcome in Lorempipsuland.h\n"); printf ("Choose one oh the paths:\n"); printf ("1-Nerd programmer's Rocky Mountains\n"); printf ("2-Olografic Banshee's Lakes\n"); c = getchar(); if (c == 1) { printf ("You entered in the Nerd programmer's Rocky Mountains\n"); printf ("Oh no, you met the solitaire programmer, do you want combat? Yes(1) or Not(2)?\n"); a = getchar(); if (a == 1) { printf ("You decided to fight, PREPARE!\n"); } else if (a == 2) { printf ("Coward!, but now go away, we have to walk lot"); } } else if (c == 2) { printf ("You entered in Holographic Banshee's lakes\n"); printf ("Oh no, that's an Holographic Banshee!\n"); }