我正在尝试返回单元格的“标题”,而不是返回以下范围或下面表格中所有空单元格的地址。 我想显示一个消息框,列出所有返回的单元格标题(在单元格上方给出标题)(如果有的话)。
因此,我想显示单元格的标题,而不是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
答案 0 :(得分:0)
这是使用“命名范围”的方法。
在“名称管理器”中设置您的名称。您可以为每个字段使用一个名称,并确保标题始终在特定位置偏移(例如,上一行,同一列),或者为每个字段使用两个名称(在这种情况下,标头可以在任何地方-困难得多)我认为是maintan)
更好的是,对名称使用特定的格式,这样就不必在两个地方(名称管理器和代码)管理字段
我使用的名称格式设置为“字段#_必填”。像这样在名称管理器中设置
然后,此代码将处理所有工作簿范围内的“命名范围”,以“格式”字段“ _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” 的工作表。
现在,您可以运行如下代码。但是请记住,您需要设置对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