循环遍历一个范围中的每个单元格,以确保它们具有相同的长度

我正在尝试运行testing,以确保单元格范围内的每个单元格在其中具有相同的长度string。 基本上,我想检查定义范围内的每个单元格的string长度是否为1.如果每个单元格都是1,那么我会对代码做些什么,否则我会做其他的事情。 我正在使用评估(sumproduct(length())构造,但我得到一个types不匹配。任何帮助将不胜感激。

Sub Name_Length() Dim aCell As Range Dim ws As Worksheet Dim LastRow As Long Dim NameStr As String Dim Namer As Range Dim NameResult As Integer Dim i As Integer Dim cell As Range Set ws = Sheets("Data Input") LastRow = ws.Cells(Rows.Count, "E").End(xlUp).Row For Each cell In ws.Range("E4:E" & LastRow) NameResult = Evaluate("=SUMPRODUCT(LEN(cell))") Next cell If NameResult >= 1 Then 'Do something' Else MsgBox NameResult End If End Sub 

 Sub Name_Length() Dim ws As Worksheet Dim LastRow As Long Dim addr As String Set ws = Sheets("Data Input") LastRow = ws.Cells(Rows.Count, "E").End(xlUp).Row addr = "E4:E" & LastRow 'Note `ws.Evaluate` - otherwise the context used will be the ' ActiveSheet, which may not be what you want... If ws.Evaluate("SUM(1*(LEN(" & addr & ")=1))=rows(" & addr & ")") Then Debug.Print "all length=1" Else Debug.Print "Not all length=1" End If End Sub 

两个问题…

  • 您已经传递了一个引用范围( cell )的variables名称作为地址引用。 不是这样。 cell.address ,但是一个地址引用。
  • 您已经将一个variables名作为string的一部分传入。 它需要被打破,并将其值链接到string。

NameResult = Evaluate("=SUMPRODUCT(LEN(" & cell.address & "))")

你需要将它连接到cell.address到你的评估函数,所以它看起来像什么nwhaught说:

 NameResult = Evaluate("=SUMPRODUCT(LEN(" & cell.address & "))") 

然而,你有什么可能不会返回你想要的,因为它只会做你想要的,如果最后一个单元格大于或等于1个字符的长度。 为了纠正这个问题,可以尝试这样的事情:

 Sub Name_Length() Dim aCell As Range Dim ws As Worksheet Dim LastRow As Long Dim NameStr As String Dim Namer As Range Dim NameResult As Integer Dim i As Integer Dim cell As Range Set ws = Sheets("Data Input") LastRow = ws.Cells(Rows.Count, "E").End(xlUp).Row Set cell = ws.Range("E4:E" & LastRow) NameResult = Evaluate("=SUMPRODUCT(LEN(" & cell.address & "))") If NameResult >= 1 Then 'Do something' Else MsgBox NameResult End If End Sub 

在我看来,你正在寻找一个真正的/错误的一个单一的权威性问题; '范围内的所有单元格是否包含相同长度的值?

如果是这种情况,那么只要存储一个长度值并且将其与所有后续长度值进行比较,那么遍历这些值就是正确的。 此外,遍历所有的单元格将比批量操作慢。

 Sub Name_Length() Dim aCells As Range Dim LastRow As Long Dim NameLengthResult As Double Dim bAllTheSameLength As Boolean With Sheets("Data Input") LastRow = .Cells(Rows.Count, "E").End(xlUp).Row Set aCells = .Range("E4:E" & LastRow) NameLengthResult = CDbl(Evaluate("SUMPRODUCT(LEN(" & aCells.Address(external:=True) & "))") / aCells.Count) bAllTheSameLength = CBool(Round(NameLengthResult, 14) = Len(aCells.Cells(1, 1).Value2)) If bAllTheSameLength Then MsgBox "They are all the same." & Chr(10) & NameLengthResult & " characters wide" Else MsgBox "They are NOT all the same." End If End With End Sub 

这将决定是否所有单元格包含相同数量的字符。 要特别注意date,因为工作表LEN函数将返回5作为当前date的长度(今天是42191 )。

如果范围内的所有单元格都包含具有相同数量字符的值,则可以使用NameLengthResult或该范围内任何单元格的长度来确定实际长度。