2014-10-30 2 views
0

Я пытаюсь написать код, который вызывает различные частные субтитры, которые у меня есть. Я хочу вызвать sub, если определенное имя страны найдено в диапазоне. Мой диапазон указан в таблице с названием «Инфо-таблица» в столбце D. Мне потребуется, чтобы подпрограмма проходила через каждую страну, а не останавливалась после первого совпадения. У меня есть код в частных подписях, чтобы проверить, что делать, просто называя их на основе критериев диапазона - это то, с чем я борюсь.VBA to Call Sub Если текст в диапазоне найден

Я полагаю, мне нужно какое-то Если «Бразилия» Тогда звоните ... ElseIf «Китай» Тогда звоните ...

Кроме того, какой вид обработки ошибок мне нужно, если первая страна не появляется, Я не хочу, чтобы макрос переставал работать, нужно, чтобы он пересекал все страны. (Я привел два примера, будет около 20)

Наслаждайтесь временем и усилиями всех участников здесь!

Sub Send_Email() 

Dim Country As Range 

Set Country = Worksheets("Info Table").Range("D3:D30").Text.Find("Brazil") 
    Call Email_Brazil 

Set Country = Worksheets("Info Table").Range("D3:D30").Text.Find("China") 
    Call Email_China 

End Sub 

ответ

1

Я хотел бы сделать это следующим образом:

Sub Send_Email() 

Dim country As String 
Dim yourWorksheet As Worksheet 
Set yourWorksheet = ThisWorkbook.Sheets("Info Table") 

For j = 3 To 30 

    country = yourWorksheet.Range("D" & j) 

    Select Case country 

     Case "Brazil": Call Email_Brazil 
     Case "China": Call Email_China 
     Case "France": Call Email_France    

    End Select 

Next j  

End Sub 

, как это вы всегда перебрать все ваши клетки и вызвать макросы, только если страна была найдена. Кроме того, это будет простое добавление/удаление подсистем, как только вам это понадобится.

+0

Ящик для звонков - это именно то, что я искал, как добавить рабочий стол «Таблица данных» в диапазон? Макрос будет запускаться из другого рабочего листа в книге. – user2965077

+0

См. Правки к моему ответу –

+0

Я получаю сообщение об ошибке в вашем рабочем столе = Рабочие книги («C: \ Users \ wb.xlsx»). Могу ли я написать что-то большее? С этой книгой, рабочий лист «Инфо-таблица» – user2965077

1

У меня не было бы отдельного юга для каждой страны. Я бы использовал одну функцию для отправки всех ваших писем, например:

Sub Send_Emails() 

    Dim ws As Worksheet 
    Dim country As Range 
    Dim cell As Range 
    Dim message As String 

    Set ws = Worksheets("Info Table") 
    Set country = ws.Range("D3:D30") 

    ' loop through all cells in the range and email each 
    For Each cell In country 
     ' in case you need to pass something other than 
     ' the country to the email function 
     message = cell.Offset(, 2).Value2 
     Call SendEmailTo(cell.Value2) 
    Next cell 

End Sub 

Function SendEmailTo(country As String, message As String) 
    ' rather than having a separate sub to send an email to each country 
    ' use a function that accepts a country and send the email accordingly 
    ' you now have access to both the country and 
    ' the message (or modify to pass in whatever you need) 

    ' The function should include boilerplate email code that all of the emails 
    ' subs share, with a case statement for the parts that differ. 
End Function 

Это поможет сохранить код DRY. (Don't Repeat Yourself)

+0

Проблема заключается в том, что каждое электронное письмо отличается от одного, а не одного. Для контроля качества было проще иметь частные субмарины, чтобы они могли легко обновляться для каждой страны. – user2965077

+0

Есть ли какой-либо код, скопированный снова и снова в подписях электронной почты? Если это так, вам лучше иметь функцию, которая включает в себя код, который является общим для общего ресурса, и иметь свой оператор case внутри функции для частей, которые отличаются. –

Смежные вопросы