отображать только ячейки со значением во всплывающей форме

#excel #vba

#excel #vba

Вопрос:

приведенный ниже макрос принимает два значения ячейки (из первого и второго столбца) и отображает столбец и содержимое ячейки во всплывающей форме

Я пытаюсь добавить условие, при котором отображается только значение столбца и ячейки, если ячейка содержит значение.
что-то вроде этого =IF(A1<>"",result,"")

но я не знаю, как реализовать это для всех ячеек, а не только для конкретной.

 Option Explicit

Const rangeForSearch = "G2"

Const rowTitles = 4

Dim arrTmp
Dim lastRow As Long, lastColumn As Long
Dim textForSearch As String, textForSearch_withoutSpaces As String
Dim strTmp As String
Dim i As Long, j As Long

Sub searchPerson()
    Application.ScreenUpdating = False
    With ActiveSheet
        textForSearch = .Range(rangeForSearch)
        If textForSearch = "" Then
            MsgBox "Input text in cell """ amp; rangeForSearch amp; """ and try again!", vbCritical
            Application.ScreenUpdating = True
            Exit Sub
        End If
        
        lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        lastColumn = .Cells(rowTitles, .Columns.Count).End(xlToLeft).Column
        If lastRow <= rowTitles Or lastColumn <= 2 Then
            MsgBox "Dataset is wrong! Check it and try again!", vbCritical
            Application.ScreenUpdating = True
            Exit Sub
        End If
        
        arrTmp = .Range(.Cells(rowTitles, "A"), .Cells(lastRow, lastColumn))
    End With
    '---------------------------------------
    textForSearch_withoutSpaces = Replace(textForSearch, " ", "")
    
    For i = LBound(arrTmp, 1)   1 To UBound(arrTmp, 1)
        strTmp = Replace(arrTmp(i, 1) amp; arrTmp(i, 2), " ", "")
        If StrComp(textForSearch_withoutSpaces, strTmp, vbTextCompare) = 0 Then Exit For
    Next i
    If i = UBound(arrTmp, 1)   1 Then
            strTmp = textForSearch amp; vbCrLf amp; vbCrLf amp; "No dataset!"
        Else
            strTmp = textForSearch
            For j = 3 To lastColumn
                strTmp = strTmp amp; vbCrLf amp; vbCrLf amp; arrTmp(1, j) amp; ": " amp; arrTmp(i, j)
            Next j
    End If
    Application.ScreenUpdating = True
    MsgBox strTmp, , "Result"
End Sub

  

Ответ №1:

может быть

         For j = 3 To lastColumn
            If Not IsEmpty(arrTmp(i, j)) Then strTmp = strTmp amp; vbCrLf amp; vbCrLf amp; arrTmp(1, j) amp; ": " amp; arrTmp(i, j)
        Next j
  

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

1. неясно, в какую часть кода вставить ваше условие, вставив его после textForSearch части вверху, я получаю runtime error, Index out of range

2. это для замены того же For j = 3 To lastColumn самого … Next j из вашего исходного кода