我有以下方法可以找到范围内的最大值和最小值。然后我使用这些值来定位它们所在的实际单元格,因为我需要从该列的标题单元格中获取值。即使正在搜索的范围有一个具有该值的单元格,Range.Find 也始终返回 Nothing。
Sub GetTopAndBottomFiveCommodities()
Dim tempRange As Range, x As Integer, bestPnL As Double, worstPnL As Double
Dim strTopRangeName As String, strBottomRangeName As String
Dim cCell As Range, commodityName As String
Set tempRange = dataSourceSheet.Range("A:A").Find(What:="Year Totals")
Set tempRange = Range(tempRange.Offset(0, 1), tempRange.End(xlToRight).Offset(0, -1))
For x = 1 To 5
strTopRangeName = "TopCommodity" & CStr(x)
strBottomRangeName = "BottomCommodity" & CStr(x)
bestPnL = WorksheetFunction.Large(tempRange, x)
worstPnL = WorksheetFunction.Small(tempRange, x)
Debug.Print tempRange.Address
' get the top commodity name and PnL
**Set cCell = tempRange.Find(What:=bestPnL, LookIn:=xlValues)**
commodityName = dataSourceSheet.Cells(5, cCell.Column).Value
Range(strTopRangeName).Value = commodityName
Range(strTopRangeName).Offset(0, 1).Value = bestPnL
Next x
End Sub
Run Code Online (Sandbox Code Playgroud)
代码行
Set cCell = tempRange.Find(What:=bestPnL, LookIn:=xlValues)
Run Code Online (Sandbox Code Playgroud)
总是不返回任何内容,但我已验证存在具有该值的单元格。例如,单元格值为 66,152.61(在单元格中显示为 66,153),而 bestPnL 变量为 66,152.61 ,因此我尝试将 bestPnL 舍入为 66,153,但仍未找到。调试语句显示 tempRange 具有正确的范围,因此它不会在错误的位置搜索。
我唯一能想到的是带有值的单元格,从一个很长的公式中获取它的值,使用十几个命名范围,这会污染 find 方法吗?
为了让我们都知道我没有疯,这是我正在搜索的部分范围的快照。
编辑 根据蒂姆威廉姆斯的建议,我在 Find 调用之前更改了正在搜索的范围的数字格式。
tempRange.NumberFormat = "0.00"
Run Code Online (Sandbox Code Playgroud)
然后 Find 调用正常工作。然后我只是在例程结束时将数字格式放回我想要的方式。
tempRange.NumberFormat = "$#,##0;[Red]$#,##0"
Run Code Online (Sandbox Code Playgroud)
现在按预期工作。
尝试从单元格上的数字格式中删除千位分隔符。当我在测试范围内这样做时,它工作正常,但使用分隔符却无法找到该值。
Set f = rng.Find(what:=bestPnL, LookIn:=xlFormulas)
Run Code Online (Sandbox Code Playgroud)
即使使用千位分隔符也可以使用(编辑:仅适用于硬编码值;使用公式失败)。
EDIT2:这对我有用,带有千位分隔符并使用值的公式(EDIT3!:不适用于货币格式)。
Sub Tester()
Dim f As Range, v, rng As Range
Set rng = Range("C3:C21")
v = Application.Large(rng, 3)
v = Format(v, rng.Cells(1).NumberFormat)
Set f = rng.Find(what:=v, LookIn:=xlValues)
Debug.Print f.Address ' >> C19
End Sub
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5963 次 |
| 最近记录: |