2016-11-29 65 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