Vba 仅在垂直方向上获取CurrentRegion

Vba 仅在垂直方向上获取CurrentRegion,vba,excel,Vba,Excel,我想写一个UDF用户定义函数,aka。将在每个绿色单元格中使用的宏。在此函数/宏中,您希望获得当前绿色单元格组旁边的框架单元格中最长字符串的长度。为了在宏中执行此操作,我需要确定一个范围,该范围表示当前单元格旁边的所有带边框的单元格。此计算应为一个绿色组中的每个单元格生成相同的范围对象,但组与组之间的范围对象不同。你是怎么得到这个范围的 我的第一次尝试是: Range(Application.Caller.Offset(0, -1).End(xlUp),_ Application.C

我想写一个UDF用户定义函数,aka。将在每个绿色单元格中使用的宏。在此函数/宏中,您希望获得当前绿色单元格组旁边的框架单元格中最长字符串的长度。为了在宏中执行此操作,我需要确定一个范围,该范围表示当前单元格旁边的所有带边框的单元格。此计算应为一个绿色组中的每个单元格生成相同的范围对象,但组与组之间的范围对象不同。你是怎么得到这个范围的

我的第一次尝试是:

Range(Application.Caller.Offset(0, -1).End(xlUp),_
      Application.Caller.Offset(0, -1).End(xlDown))
但是这个

不起作用 如果调用方单元格是组中最上面或最下面的单元格,则会给出错误的范围。
我需要像ActiveCell.Offset0,-1.CurrentRegion这样的东西,但只在垂直方向上。

您需要下面的代码:

Option Explicit

Sub GetLeftRange()

Dim myRng As Range

Set myRng = ActiveCell.Offset(, -1).CurrentRegion

Debug.Print myRng.Address

End Sub
注意:ActiveCell是您标记为绿色的单元格之一。

请尝试以下操作:

Function findlongest()

Dim fullcolumn() As Variant
Dim lastrow As Long
Dim i As Long, j As Long, k As Long
Dim tmax As Long
tmax = 0
With Application.Caller
    lastrow = .Parent.Cells(.Parent.Rows.Count, .Column - 1).End(xlUp).Row
    fullcolumn = .Parent.Range(.Parent.Cells(1, .Column - 1), .Parent.Cells(lastrow, .Column - 1)).Value
    For j = .Row To 1 Step -1
        If fullcolumn(j, 1) = "" Then
            j = j + 1
            Exit For
        ElseIf j = 1 Then
            Exit For
        End If
    Next j
    For i = .Row To UBound(fullcolumn, 1)
        If fullcolumn(i, 1) = "" Then
            i = i - 1
            Exit For
        ElseIf i = UBound(fullcolumn, 1) Then
            Exit For
        End If
    Next i

    'to get the range
    Dim rng As Range
    Set rng = .Parent.Range(.Parent.Cells(j, .Column - 1), Parent.Cells(i, .Column - 1))
    'then do what you want with rng


    'but since you already have the values in an array use that instead.
    'It is quciker to iterate and array than the range.
    For k = j To i
        If Len(fullcolumn(k, 1)) > tmax Then tmax = Len(fullcolumn(k, 1))
    Next k
findlongest = tmax
End With
End Function

这是使用区域设置每个范围的示例

Sub test()
    Dim Ws As Worksheet
    Dim rngDB As Range
    Dim rngA As Range, rng As Range

    Set Ws = ActiveSheet
    With Ws
        Set rngDB = .Range("a1", .Range("a" & Rows.Count).End(xlUp))

        Set rngA = rngDB.SpecialCells(xlCellTypeConstants, xlTextValues)
        For Each rng In rngA.Areas
            rng.Offset(, 1).Select '<~~ select is not required but is intended to be visualized
        Next rng
    End With
End Sub

是的,但据我所知,CurrentRegion在各个方向都工作,所以这将导致一个包含绿色单元格的范围。我只想得到框架单元格作为一个范围。@Greenberet绿色单元格中是否有值或文本?是否要在左侧返回一列?所有绿色单元格中的UDF本身将生成值。我想要一个表示框架单元格的范围。在UDF中使用CurrentRegion存在一个问题。不清楚如何设置绿色单元格的范围以及要按顺序执行的操作。如果绿色单元格中有数据,或者是数字或字符,我们需要更多信息。Application.Caller.Parent是什么?它确保我们在进行计算时查看的是正确的工作表,而不是当时的活动工作表。哦,谢谢。但是,实际上,我只需要以某种方式获得所描述的范围….:\这正是你要求的。它在“一对一”列中查找当前范围内最长的字符串。@Greenberet有关如何从代码中获取范围的信息,请参见编辑。我不建议这样做,因为迭代数组要比迭代范围快得多。