Excel VBA единое сообщение для всех пустых ячеек - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь вернуть «названия» ячеек, а не адрес всех ячеек, которые являются пустыми в диапазоне ниже или в форме ниже, а также.Я хотел бы отобразить одно окно сообщения со списком всех возвращенных заголовков ячеек (я дал заголовки над ячейками), если они есть.

Итак, вместо Range("C17, E23"), я бы хотелпоказать название ячейки.Пример: Range ("C17") = "Nome / Razão Social" Range ("E23") = "Celular"

Диапазон и заголовок ячеек: https://imgur.com/a/V9qU5Zb

Код выполняется без ошибок, но я хотел бы улучшить, как я уже сказал выше.

Выполнение кода: https://imgur.com/a/MMdgtvb

Спасибо!


Dim C As Range
Dim MsgStr As String
Dim rng As Range


'Define which cell must not be empty in the range below
Set rng = Planilha4.Range("C17, E23")

'Check every cell in the range
For Each C In rng
    If C.Value2 = "" Then
        If MsgStr = "" Then
            MsgStr = C.Address(False, False)
        Else
            MsgStr = MsgStr & "," & C.Address(False, False)
        End If
    End If
Next C

Dim lLastComma As Long: lLastComma = InStrRev(MsgStr, ",")
If lLastComma > 0 Then: MsgStr = Left(MsgStr, lLastComma - 1) & Replace(MsgStr, ",", " and ", lLastComma, 1)
MsgBox MsgStr & " cell" & IIf(lLastComma > 0, "s are ", " is ") & "empty"

'MsgBox MsgStr & " cells are empty", vbExclamation

End Sub


Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Именованные диапазоны не являются решением здесь.Вы хотите ввести «E23» и вернуть «Celular».Это словарная работа.Если вы не хотите настраивать словарь, подойдет простой массив, например

Dim Dict(1,10) As Variant
Dict(0, 0) = "E23"
Dict(1, 0) = "Celular"
Dict(0, 1) = "C17"
Dict 1, 1) = [Whatever]

Если бы Dict был словарем, вы могли бы назвать «Celular» по имени «E23».Если это массив, как описано выше, вы можете использовать Enum для определения его позиции в массиве под другим именем.

Редактировать 10 февраля 2019 ====================== Я настроил рабочую таблицу с именем "Dict" like this.

Теперь вы можете запустить код, как показано ниже.Помните, однако, что вам нужно установить ссылку на MS Scripting Runtime.

Option Explicit

Enum Nda                                ' Dictionary array
    NdaAddress
    NdaCaption
    NdaCapCell
    NdaTip
End Enum

Sub CreateDict()
    ' https://excelmacromastery.com/vba-dictionary/

    Dim Dict As Scripting.Dictionary
    Dim Arr As Variant
    Dim R As Long, C As Long
    Dim DictVal() As String

    Set Dict = New Scripting.Dictionary
    Arr = Worksheets("Dict").Range("A2:E5").Value
    For R = 1 To UBound(Arr)
        ReDim DictVal(1 To UBound(Arr, 2) - 1)
        For C = 2 To UBound(Arr, 2)
            DictVal(C - 1) = Arr(R, C)
        Next C
'        Debug.Print Arr(R, 1), Join(DictVal, "|")
        Dict.Add Arr(R, 1), Join(DictVal, "|")
    Next R

    Dim Key As Variant
    For Each Key In Dict.Keys
        Debug.Print Key,
        DictVal = Split(Dict(Key), "|")
        Debug.Print DictVal(NdaAddress), DictVal(NdaCaption), DictVal(NdaCapCell), DictVal(NdaTip)
    Next Key
End Sub

Идея состоит в том, что ключ "Tel" даст вам адрес ячейки, адрес ячейки заголовка,Сам заголовок и контрольный совет.Добавить или уменьшить по желанию / требуется.Попробуйте использовать небольшую служебную функцию для извлечения нужной части.

Debug.Print DictItem(Dict("Name"), NdaCaption)
Private Function DictItem(DictKey As String, _
                          Itm As Nda) As String
    DictItem = Split(DictKey, "|")(Itm)
End Function
0 голосов
/ 07 февраля 2019

Вот подход с использованием «Именованного диапазона».

Настройте свои имена в «Диспетчере имен».Вы можете либо использовать одно Имя для каждого поля и убедиться, что заголовок всегда смещен в определенном месте (например, предыдущая строка, тот же столбец), либо использовать два Имени для каждого поля (в этом случае заголовок может быть где угодно - гораздо сложнеена мой взгляд)

Еще лучше, используйте определенный формат для имен, чтобы вам не приходилось управлять полями в двух местах (менеджер имен и код)

У меня естьиспользуемые имена, отформатированные как «Поле # _Required».Настройте в диспетчере имен, как это

enter image description here

Затем этот код будет обрабатывать все именованные диапазоны в рамках рабочей книги, ища имена в формате «Поле * _Required», котороеобратитесь к диапазону на указанном листе.Предполагается, что заголовки находятся в том же столбце, в предыдущей строке.

Sub Demo()
    Dim ws As Worksheet
    Dim nm As Name
    Dim MsgStr As String
    Dim LastComma As Long

    Set ws = Worksheets("YourForm")  ' set to the Form sheet

    ' Check every named range
    For Each nm In ActiveWorkbook.Names
        If nm.Name Like "Field*_Required" Then
            If nm.RefersToRange.Worksheet Is ws Then
                If IsEmpty(nm.RefersToRange.Value2) Then
                    MsgStr = MsgStr & ", " & nm.RefersToRange.Offset(-1, 0).Value2
                End If
            End If
        End If
    Next

    If MsgStr <> vbNullString Then
        MsgStr = Mid$(MsgStr, 3) ' strip leading ", "
        LastComma = InStrRev(MsgStr, ",")
        If LastComma > 0 Then
            MsgStr = Left$(MsgStr, LastComma - 1) & _
                     Replace$(MsgStr, ",", " and", LastComma, 1)
        End If
        MsgStr = MsgStr & " cell" & IIf(LastComma > 0, "s are", " is") & " empty"
        MsgBox MsgStr, vbCritical + vbOKOnly, "Missing Fields!"
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...