特定のセルで特定の値を持つワークシートを検索する(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
このマクロには2つの潜在的な問題があります。まず、プロジェクト番号が実際に番号である場合、マクロはテキスト文字列を検索するときにそれを見つけられない可能性があります。次に、同じプロジェクト番号を使用するワークシートが複数ある場合、マクロは常にセル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
このバージョンのマクロでは、プロジェクト番号がすべてのワークシートの中で一意である場合にのみ、プロジェクトワークシートが表示されます。プロジェクト番号が同じであるインスタンスが複数ある場合、それらのワークシートの名前が通知されますが、ワークシートは選択されていません。
必要に応じて、すべてのワークシートの名前をプロジェクト番号に変更することで、マクロをはるかに簡単にすることができます。これには、プロジェクトが実際に2つのワークシートを使用しないようにするという追加の利点もあります。 (すべてのワークシート名は一意である必要があるため、各ワークシートでプロジェクト番号を使用する場合、プロジェクト番号ごとに1つのワークシートしか持てません。)このアプローチを採用する場合は、次のようなマクロを使用して検索してジャンプできます。目的のワークシートへ:
Sub FindProject3() On Error GoTo ErrorHandler Sheets(InputBox("Enter Project Number:")).Activate Exit Sub ErrorHandler: MsgBox "No such Project" End Sub
_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。
このヒント(13489)は、Microsoft Excel 2007、2010、2013、および2016に適用されます。