所有空单元格均使用Excel VBA单个消息框

时间:2019-02-06 22:23:30

标签: excel vba

我正在尝试返回单元格的“标题”,而不是返回以下范围或下面表格中所有空单元格的地址。 我想显示一个消息框,列出所有返回的单元格标题(在单元格上方给出标题)(如果有的话)。

因此,我想显示单元格的标题,而不是Range("C17, E23")。 例: 范围(“ C17”)=“ Nome /RazãoSocial” 范围(“ 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 :(得分:0)

这是使用“命名范围”的方法。

在“名称管理器”中设置您的名称。您可以为每个字段使用一个名称,并确保标题始终在特定位置偏移(例如,上一行,同一列),或者为每个字段使用两个名称(在这种情况下,标头可以在任何地方-困难得多)我认为是maintan)

更好的是,对名称使用特定的格式,这样就不必在两个地方(名称管理器和代码)管理字段

我使用的名称格式设置为“字段#_必填”。像这样在名称管理器中设置

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

答案 1 :(得分:-1)

命名范围不是这里的解决方案。您要输入“ 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是字典,则可以使用“ E23”的名称来称呼“ Celular”。如果是数组,则如上所述,您可以使用Enum通过另一个名称定义其在数组中的位置。

编辑2019年2月10日======================= 我设置了一个名为“ 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