如果阻塞和块混淆

时间:2014-03-28 06:20:00

标签: vba excel-vba excel

我有这个代码工作,然后尝试添加一个循环,来处理几张,我失败了,所以试图回到原始版本,现在我也无法使其工作。 我已经尝试过evere迭代,我可以看到在哪里放入with / end和if / end if但是现在我迷路了。 谁能看到我做错了什么?

Sub Applyfilter()
  Dim ws As Worksheet
  Dim LastRowColA As Long
  Dim sCell As Range, lstCell As Range, filterRng As Range
  Dim i As Integer

  Set ws = ThisWorkbook.Sheets("OPT 1 Total")

  With ws
    Set sCell = .Cells.Find(What:="WFE", LookAt:=xlWhole)

    If Not sCell Is Nothing Then
       Set lstCell = .Cells(.Rows.Count, sCell.Column).End(xlUp)

       If lstCell.Row > 1 Then
         'Debug.Print sCell, lstCell
  End With

  Range("A1").Select
  Selection.End(xlToRight).Select ' select all cols from A to last populated
  Selection.AutoFilter
  ActiveSheet.AutoFilter.Sort.SortFields.Clear

  ActiveSheet.AutoFilter.Sort.SortFields.Add Key:= _
     Range(sCell, lstCell), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption _
     :=xlSortNormal

  With ActiveSheet.AutoFilter.Sort
     .Header = xlYes
     .MatchCase = False
     .Orientation = xlTopToBottom
     .SortMethod = xlPinYin
     .Apply
  End With

  End If

  End If

  Set filterRng = Range("A2").CurrentRegion
  i = Application.WorksheetFunction.Match("WFE", Range("A1:AZ1"), 0)

  'Set filter to only look for WFE greater than 0.5
  filterRng.AutoFilter Field:=i, Criteria1:=">=0.5" _
     , Operator:=xlAnd

  End If
End Sub

1 个答案:

答案 0 :(得分:0)

这应该可以恢复并运行原始代码。你的End WithEnd If有点乱了。

Sub Applyfilter()
  Dim ws As Worksheet
  Dim LastRowColA As Long
  Dim sCell As Range, lstCell As Range, filterRng As Range
  Dim i As Integer

  Set ws = ThisWorkbook.Sheets("OPT 1 Total")

  With ws
    Set sCell = .Cells.Find(What:="WFE", LookAt:=xlWhole)

    If Not sCell Is Nothing Then
      Set lstCell = .Cells(.Rows.Count, sCell.Column).End(xlUp)

      If lstCell.Row > 1 Then
            'Debug.Print sCell, lstCell
      End If

      Range("A1").Select
      Selection.End(xlToRight).Select ' select all cols from A to last populated
      Selection.AutoFilter
      ActiveSheet.AutoFilter.Sort.SortFields.Clear

      ActiveSheet.AutoFilter.Sort.SortFields.Add Key:= _
         Range(sCell, lstCell), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption _
         :=xlSortNormal

    End If
  End With

  With ActiveSheet.AutoFilter.Sort
     .Header = xlYes
     .MatchCase = False
     .Orientation = xlTopToBottom
     .SortMethod = xlPinYin
     .Apply
  End With

  Set filterRng = Range("A2").CurrentRegion
  i = Application.Match("WFE", Range("A1:AZ1"), 0)

  'Set filter to only look for WFE greater than 0.5
  filterRng.AutoFilter Field:=i, Criteria1:=">=0.5" _
     , Operator:=xlAnd
End Sub

现在,要遍历每个工作表,请尝试使用此块包装代码:(将工作表名称更改为所需的工作表以进行循环)

For Each ws In Sheets(Array("OPT 1 Total", "Sheet2", "Sheet3"))
   'your code to loop here
Next

完整代码:(将工作表名称更改为要循环的所需工作表)

Sub ApplyfilterLoop()
    Dim ws As Worksheet
    Dim LastRowColA As Long
    Dim sCell As Range, lstCell As Range, filterRng As Range
    Dim i As Integer

    For Each ws In Sheets(Array("OPT 1 Total", "Sheet2"))
        With ws
          Set sCell = .Cells.Find(What:="WFE", LookAt:=xlWhole)

          If Not sCell Is Nothing Then
            Set lstCell = .Cells(.Rows.Count, sCell.Column).End(xlUp)

            If lstCell.Row > 1 Then
                  'Debug.Print sCell, lstCell
            End If

            ws.Activate
            ws.Range("A1").Select
            Selection.End(xlToRight).Select ' select all cols from A to last populated
            Selection.AutoFilter
            ws.AutoFilter.Sort.SortFields.Clear

            ws.AutoFilter.Sort.SortFields.Add Key:= _
               Range(sCell, lstCell), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption _
               :=xlSortNormal

          End If
        End With

        With ws.AutoFilter.Sort
           .Header = xlYes
           .MatchCase = False
           .Orientation = xlTopToBottom
           .SortMethod = xlPinYin
           .Apply
        End With

        Set filterRng = ws.Range("A2").CurrentRegion
        i = Application.Match("WFE", ws.Range("A1:AZ1"), 0)

        'Set filter to only look for WFE greater than 0.5
        filterRng.AutoFilter Field:=i, Criteria1:=">=0.5", Operator:=xlAnd
    Next
End Sub