#excel #vba #if-statement
Вопрос:
Я пытаюсь использовать For/If/Else для возврата различных диапазонов в зависимости от того, не пуста ли определенная ячейка, а затем вставить этот диапазон в электронное письмо.
Приведенный ниже код возвращает диапазон B15:G20, независимо от того, пуста ли рассматриваемая ячейка (b20) или нет. В идеале я хотел бы протестировать до четырех ячеек, чтобы убедиться, что они не пусты, и вернуть диапазон, содержащий только ячейки с данными в них.
Sub EXPVendorCopyRangeToOutlook_single()
'Declare Outlook Vairables
Dim oLookApp As Outlook.Application
Dim oLookItm As Outlook.MailItem
Dim oLookIns As Outlook.Inspector
'Declare Word Vaiables
Dim oWrdDoc As Word.Document
Dim oWrdRng As Word.Range
'Declare Excel Variables
Dim ExcRng As Range
On Error Resume Next
'Get the Active instance of Outlook
Set oLookApp = GetObject(, "Outlook.Application")
'If error create a new instance of outlook
If Err.Number = 429 Then
'Clear Error
Err.Clear
'Create new instance of Outlook
Set oLookApp = New Outlook.Application
End If
'Create a new email 'Possible Problem here
Set oLookItm = oLookApp.CreateItem(olMailItem)
'Create a reference to the ex range you want to export
For Each Cell In Worksheets("sheet1")
If Not IsEmpty(b20.Value) Then
Set ExcRng = Sheet1.Range("b15:g20")
ElseIf Not IsEmpty(b19.Value) Then
Set ExcRng = Sheet1.Range("b15:g18")
End If
Next
With oLookItm
'Define basic info
.From = "ABC@XYZ.COM"
.To = "123@345.COM"
.CC = ""
.Subject = Range("m3")
.Body = "Please review the attached invoices and confirm that the goods or services have been received and payment should be made."
'Display email
.Display
'Get the active inspector
Set oLookIns = .GetInspector
'Get word editor
Set oWrdDoc = oLookIns.WordEditor
'Specify rang in document
Set oWrdRng = oWrdDoc.Application.ActiveDocument.Content
oWrdRng.Collapse Direction:=wdCollapseEnd
'Add new paragraphand then insert break
Set oWrdRng = oWdEditor.Paragraph.Add
oWrdRng.InsertBreak
'Copy the Range
ExcRng.Copy
'Paste it
oWrdRng.PasteSpecial DataType:=wdPasteMetafilePicture
End With
End Sub
Это та часть кода, которая создает мне проблемы.
For Each Cell In Worksheets("sheet1")
If Not IsEmpty(b20.Value) Then
Set ExcRng = Sheet1.Range("b15:g20")
ElseIf Not IsEmpty(b19.Value) Then
Set ExcRng = Sheet1.Range("b15:g18")
End If
Next
Комментарии:
1. вы пропускаете ссылку на диапазон. Попробуйте isEmpty(диапазон(B20).Значение) и посмотрите, работает ли это лучше.
2.
On Error Resume Next
следует отменитьOn Error Goto 0
, как только вы настроите объект приложения Outlook. В противном случае ваш код с радостью пропускает любые ошибки, не помечая их.3. Я обновил код Для Каждой Ячейки В Рабочих Листах(«лист1»). Если не пусто(Диапазон(b20).Значение) Затем установите ExcRng = Лист1. Диапазон(«b15:g20»), если не пусто(Диапазон(b19).Значение) Затем установите ExcRng = Лист1. Диапазон(«b15:g18») Заканчивается, если он вставляет диапазон, что он делал раньше, он просто не изменится, даже после приведенного выше предложения, на основе пустых ячеек.
4. Допустим ли
b20.Value
синтаксис? ПопробуйRange("B20").Value
, и то же самое дляB19
? Кроме того, я почти уверен, что вы не хотите проверять каждую ячейку на рабочем листе? И почему вы зацикливаетесь, вы снова и снова проверяете значение одной и той же ячейки…5. Я не уверен в синтаксисе, VBA — не моя сильная сторона. но это работает как есть, чтобы установить диапазон, который я хочу преодолеть. это что-то изменит. Это просто не динамично. Я не хочу проверять каждую ячейку, у меня там был диапазон для проверки, и я достал его, чтобы что-то проверить, и забыл вставить обратно.
Ответ №1:
Итак, у меня был неправильный синтаксис Для Каждой Ячейки В Рабочих Листах(«лист 10»).Диапазон(«b20:g25») Если не пусто(Лист 10.Диапазон(«b25»).Значение) Затем установите значение ExcRng = Sheet10.Range(«b20:g25»), если оно не является пустым(Sheet10.Range(«b24»).Значение) Затем установите значение ExcRng = Sheet10.Range(«b20:g24»), если оно не является пустым(Sheet10.Range(«b23»).Значение) Затем установите значение ExcRng = Sheet10.Range(«b20:g23»), если оно не является пустым(Sheet10.Range(«b22»).Значение) Затем Установите ExcRng = Лист 10.Диапазон(«b20:g22») Заканчивается, Если Следующий