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

时间:2017-11-03 22:35:18

标签: vba excel-vba variables select location

所以,我有一个关于选择配方值的确切单元格的问题。我对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

所以我想做的是找到workheetfunction.min范围内的最小数字,然后选择我刚刚找到的单元格。然后将行和列信息指向其他2变量。但是这段代码总是不起作用。有时它工作得很好有时它不会,我此刻无能为力。任何形式的帮助将不胜感激。谢谢你。

3 个答案:

答案 0 :(得分:1)

我怀疑你的范围实际上是包含时间。下面的代码将找到最早的时间(范围中的最低值)。

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时,你不会找到它,因为单元格的值"值"在这种情况下(微软的困惑,而不是我的行为)是" 12:00"。因此,您必须将找到的最小值转换为字符串,例如" 12:00",或者在公式中查找0.5。

答案 1 :(得分:0)

您甚至可以在不使用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

答案 2 :(得分:0)

在您的问题代码中,您在所有工作表的单元格中使用了Find方法。正如@ Gary的学生答案所示,您应该在与您找到Min的范围相同的范围内调用Find方法。

此外,Find方法有几个参数会产生影响,例如查找整个值,是否在公式内查找,寻找特定格式。您可以在&#39; 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

从Excel中调用Find方法时使用的参数将在Excel(Ctrl + F)中的“查找”对话框中进行镜像。相反,在Excel的“查找”对话框中更改选项会影响下一个VBA的查找调用,因为您不提供给Find方法的参数将采用上次在对话框中使用的值。

让我们知道结果如何。