繁体   English   中英

在Excel VBA中选择变量的位置(作为单元格)

[英]Selecting Variable's Location (as Cell) in Excel VBA

因此,我对选择公式化值的确切单元格有疑问。 我对VBA真的很陌生,我在互联网上搜索了至少两天以找到有价值的答案。 在这里,让我向您展示代码,他们试图将其放入并解释其作用;

    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查找范围内的最小数量,然后选择我刚刚找到的单元格。 然后将行和列信息定向到其他2个变量。 但是此代码并不总是有效。 有时它工作得很好,有时却不行,我目前一无所知。 任何帮助将不胜感激。 已经谢谢你了

我怀疑您的范围实际上包含时间。 下面的代码将找到最早的时间(该范围内的最小值)。

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时,您将找不到它,因为在这种情况下该单元格的“值”(Microsoft感到困惑,不是我的所作所为)为“ 12:00”。 因此,您必须将找到的最小值转换回字符串,例如“ 12:00”,或者在公式中寻找0.5。

您甚至可以在不使用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学生的答案所示,您应该在与找到Min的范围相同的范围内调用Find方法。

另外,Find方法的几个参数会有所不同,例如是否查找整个值,是否在公式内查找,是否在查找特定格式。 您可以在网上轻松找到有关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的“查找”调用,因为未提供给“查找”方法的参数将采用对话框上最后使用的值。

让我们知道结果如何。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM