VBA трехсторонний IF

#vba

#vba

Вопрос:

У меня есть три ячейки, в которых могут быть или не быть данные. Если у них есть данные, мне нужно составить из них список

 If .Cells(16, 5).Text <> "" Then strComment = "- " amp; .Cells(16, 5).Text amp; vbCr
If .Cells(17, 5).Text <> "" Then strComment = strComment amp; "- " amp; .Cells(17, 5).Text amp; vbCr
If .Cells(18, 5).Text <> "" Then strComment = strComment amp; "- " amp; .Cells(18, 5).Text amp; vbCr
 

Это работает, но выглядит не очень красиво. В конце не должно быть vbcr.
для двух ячеек у меня есть решение, которое устраняет недостающие данные:

          If wksSource.Cells(40, 5).Text <> "" Then strComment = "- " amp; wksSource.Cells(40, 5).Text
         If wksSource.Cells(41, 5).Text <> "" Then
            If strComment = "" Then
                    strComment = "- " amp; wksSource.Cells(41, 5).Text
                 Else
                    strComment = strComment amp; vbCr amp; "- " amp; wksSource.Cells(41, 5).Text
                End If
          End If
 

Есть ли более разумное решение, чем проверка всех восьми ветвей с помощью ifs? Это может быть 0,1,2 или три записи.
Спасибо за чтение

Комментарии:

1. Ваш первый пример кода может быть улучшен с помощью цикла.

Ответ №1:

Вот как я бы подошел к проблеме:

 Option Explicit

Public Sub Test()
   Dim i As Integer
   Dim strComment As String
   
   For i = 16 To 18
      If Cells(i, 5).Text <> "" Then strComment = strComment amp; "- " amp; Cells(i, 5).Text amp; vbCr
   Next
   
   If Len(strComment) > 0 Then strComment = Left(strComment, Len(strComment) - 1)
   
   MsgBox strComment
End Sub
 

Как упоминалось в комментариях, цикл упрощает код. Кроме того, не беспокойтесь о возврате конечной каретки. Скорее, позаботьтесь об этом вне цикла.

Комментарии:

1. спасибо. Сокращение конечного CR — это разумное решение, которое я искал

Ответ №2:

Мне нравится использовать небольшую вспомогательную утилиту для выполнения подобных действий:

 Sub tester()
    Dim msg As String, c As Range
    msg = ""
    For Each c In ActiveSheet.Cells(16, 5).Resize(3, 1).Cells
        BuildString msg, c.Text
    Next c
    Debug.Print msg
End Sub

Sub BuildString(ByRef msg As String, addText As String)
    If Len(addText) > 0 Then
        If Len(msg) > 0 Then msg = msg amp; vbCr
        msg = msg amp; "-" amp; addText
    End If
End Sub
 

Комментарии:

1. BuildString: почему byref, а не как функция?