Определите, не пуста ли ячейка, чтобы выбрать динамический диапазон

#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») Заканчивается, Если Следующий