2017-11-03 338 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。 –