这是一段困扰着我的代码,因为我觉得某些简单的功能将使遍历数组值变得多余。
相反,我使用了一个数组,一个循环和一个布尔值来告诉我单元格是否为空(或测试它们的长度)以及一个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)做些什么吗?我尝试了一下,但没有走得太远。
答案 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