确定数组中最大字符串长度的更快方法是吗?

时间:2019-02-18 14:14:12

标签: excel vba

这是一段困扰着我的代码,因为我觉得某些简单的功能将使遍历数组值变得多余。

相反,我使用了一个数组,一个循环和一个布尔值来告诉我单元格是否为空(或测试它们的长度)以及一个If语句来运行代码的最后一部分。

我认为Max可能会工作,但我相信这仅适用于整数。 (请参见debug.print部分

Dim arrArchLoc As Variant
Dim boolArchLoc As Boolean
Dim rowCounter As Long

boolArchLocEmpty = False

arrArchLoc = ActiveSheet.Range(Cells(2, colArchiveLocation), Cells(lastRow, colArchiveLocation))
For rowCounter = LBound(arrArchLoc) To UBound(arrArchLoc)
    If Cells(rowCounter, colArchiveLocation) <> "" Then boolArchLocEmpty = True
Next rowCounter

'Debug.Print workshetfunction.Max(arrArchLoc)

If boolArchLocEmpty = True Then
    ActiveSheet.Cells(1, colArchiveLocation).Value = "Arch Loc"
    Columns(colArchiveLocation).ColumnWidth = 6
End If

是否存在这样的功能或简单的方法?

编辑: 尽管specialcells(xlCellTypeBlanks)解决方案看起来不错,但我还是希望获得字符串长度解决方案。

抱歉,代码最初有类似...

If len(Cells(rowCounter, colArchiveLocation)) > 6 then...

但是自那以后,我不得不在必须采取一些可行的措施之后将其删除。

我可以使用LEN(MAX)做些什么吗?我尝试了一下,但没有走得太远。

3 个答案:

答案 0 :(得分:2)

鉴于范围为A2:A100,则您想要的结果将在工作表上表示为array formula

={MAX(LEN(A2:A100))}

要从VBA作为数组公式而不是常规公式执行该操作,您需要use Evaluate

max_len = Evaluate("=MAX(LEN(A2:A100))")

或者,根据您的代码,

Dim arrArchLoc As Range

With ActiveSheet
  Set arrArchLoc = .Range(.Cells(2, colArchiveLocation), .Cells(lastRow, colArchiveLocation))
End With

Dim max_len As Long
max_len = Application.Evaluate("=MAX(LEN(" & arrArchLoc.Address(external:=True) & "))")

但是,像您已经在做的那样,最好通过循环显式计算它。

答案 1 :(得分:1)

为什么不是这样

activesheet.range(cells(1,1),cells(10,1)).specialcells(xlCellTypeBlanks)

答案 2 :(得分:1)

另一种检查范围是否为空的方法

Sub Sample()
    Debug.Print DoesRangeHaveEmptyCell(Range("A1:A10")) '<~~ Change as applicable
End Sub

Function DoesRangeHaveEmptyCell(rng As Range) As Boolean
    If rng.Cells.Count = Application.WorksheetFunction.CountA(rng) Then _
    DoesRangeHaveEmptyCell = False Else DoesRangeHaveEmptyCell = True
End Function