#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, а не как функция?