在 Excel VBA 中选择变量的位置(作为单元格)
Selecting Variable's Location (as Cell) in Excel VBA
所以,我对 select 计算公式值的确切单元格有疑问。我是 VBA 的新手,我在互联网上搜索了至少 2 天以获得有价值的答案。在这里让我向您展示我试图放置的代码并解释它之后的作用;
Dim r As Range
MinTime = WorksheetFunction.Min(Range("C5:L14"))
Set r = ActiveSheet.Cells.Find(MinTime)
r.Select
MinRow = ActiveCell.Row
MinCol = ActiveCell.Column
所以我想做的是在 worksheetfunction.min 和 select 我刚刚找到的单元格的范围内找到最小数量。然后将行和列信息指向其他2个变量。但是这段代码并不总是有效。有时它工作得很好有时它没有,我现在一无所知。任何形式的帮助将不胜感激。已经谢谢了。
您甚至可以在不使用 WorksheetFunction 或 Find 函数的情况下执行此操作。创建一个数组然后循环遍历它是找到所需内容的一种相当简单的方法。试试这个
Sub findMin(ByVal minRange As Range)
Dim searchArr() As Range
ReDim searchArr(1 To minRange.Rows.Count * minRange.Columns.Count) As Range
Dim minVal As Double
Dim i As Integer, i2 As Integer, outputRow As Integer, outputColumn As Integer
For i2 = 0 To minRange.Columns.Count
For i = 0 To minRange.Rows.Count
searchArr(i + 1) = Cells(minRange.Row + i, minRange.Column + i2).Value
Next i
Next i2
minVal = searchArr(1).Value
For i = 1 To UBound(searchArr)
If searchArr(i).Value < minVal Then
minVal = searchArr(i).Value
outputRow = searchArr(i).Row
outputColumn = searchArr(i).Column
End If
Next i
End Sub
在您问题的代码中,您对工作表的所有单元格都使用了 Find 方法。正如@Gary 的 Student 的回答所示,您应该在与找到 Min.
的范围相同的范围内调用 Find 方法
此外,Find 方法有几个参数会有所不同,例如是否查找整数值、是否在公式内查找、是否查找特定格式。您可以在'net.
上轻松找到有关Find方法的信息。
这是我对您的代码的看法:
Sub MyAssignment()
Dim searchRange As Range
Dim minCell As Range
Dim minTime As Double
Dim minRow As Long
Dim minCol As Long
Set searchRange = ActiveSheet.Range("C5:L14")
minTime = WorksheetFunction.Min(searchRange)
Set minCell = searchRange.Find(minTime, searchRange.Cells(1), XlFindLookIn.xlValues, XlLookAt.xlWhole, MatchCase:=False, SearchFormat:=False)
minCell.Select
minRow = minCell.Row
minCol = minCell.Column
End Sub
从 VBA 调用 Find 方法时使用的参数将反映在从 Excel (Ctrl+F) 看到的“查找”对话框中。相反,更改 Excel 的“查找”对话框中的选项将影响下一个 VBA 的“查找”调用,因为您未提供给“查找”方法的参数将采用对话框中最后使用的值。
告诉我们结果如何。
我怀疑你的范围实际上包含时间。下面的代码将找到最早的时间(范围内的最低值)。
Private Sub MinTime()
Dim Rng As Range
Dim Mini As Range
Dim MiniValue As Double
Dim MinRow As Long, MinClm As Long
Set Rng = ActiveSheet.Range("C5:L14")
MiniValue = Application.Min(Rng)
With Rng
Set Mini = .Find(What:=MiniValue, _
After:=.Cells(1), _
LookIn:=xlFormulas, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False, _
MatchByte:=False)
End With
With Mini
MinRow = .Row
MinClm = .Column
End With
End Sub
诀窍是 LookIn:=xlFormulas
而不是默认的 xlValues
。您可以输入 12:00,但单元格的公式为 0.5。假设这是范围内的最小值,当您在值中查找 0.5 时,您将找不到它,因为单元格的 "value" 在这种情况下(微软的混淆,不是我做的)是“12:00”。因此,您必须将找到的最小值转换回字符串,例如“12:00”,或者您在公式中查找 0.5。
所以,我对 select 计算公式值的确切单元格有疑问。我是 VBA 的新手,我在互联网上搜索了至少 2 天以获得有价值的答案。在这里让我向您展示我试图放置的代码并解释它之后的作用;
Dim r As Range
MinTime = WorksheetFunction.Min(Range("C5:L14"))
Set r = ActiveSheet.Cells.Find(MinTime)
r.Select
MinRow = ActiveCell.Row
MinCol = ActiveCell.Column
所以我想做的是在 worksheetfunction.min 和 select 我刚刚找到的单元格的范围内找到最小数量。然后将行和列信息指向其他2个变量。但是这段代码并不总是有效。有时它工作得很好有时它没有,我现在一无所知。任何形式的帮助将不胜感激。已经谢谢了。
您甚至可以在不使用 WorksheetFunction 或 Find 函数的情况下执行此操作。创建一个数组然后循环遍历它是找到所需内容的一种相当简单的方法。试试这个
Sub findMin(ByVal minRange As Range)
Dim searchArr() As Range
ReDim searchArr(1 To minRange.Rows.Count * minRange.Columns.Count) As Range
Dim minVal As Double
Dim i As Integer, i2 As Integer, outputRow As Integer, outputColumn As Integer
For i2 = 0 To minRange.Columns.Count
For i = 0 To minRange.Rows.Count
searchArr(i + 1) = Cells(minRange.Row + i, minRange.Column + i2).Value
Next i
Next i2
minVal = searchArr(1).Value
For i = 1 To UBound(searchArr)
If searchArr(i).Value < minVal Then
minVal = searchArr(i).Value
outputRow = searchArr(i).Row
outputColumn = searchArr(i).Column
End If
Next i
End Sub
在您问题的代码中,您对工作表的所有单元格都使用了 Find 方法。正如@Gary 的 Student 的回答所示,您应该在与找到 Min.
的范围相同的范围内调用 Find 方法此外,Find 方法有几个参数会有所不同,例如是否查找整数值、是否在公式内查找、是否查找特定格式。您可以在'net.
上轻松找到有关Find方法的信息。这是我对您的代码的看法:
Sub MyAssignment()
Dim searchRange As Range
Dim minCell As Range
Dim minTime As Double
Dim minRow As Long
Dim minCol As Long
Set searchRange = ActiveSheet.Range("C5:L14")
minTime = WorksheetFunction.Min(searchRange)
Set minCell = searchRange.Find(minTime, searchRange.Cells(1), XlFindLookIn.xlValues, XlLookAt.xlWhole, MatchCase:=False, SearchFormat:=False)
minCell.Select
minRow = minCell.Row
minCol = minCell.Column
End Sub
从 VBA 调用 Find 方法时使用的参数将反映在从 Excel (Ctrl+F) 看到的“查找”对话框中。相反,更改 Excel 的“查找”对话框中的选项将影响下一个 VBA 的“查找”调用,因为您未提供给“查找”方法的参数将采用对话框中最后使用的值。
告诉我们结果如何。
我怀疑你的范围实际上包含时间。下面的代码将找到最早的时间(范围内的最低值)。
Private Sub MinTime()
Dim Rng As Range
Dim Mini As Range
Dim MiniValue As Double
Dim MinRow As Long, MinClm As Long
Set Rng = ActiveSheet.Range("C5:L14")
MiniValue = Application.Min(Rng)
With Rng
Set Mini = .Find(What:=MiniValue, _
After:=.Cells(1), _
LookIn:=xlFormulas, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False, _
MatchByte:=False)
End With
With Mini
MinRow = .Row
MinClm = .Column
End With
End Sub
诀窍是 LookIn:=xlFormulas
而不是默认的 xlValues
。您可以输入 12:00,但单元格的公式为 0.5。假设这是范围内的最小值,当您在值中查找 0.5 时,您将找不到它,因为单元格的 "value" 在这种情况下(微软的混淆,不是我做的)是“12:00”。因此,您必须将找到的最小值转换回字符串,例如“12:00”,或者您在公式中查找 0.5。