如何在已知第一个单元格的列中定义范围,并在特定值单元格之前结束

我正在试图定义一个可变的列范围,将设置一个已知的第一个单元格,最后一个单元格是包含“Net Amount”的单元格之上的一个单元格。

Dim cell As Object Dim P1RNG As Range Dim PFRNG As Range Dim PRNG As Range Worksheets("Sales Orders").Activate For Each cell In Sheet1.Cells If cell.Value = "Q300103176" Then 'Find first Part number Set P1RNG = cell.Offset(29, -24) 'Find Last Part Number Set PFRNG = 'Set part number range Set PRNG = Range("P1RNG":"PFRNG") PRNG.Select End If Next 

这是我到目前为止的代码,我只是不知道如何find范围(PFRNG)中的最后一个单元格,它将在包含“净额”的单元格的正上方。 我不能find包含“净额”的单元格,并使其偏移一个,因为在此表单中有多个包含净额的单元格。 它必须是第一个单元格下面的单元格(P1RNG)。 也许还有一个更好的方法来做到这一点,而不使用我所打开的任何代码。

Range.Find比遍历所有单元格更高效。

 Dim rValue As Range, rNetAmount As Range, PRNG As Range With Worksheets("Sales Orders").Cells Set rValue = .Find(What:="Q300103176", After:=.Range("A1"), LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) If Not rValue Is Nothing Then Set rNetAmount = .Find(What:="Net Amount", After:=rValue, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) If Not rNetAmount Is Nothing Then Set PRNG = .Range(rValue, rNetAmount.Offset(-1)) End If End If End With 

你可以使用Find()和offset:

 Sub PartOfColumn() Dim B As Range, Startt As Range, WhatToFind As String Dim rTemp As Range Set B = Range("B:B") Set Startt = Range("B5") WhatToFind = "Net Amount" Set rTemp = B.Find(What:=WhatToFind, After:=Startt).Offset(-1, 0) Set rfinal = Range(Startt, rTemp) MsgBox rfinal.Address(0, 0) End Sub 

在这种情况下:

在这里输入图像说明

在这里,我们从B5开始,向下看,find“Net Amount”的第一个实例,然后备份一个单元格。

这就是我想到的:

 Option Explicit Public Function l_locate_last_value(Optional str_value As String = "Net Amount") Dim my_cell As Range Dim l_lowest As Long: l_lowest = -1 For Each my_cell In ActiveSheet.UsedRange If my_cell = str_value And my_cell.Row > l_lowest Then l_lowest = my_cell.Row End If Next my_cell l_locate_last_value = l_lowest End Function 

之后,您总是可以从结果中减去-1。 我使用UsedRange,只要它是更快(至less在我的电脑上)比迭代所有单元格。

一个AutoFilter()方法

 Function GetRange(firstCell As Range, stringAfter As String) As Range With Intersect(firstCell.EntireColumn, firstCell.Parent.UsedRange) .AutoFilter Field:=1, Criteria1:=stringAfter Set GetRange = .Parent.Range(firstCell, .Resize(.Rows.COUNT - 1).Offset(1).SpecialCells(xlCellTypeVisible).Areas(1).Cells(1, 1).Offset(-1)) .Parent.AutoFilterMode = False End With End Function 

在你的“主要”代码中使用,如:

 Dim PRNG As Range With ThisWorkbook.Worksheets("Sales Orders") Set PRNG = GetRange(.Range("B5"), "Net Amount") MsgBox PRNG.Address '... other code End With