2016-12-28 1 views
1

Я начинаю в Excel VBA и хотел бы помочь.Excel VBA - проверить, выбраны ли флажки и объединить соответствующие значения текстовых полей

В пользовательской форме для регистрации клиентов у меня есть раздел «контакты», который будет зарезервирован для получения до пяти контактных писем для зарегистрированного клиента. В этом UserForm у меня есть следующие объекты:

  • 5 текстовых полей (txtEmail1, txtEmail2, txtEmail3, ...)
  • 5 Флажки (ckboxEmail1, ckboxEmail2, ckboxEmail3, ...)
  • 1 CommandButton (bSendEmail)

Письмо будет набрано в текстовых полях и кнопка будет использоваться для открытия Outlook, приложения с уже в поле «Кому» писем. Флажки будут использоваться для определения того, какие письма будут включены в поле «Кому».

Вот мои сомнения. Как проверить, какие флажки отмечены, использовать (конкатенировать) только их электронные письма из текстовых полей?

Практический пример 1:

TxtEmail1.value = [email protected] 
TxtEmail2.value = [email protected] 
TxtEmail3.value = empty 
TxtEMail4.value = [email protected] 
TxtEMail5.value = empty 

CkboxEmail1.value = true 
CkboxEmail2.value = true 
CkboxEmail3.value = false 
CkboxEmail4.value = true 
CkboxEmail5.value = false 

Когда я нажать на кнопку, следующий массив должен быть передан в собственность ".то":

.To = "[email protected];[email protected];[email protected]" 

Практический пример 2:

TxtEmail1.value = [email protected] 
TxtEmail2.value = [email protected] 
TxtEmail3.value = empty 
TxtEMail4.value = [email protected] 
TxtEMail5.value = empty 

CkboxEmail1.value = false 
CkboxEmail2.value = false 
CkboxEmail3.value = false 
CkboxEmail4.value = true 
CkboxEmail5.value = false 

Когда я нажимаю кнопку, только 4-е письмо будет передано в свойство «.To», потому что только оно s checkbox is true:

.To = "[email protected]" 

Bellow - это код, который я использую для открытия приложения Outlook в событии bSendEmail Click.

Private Sub bSendEmail_Click() 

Dim outlookApp  As Object 
Dim outlookMail  As Object 

On Error GoTo error_outlook 
Set outlookApp = CreateObject("Outlook.Application") 
Set outlookMail = outlookApp.CreateItem(0) 
On Error GoTo 0 

On Error Resume Next 
With outlookMail 
    .To = "" 
    .CC = "" 
    .BCC = "" 
    .Subject = "" 
    .Body = "" 
    .Importance = 2 
    .Display 
End With 
On Error GoTo 0 

Set outlookMail = Nothing 
Set outlookApp = Nothing 

Exit Sub 

error_outlook: 

    MsgBox("some message here...", vbOKOnly + vbExclamation, "ERROR - Outlook") 
    Exit Sub 

End Sub 

Спасибо заранее и сожалею о плохом английском, это не мой родной язык.

ответ

1

Изменить

.To = "" 

в

Dim TempTo As String 
TempTo = "" 
If CkboxEmail1 Then TempTo = TempTo & TxtEmail1.value & ";" 
If CkboxEmail2 Then TempTo = TempTo & TxtEmail2.value & ";" 
If CkboxEmail3 Then TempTo = TempTo & TxtEmail3.value & ";" 
If CkboxEmail4 Then TempTo = TempTo & TxtEmail4.value & ";" 
If CkboxEmail5 Then TempTo = TempTo & TxtEmail5.value & ";" 

И, вероятно, добавить один дополнительный бит кода после того, чтобы предотвратить проблемы, когда не проверяются не CkBox:

If Len(TempTo) = 0 Then 
    MsgBox "No email addresses selected" 
    Exit Sub 
End If 

И, наконец:

.To = TempTo 
+0

Спасибо за быстрый ответ! Что касается флажков, код работал отлично (большое спасибо), но я не знаю, почему Excel игнорирует точку с запятой. Результат в поле «Кому» Outlook выглядит следующим образом: 'email1 @ example.comemail2 @ example.comemail4 @ example.com' Письма не разделяются точками с запятой. –

+0

@IgorSousa Ahh - Возможно, объект 'outlookMail' автоматически отключает любые завершающие'; '. Я буду редактировать код, чтобы использовать временную переменную. – YowE3K

+0

Ты потрясающий! Это сработало, спасибо вам большое! –