Здравствуйте, помогите, пожалуйста, добавить еще одно условие перед автоматической отправкой письма (одно условие уже есть) Условие которое нужно добавить: если одна из колонок 26 или 32 или 36 не пустые, то только тогда оправлять письмо.
Код:
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim TablCode Dim Email_Subject, Email_Send_From, Email_Send_To, _ Email_Cc, Email_Bcc, Email_Body As String Dim Mail_Object, Mail_Single As Variant
If Target.Count > 1 Then Exit Sub TablCode = Array(31, 34, 36, 18, 99) Select Case Target.Column Case 21, 25, 29, 33 For I = 0 To 4 If Target.Value = TablCode(I) Then 'Macro email '-------------------------------------------------------- If OutlookOuvert = False Then o = Shell("Outlook", vbNormalNoFocus) Email_Subject = " DL " & TablCode(I) Email_Send_From = "xxxx@gmail.com" Email_Send_To = "xxxx@gmail.com" Email_Cc = "xxxx@gmail.com" Email_Bcc = "xxxx@gmail.com" Email_Body = "auto mail" & vbCr & _ "" & vbCr & _ "Un code " & TablCode(I) & " a été atritubé a un vol autjoudh'ui" & vbCr & _ vbCr & _ "Date : " & Cells(Target.Row, 1) & vbCr & _ "Nom agent: " & Cells(Target.Row, 2) & vbCr & _ "départ: " & Cells(Target.Row, 13) & vbCr & _ "STD: " & Format(Cells(Target.Row, 18), "hh:mm") & vbCr & _ "ATD: " & Format(Cells(Target.Row, 19), "hh:mm") & vbCr & _ "explication : " & Cells(Target.Row, 24) & vbCr & _ "@tt"
On Error GoTo debugs Set Mail_Object = CreateObject("Outlook.Application") Set Mail_Single = Mail_Object.CreateItem(0) With Mail_Single .Subject = Email_Subject .To = Email_Send_To .cc = Email_Cc .BCC = Email_Bcc .Body = Email_Body .send End With debugs: If Err.Description <> "" Then MsgBox Err.Description '---------------------------------------------------------------- End If
Next
End Sub
[/vba] [moder]Для кода макроса используйте кнопочку #, а не fx. Тогда не будет такой кучи попугайчиков
Здравствуйте, помогите, пожалуйста, добавить еще одно условие перед автоматической отправкой письма (одно условие уже есть) Условие которое нужно добавить: если одна из колонок 26 или 32 или 36 не пустые, то только тогда оправлять письмо.
Код:
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim TablCode Dim Email_Subject, Email_Send_From, Email_Send_To, _ Email_Cc, Email_Bcc, Email_Body As String Dim Mail_Object, Mail_Single As Variant
If Target.Count > 1 Then Exit Sub TablCode = Array(31, 34, 36, 18, 99) Select Case Target.Column Case 21, 25, 29, 33 For I = 0 To 4 If Target.Value = TablCode(I) Then 'Macro email '-------------------------------------------------------- If OutlookOuvert = False Then o = Shell("Outlook", vbNormalNoFocus) Email_Subject = " DL " & TablCode(I) Email_Send_From = "xxxx@gmail.com" Email_Send_To = "xxxx@gmail.com" Email_Cc = "xxxx@gmail.com" Email_Bcc = "xxxx@gmail.com" Email_Body = "auto mail" & vbCr & _ "" & vbCr & _ "Un code " & TablCode(I) & " a été atritubé a un vol autjoudh'ui" & vbCr & _ vbCr & _ "Date : " & Cells(Target.Row, 1) & vbCr & _ "Nom agent: " & Cells(Target.Row, 2) & vbCr & _ "départ: " & Cells(Target.Row, 13) & vbCr & _ "STD: " & Format(Cells(Target.Row, 18), "hh:mm") & vbCr & _ "ATD: " & Format(Cells(Target.Row, 19), "hh:mm") & vbCr & _ "explication : " & Cells(Target.Row, 24) & vbCr & _ "@tt"
On Error GoTo debugs Set Mail_Object = CreateObject("Outlook.Application") Set Mail_Single = Mail_Object.CreateItem(0) With Mail_Single .Subject = Email_Subject .To = Email_Send_To .cc = Email_Cc .BCC = Email_Bcc .Body = Email_Body .send End With debugs: If Err.Description <> "" Then MsgBox Err.Description '---------------------------------------------------------------- End If
Next
End Sub
[/vba] [moder]Для кода макроса используйте кнопочку #, а не fx. Тогда не будет такой кучи попугайчиковKassandra
Сообщение отредактировал _Boroda_ - Вторник, 25.08.2015, 12:51
Без файла примера не совсем понятно, в каком месте колонок вы проверяете наличие значения. Но в качестве общего направления могу предложить такую конструкцию:
[vba]
Код
If Application.WorksheetFunction.CountA( [Ваш набор колонок] ) > 0 Then
[/vba]
Kassandra, здравствуйте.
Без файла примера не совсем понятно, в каком месте колонок вы проверяете наличие значения. Но в качестве общего направления могу предложить такую конструкцию:
[vba]
Код
If Application.WorksheetFunction.CountA( [Ваш набор колонок] ) > 0 Then
Скорее всего, там условие "хотя бы одна из". Кроме того, как я понял, проверять надо не колонки целиком, а ячейки строки таргета по этим колонкам. И где, кстати, End Select?
notEmpty = False For Each c In TablNoemptyColumns If Not IsEmpty(Target.Parent.Cells(Target.Row, c).Value) Then notEmpty = True Exit For End If Next If InStr(Join(TablTargetColumns, " ") & " ", Target.Column & " ") > 0 And _ InStr(Join(TablCode, " ") & " ", Target.Value & " ") > 0 And _ notEmpty Then 'Macro email '-------------------------------------------------------- '---------------------------------------------------------------- End If
[/vba]
Скорее всего, там условие "хотя бы одна из". Кроме того, как я понял, проверять надо не колонки целиком, а ячейки строки таргета по этим колонкам. И где, кстати, End Select?
notEmpty = False For Each c In TablNoemptyColumns If Not IsEmpty(Target.Parent.Cells(Target.Row, c).Value) Then notEmpty = True Exit For End If Next If InStr(Join(TablTargetColumns, " ") & " ", Target.Column & " ") > 0 And _ InStr(Join(TablCode, " ") & " ", Target.Value & " ") > 0 And _ notEmpty Then 'Macro email '-------------------------------------------------------- '---------------------------------------------------------------- End If
Спасибо всем за советы!! особенное спасибо AndreTM =) но остались еще вопросы: 1. если что-то написать, а потом попробовать стереть (например ошибся в цифре), то сразу вылазиет ошибка
2. Вот какие нужны условия: IF column 21 = 31 or 18 or 36 or 34 or 99 andColumn 24 = не пустая => отправить письмо IF column 25 = 31 or 18 or 36 or 34 or 99 andColumn 28 = не пустая => отправить письмо IF column 29 = 31 or 18 or 36 or 34 or 99 andColumn 32 = не пустая => отправить письмо IF column 33 = 31 or 18 or 36 or 34 or 99 andColumn 36 = не пустая => отправить письмо
IF column 22 or 26 or 30 or 34 = 99A =>не отправлять письмо (если это условие невозможно прописать, то оно не сильно важно)
Спасибо всем за советы!! особенное спасибо AndreTM =) но остались еще вопросы: 1. если что-то написать, а потом попробовать стереть (например ошибся в цифре), то сразу вылазиет ошибка
2. Вот какие нужны условия: IF column 21 = 31 or 18 or 36 or 34 or 99 andColumn 24 = не пустая => отправить письмо IF column 25 = 31 or 18 or 36 or 34 or 99 andColumn 28 = не пустая => отправить письмо IF column 29 = 31 or 18 or 36 or 34 or 99 andColumn 32 = не пустая => отправить письмо IF column 33 = 31 or 18 or 36 or 34 or 99 andColumn 36 = не пустая => отправить письмо
IF column 22 or 26 or 30 or 34 = 99A =>не отправлять письмо (если это условие невозможно прописать, то оно не сильно важно)Kassandra
А ничего, что "люди" могут ошибаться? Даже если вы для соответствующих ячеек предусмотрите "проверку данных", чтобы туда нельзя было внести ничего, кроме верных значений - никто не гарантирует, что оператор не внесет "не то из верных" значений. Соответственно, надо тогда сначала проверять корректность ввода, и только потом выполнять действие (отправку письма). И, как я и сказал, действие можно повесить на любое событие, не обязательно даблклик. Или уж тогда сделайте вообще отдельную юзерформу, где будут вводиться данные при модификации строки, а при записи данных - и будет выполняться и контроль, и отправка. Иначе вы рискуете организовать кучу неверных писем...
А ничего, что "люди" могут ошибаться? Даже если вы для соответствующих ячеек предусмотрите "проверку данных", чтобы туда нельзя было внести ничего, кроме верных значений - никто не гарантирует, что оператор не внесет "не то из верных" значений. Соответственно, надо тогда сначала проверять корректность ввода, и только потом выполнять действие (отправку письма). И, как я и сказал, действие можно повесить на любое событие, не обязательно даблклик. Или уж тогда сделайте вообще отдельную юзерформу, где будут вводиться данные при модификации строки, а при записи данных - и будет выполняться и контроль, и отправка. Иначе вы рискуете организовать кучу неверных писем...AndreTM
AndreTM, это не важно, если человек ошибится в написании (так как это как бы дополнительная мера) и все быстро на месте проверяется и то что будут неверные письма тоже не проблема =) тут главное оперативность, человек ввел данные, письмо сразу же отправилось Еще есть проблема в названии темы, нужно что бы тема была в зависимимости от колонки куда ввели данные, сейчас там постоянно тема 31
Огромное Вам спасибо, что Вы мне помогаете =)
AndreTM, это не важно, если человек ошибится в написании (так как это как бы дополнительная мера) и все быстро на месте проверяется и то что будут неверные письма тоже не проблема =) тут главное оперативность, человек ввел данные, письмо сразу же отправилось Еще есть проблема в названии темы, нужно что бы тема была в зависимимости от колонки куда ввели данные, сейчас там постоянно тема 31
Огромное Вам спасибо, что Вы мне помогаете =)Kassandra