Excel 用于缩小范围的范围函数

Excel 用于缩小范围的范围函数,excel,vba,Excel,Vba,我想通过使用函数将所选列的范围缩小为只包含非空白单元格 大多数其他线程都用于sub 我还是VBA的初学者。我试着用多种方法修改下面的代码,但都没能成功。如何返回缩小范围 Function RangeReduce(rng As Range) As Range Dim first_row, last_row As Double first_row = rng.Cells(1, 1).Address last_row = rng.Cells(Rows.Count).End(xl

我想通过使用函数将所选列的范围缩小为只包含非空白单元格

大多数其他线程都用于sub

我还是VBA的初学者。我试着用多种方法修改下面的代码,但都没能成功。如何返回缩小范围

Function RangeReduce(rng As Range) As Range
    Dim first_row, last_row As Double
    first_row = rng.Cells(1, 1).Address
    last_row = rng.Cells(Rows.Count).End(xlUp).Address
    Set RangeReduce = Range(first_row, last_row)
End Function

您可以使用
Range()
SpecialCells
修饰符(?不确定其名称)。另外,我假设你肯定有常数,但可能有公式,也可能没有公式

Function RangeReduce(rng As Range) As Range
Dim constRng As Range, formulaRng As Range
On Error Resume Next
Set constRng = rng.SpecialCells(xlCellTypeConstants)
Set formulaRng = rng.SpecialCells(xlCellTypeFormulas)
On Error GoTo 0


If formulaRng Is Nothing Then
    Set RangeReduce = constRng
Else
    Set RangeReduce = Union(constRng, formulaRng)
End If
End Function
你可以这样打电话:

Sub t()
Dim redRange As Range
Set redRange = RangeReduce(Range("E:E"))
Debug.Print redRange.Address
End Sub

您可以使用
Range()
SpecialCells
修饰符(?不确定其名称)。另外,我假设你肯定有常数,但可能有公式,也可能没有公式

Function RangeReduce(rng As Range) As Range
Dim constRng As Range, formulaRng As Range
On Error Resume Next
Set constRng = rng.SpecialCells(xlCellTypeConstants)
Set formulaRng = rng.SpecialCells(xlCellTypeFormulas)
On Error GoTo 0


If formulaRng Is Nothing Then
    Set RangeReduce = constRng
Else
    Set RangeReduce = Union(constRng, formulaRng)
End If
End Function
你可以这样打电话:

Sub t()
Dim redRange As Range
Set redRange = RangeReduce(Range("E:E"))
Debug.Print redRange.Address
End Sub

“缩小范围”是什么意思请注意
单元格(Rows.Count)
无效
单元格
需要
,还请注意,如果要在变量中存储
地址
,则必须将其声明为
字符串
,并且必须将永久变量的类型声明为字符串,最后一个地址为字符串,否则VBA假设变量(如果未指定)。•不要调用变量
。\u row
如果你真的在变量中放入了地址,这会让人非常困惑。你是如何调用它的?UDF有效吗?你只是不知道如何获得它?您可能会执行
将redRange变暗为Range//Set redRange=RangeReduce(Range(“A1:A100”)
。编辑:(我不记得什么时候使用
()
,所以也可以试试
设置redRange=RangeReduce Range(“A1:A100”)
)看看如何使用
特殊单元格ᴇʜ只是一个小的点,但是
单元格(Rows.Count)
不是无效的,但是它可能没有引用预期的单元格。也就是说,可能是列中的最后一个单元格。如果<代码> RNG 是A1,它会起作用。为了选择空白单元格,可以使用:<代码>选择。Suffic Cype(XLCyType BLIKS)。选择“< /代码>”,也许你可以用这个方法来从你的选择中删除那些。你说的“缩小范围”是什么意思?请注意
单元格(Rows.Count)
无效
单元格
需要
,还请注意,如果要在变量中存储
地址
,则必须将其声明为
字符串
,并且必须将永久变量的类型声明为字符串,最后一个地址为字符串
,否则VBA假设变量(如果未指定)。•不要调用变量
。\u row
如果你真的在变量中放入了地址,这会让人非常困惑。你是如何调用它的?UDF有效吗?你只是不知道如何获得它?您可能会执行
将redRange变暗为Range//Set redRange=RangeReduce(Range(“A1:A100”)
。编辑:(我不记得什么时候使用
()
,所以也可以试试
设置redRange=RangeReduce Range(“A1:A100”)
)看看如何使用
特殊单元格ᴇʜ只是一个小的点,但是
单元格(Rows.Count)
不是无效的,但是它可能没有引用预期的单元格。也就是说,可能是列中的最后一个单元格。如果<代码> RNG 是A1,它可以工作。为了选择空白单元格,可以使用:<代码>选择。Suffic Cype(XLCyType空白)。选择“< /代码>”,也许您可以使用这个方法来从您的选择中删除那些。
如果
constRng
Nothing
,则抛出错误@Pᴇʜ-啊,是的,我不想解释这一点。我将编辑代码。编辑:嗯,既然
UDF
返回一个范围,那么当没有范围时应该返回什么?感谢@BruceWayne提出的解决方案,它正在工作。如果没有范围,函数能否返回
Nothing
并抑制错误?我正在使用该函数作为另一个函数的输入。@BruceWayne如果将此UDF用作forumla,我将使其成为
变量
,并明确返回一个错误,而不是
什么都不返回
,如
RangeReduce=CVErr(xlerna)
。因此,这也可以由
=IFNA()
在类似
=IFNA(RangeReduce(A1:B10),“无需减少”)的公式中处理。如果UDF没有用作公式,那么我只会返回
Nothing
,因为调用过程可以很容易地捕捉到它。如果
constRng
Nothing
,那么
设置RangeReduce=Union(constRng,formulaRng)
不会抛出错误吗?@Pᴇʜ-啊,是的,我不想解释这一点。我将编辑代码。编辑:嗯,既然
UDF
返回一个范围,那么当没有范围时应该返回什么?感谢@BruceWayne提出的解决方案,它正在工作。如果没有范围,函数能否返回
Nothing
并抑制错误?我正在使用该函数作为另一个函数的输入。@BruceWayne如果将此UDF用作forumla,我将使其成为
变量
,并明确返回一个错误,而不是
什么都不返回
,如
RangeReduce=CVErr(xlerna)
。因此,这也可以由
=IFNA()
在类似
=IFNA(RangeReduce(A1:B10),“无需减少”)的公式中处理。如果没有将UDF用作公式,那么我只返回
Nothing
,因为调用过程可以很容易地捕捉到它。