Поиск листа с определенным значением в определенной ячейке (Microsoft Excel)
У Келли есть рабочая тетрадь, содержащая сотни рабочих листов. Каждый рабочий лист представляет собой индивидуальный проект для ее компании. Ячейка C4 каждого рабочего листа содержит номер проекта для этого конкретного проекта.
Найти отдельные проекты из сотен в рабочей тетради в лучшем случае обременительно. Она задается вопросом, можно ли создать макрос, который позволил бы всем пользователям вводить номер задания, находить лист с этим номером задания в ячейке C4, а затем отображать этот лист.
Прежде чем решать, как это сделать в макросе, вы должны понимать, что вы можете найти нужный проект с помощью собственных инструментов Excel.
Все, что вам нужно сделать, это выполнить следующие действия:
-
Нажмите Ctrl + F. В Excel отображается вкладка «Найти» диалогового окна «Найти и заменить».
-
Нажмите кнопку «Параметры», чтобы развернуть диалоговое окно. (См. Рис. 1.)
-
В раскрывающемся списке «Внутри» выберите «Рабочая книга».
-
Если ячейка C4 на каждом листе содержит только номер проекта, установите флажок «Соответствовать содержимому всей ячейки».
-
Щелкните «Найти далее».
Это оно; вы должны перейти к первому экземпляру ячейки, которая содержит номер вашего проекта. Если ваша книга содержит номера проектов в нескольких ячейках (кроме ячейки C4), то использование инструмента «Найти» может быть немного утомительным; вам нужно будет нажимать кнопку «Найти далее», пока не найдете нужный лист. В такой ситуации макрос может быть лучшим решением, потому что он позволяет вам специально смотреть на ячейку C4 и игнорировать все, что находится в любой другой ячейке.
Следующий макрос предлагает пользователю ввести номер проекта. Затем он ищет на каждом листе книги первый лист, в котором ячейка C4 содержит этот номер проекта. В случае обнаружения макрос отображает рабочий лист и активирует ячейку. Если не найден, отображается соответствующее сообщение.
Sub FindProject1() Dim wks As Worksheet Dim sCell As String Dim sProj As String sCell = "C4" 'cell with Project number sProj = InputBox("What Project are you looking for?") For Each wks In Worksheets If wks.Range(sCell) = sProj Then wks.Activate wks.Range(sCell).Activate MsgBox ("Project '" & sProj & "' is in:" & vbCrLf & wks.Name) Exit Sub End If Next wks MsgBox ("Project is not found") End Sub
У этого макроса есть две потенциальные проблемы. Во-первых, если номер вашего проекта на самом деле является числом, макрос может не найти его при поиске текстовых строк. Во-вторых, если существует несколько листов с одним и тем же номером проекта, вы никогда не узнаете этого, потому что макрос всегда останавливается на листе с первым совпадающим номером проекта в ячейке C4. Вы можете решить обе эти проблемы, внеся пару изменений в макрос.
Sub FindProject2() Dim wks As Worksheet Dim sCell As String Dim sProj As String Dim vSheets As New Collection Dim sTemp As String sCell = "C4" 'cell with Project number sProj = InputBox("What Project are you looking for?") For Each wks In Worksheets If wks.Range(sCell).Value = sProj Or _ wks.Range(sCell).Value = Val(sProj) Or _ wks.Range(sCell).Text = sProj Then vSheets.Add wks End If Next wks Select Case vSheets.Count Case 0 sTemp = "Project " & sProj & " was not found " sTemp = sTemp & "in this workbook." MsgBox sTemp Case 1 wks.Activate wks.Range(sCell).Activate Case Else sTemp = "Project " & sProj & " was found on more " sTemp = sTemp & "than one sheet:" & vbCrLf For Each wks In vSheets sTemp = sTemp & wks.Name & vbCrLf Next wks MsgBox sTemp End Select End Sub
В этой версии макроса рабочий лист проекта отображается только в том случае, если номер проекта уникален среди всех листов. Если есть несколько экземпляров, в которых номер проекта совпадает, вы получите уведомление об имени этих листов, но лист не выбран.
При желании вы можете значительно упростить макрос, переименовав все свои рабочие листы в номер проекта. Это также имело бы дополнительное преимущество, гарантируя, что ни один проект не использует два рабочих листа. (Все имена рабочих листов должны быть уникальными, поэтому, если каждый рабочий лист использует номер проекта в качестве имени, у вас может быть только один рабочий лист на номер проекта.) Если вы воспользуетесь этим подходом, вы можете использовать макрос, подобный следующему, для поиска и перехода на желаемый рабочий лист:
Sub FindProject3() On Error GoTo ErrorHandler Sheets(InputBox("Enter Project Number:")).Activate Exit Sub ErrorHandler: MsgBox "No such Project" End Sub
ExcelTips — ваш источник экономичного обучения Microsoft Excel.
Этот совет (13489) применим к Microsoft Excel 2007, 2010, 2013 и 2016.