2017-11-03 340 views
0

所以,我有一个关于选择一个公式化值的确切单元格的问题。我真的是VBA的新手,我在网上搜索了至少2天的宝贵答案。在这里让我给你展示代码,试图说明它后来做了什么;在Excel中选择变量的位置(作为单元格)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 

因此,我试图做的是找到工作表functionfunction.min范围内的最小数量,并选择我刚刚找到的单元格。然后将行和列信息指向其他2个变量。但是这个代码并不总是在工作。有时候它有效,但它有时并不正确,而且我现在无能为力。任何形式的帮助,将不胜感激。谢谢你。

+0

你可怜的搜索者...你可以完全引用你的范围,例如:http://stackoverflow.com/questions/5215616/vba-cell-address-of-max – Gadziu

+0

ThisWorkbook.Worksheets(“Sheet1”)。范围...........你可能需要处理,如果没有找到值,因为r将不会是什么。您还在搜索整张表格,但只希望有一个匹配结果 – QHarr

+0

问题是,它有时会发现它在MinTime中找到的号码不相关的数字。可以说,Mintime找到了正确的号码(如11),但是当我使用Set r = activesheet.cells.find(MinTime)时,它发现(142.1254371)。我没有明白。 –

回答

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。

+0

工作就像一个魅力。你有我永恒的感谢之人。问题是当我的文本是时候寻找xlvalues。再次感谢你的帮助,祝好! –

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 
+0

我欣赏这个想法和你的努力。是的,它可能会像那样工作,但它的任务,所以我必须以一种特殊的方式做到这一点。我真的没有看到我的问题,这让我发疯,我试着在这里给出的每个答案,但你的答案太复杂,我和老师会立即明白。但是再次感谢你。 –

0

在你的问题的代码中,你在所有工作表单元上使用Find方法。正如@ Gary的学生答案所示,您应该在与您找到最小值的范围相同的范围内调用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中的查找方法在查找对话框镜像为从Excel(按Ctrl + F)观察时使用的参数。相反,在Excel的查找对话框中更改选项将影响您的下一个VBA的查找调用,因为您未提供给查找方法的参数将采用上次在该对话框中使用的值。

让我们知道结果如何。

+0

现在它说对象变量或块变量未设置。我现在明白了你的观点,我会在网上检查find方法,谢谢btw。让我知道如果你发现什么错误的错误:)我可以告诉你完整的代码,如果你intrested只是从Facebook发送友谊。 –

+0

您是否逐字复制并粘贴了我的代码?我在这里运行它,它工作正常。也请总是说_where_任何代码失败。 – Excelosaurus

+0

是的,我复制并粘贴它,并更改变量名称以适合我自己的。 它在minCell.Select处给出错误。因为当上面的代码完成时,minCell等于0。 –