创建一个将搜索工作簿并执行if then else的宏

时间:2016-07-06 20:09:56

标签: excel vba excel-vba macros

我一直在努力研究一个我无法得到的宏。

我希望宏在使用if then代码时搜索工作簿中的所有工作表。

我希望if然后在范围C8中搜索值“no”,如果为true,我希望它返回工作表的名称。

这就是我现在所拥有的,但它不起作用。

With wsAddPatient

For Each ws In Active.Workbook.Worksheets

        If ws.Visible = xlSheetVisible And Range("C8") = "No" Then
            .Cells(8, 2).Value = ws.Name

       End If

使用Dave的代码进行更新:

Sub NeedVolunteer() 
    Set wsAddPatient = ThisWorkbook.Worksheets("Add Patient")      
    With wsAddPatient 
        For Each ws In ActiveWorkbook.Worksheets 
            If ws.range("C8").Value = "No" Then
                .Cells(8, 2).Value = .Cells(8, 2).Value & ws.Name & ";" 
            End If 
        Next 
    End With 
End Sub

这有效!

决赛:

Sub NeedVolunteer()
    Set wsAddPatient = ThisWorkbook.Worksheets("Add Patient")
    Dim ws As Worksheet
    Dim lRow As Long
    iRow = 8
    With wsAddPatient
        For Each ws In ActiveWorkbook.Worksheets
            If ws.Range("C8").Value = "No" Then
                .Cells(iRow, 2).Value = ws.Name
                iRow = iRow + 1
        End If
     Next
 End With
End Sub

3 个答案:

答案 0 :(得分:0)

也许

Dim wsNumber as String
Dim i as Integer

   For i = 1 to 10 'change 10 to the Number of Sheets you want to check
      wsNumber = "Sheet" & i
      If Worksheets(wsNumber).Range("C8") = "no" then
         Worksheets("Sheet1").Range("B8") = wsNumber
      End If
   Next i

这将返回工作表的名称" no"已经找到了。为了保持简单,我只是在Sheet1的单元格B8中返回它,如果你想在Sheet上返回名称" no"已被发现使用:Worksheets(wsnumber).range("B8") = wsNumber代替Worksheets("Sheet1").Range("B8") = wsNumber

<强> ADDED

For Each ws In ActiveWorkbook.Worksheets
    If ws.Range("C8") = "no" Then
        ws.Range("B8") = ws.Name
    End If
Next

答案 1 :(得分:0)

你关闭了,只是遗漏了一些代码。试一试:

For Each ws In ActiveWorkbook.Worksheets
    If ws.Visible = xlSheetVisible And Range("C8") = "No" Then
        ws.Cells(8, 2).Value = ws.Name
   End If
Next ws

答案 2 :(得分:0)

With wsAddPatient
    For Each ws In ActiveWorkbook.Worksheets
        If ws.Visible = xlSheetVisible And ws.Range("C8") = "No" Then
            .Cells(8, 2).Value = ws.Name
       End If
    Next
End With

如果您未指定range("C8")属于工作表,则会使用activesheet - 因为您似乎没有更改工作表,这意味着您始终在检查同一个地方。这应该为您排序问题,并将C8中任何带有“否”的工作表的名称放入wsAddPatient.Cells(8,2)

请记住,如果有多个具有此值的工作表,您将覆盖以前的任何结果。考虑改变

.Cells(8,2).Value = ws.Name

.Cells(8,2).Value = .Cells(8,2).Value & ws.Name & ";"

这将在单元格中留下一个尾随的分号,但是在工作簿中符合您条件的工作表名称的完整列表。