2016-11-29 66 views
-2

希望有人可以提供幫助,我有一張表,我需要設置一個動態範圍,然後執行一個循環函數,對正確的變量填充計算結果。設置基於範圍的內容位置

比如我有標題的列表

運營商名稱 - 回合計數 - 成本

鮑勃

特德

弗雷德

對於上面的例子,我想找到運算符名稱並將其設置爲起始範圍,然後選擇 - 結束(xlToRight)&結束(xlDown)然後我的當前代碼l oops通過所有運營商名稱(Bob,Ted & Fred),並根據計算的內容在Round Count和Cost中輸入值。

我遇到的問題是第一個單元格可能並不總是處於相同的位置,例如一張紙上的操作員姓名可能在單元格F100和下一個F134中。我正在考慮做一個查找並將其設置爲起始單元格,但操作員名稱會在整個表格中出現多次。

任何人都有類似的問題,他們已經解決或可以有人建議的東西?

+1

多少次運營商名稱出現?你怎麼知道哪一個是正確的? – bobajob

+0

4次,我只知道它旁邊的其他標題,一個是成本彙總,一個是生產力彙總,另一個是數據。 –

回答

0

通過,發現的「運營商名稱」的所有實例,直到它找到一個與下面將循環「成本「右邊兩個單元格:

Sub test3() 
    Dim found As Boolean 
    found = False 
    Dim testRange As Range 
    Set testRange = ActiveSheet.Range("A1") 
    Do While Not found 
     Set testRange = ActiveSheet.UsedRange.Find(What:="Operator Name", After:=testRange, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlRows, SearchDirection:=xlNext) 
     If testRange.Offset(0, 2).Value = "Cost" Then 
      found = True 
     End If 
    Loop 
End Sub 
+0

該公式正在尋找操作員名稱,但它沒有給我單元地址來繼續設置動態範圍。任何幫助? –

+1

正如你在問題中所說的那樣:'Range(testRange,testRange.End(xlToRight).End(xlDown))。Select'在循環之後會選擇你想要的範圍。 – bobajob

+0

現在工作完美,謝謝。 –

-1

您可以使用find來自上而下搜索或自下而上搜索。

此代碼將從頂部搜索欄F中的「操作員名稱」並下降。

Columns("F").Find(what:="Operator Name", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlRows, SearchDirection:=xlNext).Address 

此代碼將從底部搜索欄F中的「操作員名稱」並上移。

Columns("F").Find(what:="Operator Name", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlRows, SearchDirection:=xlPrevious).Address 

它們都返回地址($ F $ 1),你可以改變它(1)通過改變.Address如果你想要的,而不是返回行.Row

+0

這可能有用,謝謝我會試一試。 –

+0

如果您需要,還可以將其修改爲在特定單元格後啓動。如果沒有任何內容出現,上述內容將會出錯,因此您可能需要一些錯誤處理。 – tjb1

-1

可以遍歷每個行和運行取決於價值IF,如

For i = 1 to Sheets(1).Range("A" & Rows.Count).End(xlUp).Row 
    If Cells(i, 1).Value = "Bob" Then 
     'do something with bob 
    Else If Cells(i, 1).Value = "Ted" Then 
     'do something with ted 
    Else If Cells(i, 1).Value = "Fred" Then 
     'do something with fred 
    Else 
     MsgBox "My example on Stackoverflow had incorrect names" 
    End If 
Next i 
+0

如果操作員名稱的功能在摘要上方的數據中出現多次(約10-15)次,則摘要將執行一次計數。我只想在一箇中心位置做。 –

+0

我理解了這個問題,因爲您需要在每行找到操作員名稱的位置放入特定計算。 –

-1

試試這個功能。它檢查所有表格,您的文本可以在列F或其他列中。

Public Function subFindText(FindString As String, inSheet As String) As Range 

    Dim rowNb As Integer, ws As Worksheet 

    Set ws = ThisWorkbook.Worksheets(inSheet) 
    rowNb = ws.UsedRange.Rows.Count 

    If Trim(FindString) <> "" Then 
     With Sheets(inSheet).Cells  ''Check in all the sheet 
      Set subFindText = .Find(What:=FindString, _ 
          After:=.Cells(rowNb), _ 
          LookIn:=xlValues, _ 
          LookAt:=xlWhole, _ 
          SearchOrder:=xlByRows, _ 
          SearchDirection:=xlNext, _ 
          MatchCase:=False) 
     End With 
    End If 

End Function 

如果你測試:

Sub test() 
    Dim r As Range 
    Set r = subFindText("Operator Name ", "yourSheetName") 
    MsgBox r.Row & " " & r.Column 

End Sub 
-1

所以你有四個「運營商名稱」,然後使用FindNext中,並讓他們在一個數組:

Sub test() 
    Dim r As Range 
    Dim FindRange As Range 
    Dim FirstFound As String 
    Dim ws As Worksheet 
    Dim arrRng(4, 2) As Integer, i As Integer 

    Set ws = ThisWorkbook.Worksheets("yourWorkSheet") 

    Set FindRange = ws.Cells.Find(What:="Operator Name", _ 
      After:=ws.Cells(1, 1), _ 
      LookIn:=xlValues, _ 
      LookAt:=xlPart, _ 
      SearchOrder:=xlByRows, _ 
      SearchDirection:=xlNext, _ 
      MatchCase:=False, _ 
      SearchFormat:=False) 
     If Not FindRange Is Nothing Then 
      FirstFound = FindRange.Address 
      i = 1 
      Do 
       arrRng(i, 1) = FindRange.Row 
       arrRng(i, 2) = FindRange.Column 
       ' find next instance 
       Set FindRange = ws.Cells.FindNext(After:=FindRange) 
       i = i + 1 
       Loop Until FirstFound = FindRange.Address 
     End If 

End Sub