• 締切済み

VBA 氏名または登録番号で検索し、別シートへ表示

現在下記を使用して期間を検索しています。 Sub ボタン8_Click() Dim CopySheet As Worksheet, PasteSheet As Worksheet, _ ItemRow As Long, LastRow As Long, PasteCell As Range, _ CopyColumn As String, UnwantedColumn As String, _ StartDay As Variant, LastDay As Variant, _ StartDayCell As Range, LastDayCell As Range Set CopySheet = Sheets("Sheet1") Set PasteSheet = Sheets("Sheet2") CopyColumn = "A:BQ" UnwantedColumn = "I:BP" ReferenceColumn = "BQ" ItemRow = 2 Set PasteCell = PasteSheet.Range("A7") Set StartDayCell = PasteSheet.Range("A2") Set LastDayCell = PasteSheet.Range("B2") StartDay = StartDayCell.Value LastDay = LastDayCell.Value If StartDay = "" Or LastDay = "" Then MsgBox "期間が設定されておりません。", vbExclamation, "期間未設定" Exit Sub ElseIf StartDay > LastDay Or Not (IsDate(StartDay) And IsDate(LastDay)) Then MsgBox "期間の設定が不適切です。", vbExclamation, "無効な設定値" Exit Sub End If LastRow = CopySheet.Range(ReferenceColumn & Rows.Count).End(xlUp).Row If LastRow <= ItemRow Or WorksheetFunction. _ CountIfs(CopySheet.Range(ReferenceColumn & ItemRow & ":" & ReferenceColumn & LastRow), ">=" _ & StartDay, CopySheet.Range(ReferenceColumn & ItemRow & ":" & ReferenceColumn & LastRow), _ "<" & LastDay + 1) = 0 Then MsgBox "抽出すべきデータがありません。", vbInformation, "データ無し" Exit Sub End If Application.ScreenUpdating = False With CopySheet If .AutoFilterMode Then CopySheet.Cells.AutoFilter .Columns(UnwantedColumn).EntireColumn.Hidden = True .Range(ReferenceColumn & ItemRow & ":" & ReferenceColumn & LastRow). _ AutoFilter Field:=1, Criteria1:=">=" & Int(StartDay), Criteria2:="<" & Int(LastDay) + 1 Intersect(.Columns(CopyColumn), .Rows(ItemRow & ":" & LastRow)).SpecialCells(xlCellTypeVisible).Copy PasteCell.PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False Cells.AutoFilter .Columns(UnwantedColumn).EntireColumn.Hidden = False End With Application.ScreenUpdating = True End Sub Private Sub Worksheet_Activate() Range("A1").Select Selection.AutoFilter Selection.AutoFilter End Sub これを応用して「登録番号」または「氏名」で検索が出来るようにしたいのですが、 どのようにモジュールを設定すれば良いでしょうか? 「登録番号」は元データのシート(sheet1)の7列目(G列)、「氏名」は4列目(D列)に入力されており、検索の入力は「登録番号」がSheet2のA4のセル、「氏名」はB4のセルに入力し、検索結果のデータの表示は日付検索と同様のI:BP列を除くA:BQを表示したいと思います。 宜しくお願いします。

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

質問者はどんな立場(会社の、同僚のために作らざるを得ないとか。またはVBAの経験や技量はどうなのですか)でこういうVBAを組んでいるのですか。 長いコード例を挙げて、張り付けて質問しているが、このコードは自分で作ったものですか。誰ともわからぬ、他人が作ったVBAコードをコピペしただけではないのですか。 作ったのであれば >登録番号」または「氏名」で検索が出来るようにしたいのですが はすぐわかるはず。 自分のために自分で作るなら、こんなにDimなどを丁寧に書かないはず。正統な方法化もしれないが、冗長すぎる様に思う。回答者に読ませないこと、質問の表現としても冗長です。そのため質問者が要点を見失っているのでは。 >検索が出来るようにしたいのですが 「検索」はエクセルVBAではFindなどで行います。 ここでやりたいのは、(条件による)「抜出し」というべきでしょう。 だから、後半で言う質問課題も、同じくFilterでできます。 >登録番号」または「氏名」で検索が出来るよう 両方を問題にするケースは考えなくてよいと思うので、登録番号を指定して「抜出し」や、氏名を指定して「抜出し」をする(したい)ということだと思う。 何もむつかしいことはないではないか。 >AutoFilter Field:=1, のField:は 登録番号で抜き出す場合は7、氏名で抜き出す場合は4でしょう。 Criteria1:⁼は、登録番号での抜出の場合は、登録番号の入った変数名(セル名でもよい)、氏名での抜出の場合は、氏名の入った変数名(セルでもよい)を指定します。 ーー その際、長年質問を見ていると、初心者でも恰好よくしたい人が多く、Userformのコントロール(テキストボックスなど)に、登録番号や氏名を入力させたいという人が多いようで、その方面の勉強と経験が必要。 >検索結果のデータの表示は日付検索と同様のI:BP列を除くA:BQを表示したいと思います。 抜出結果を別シートに出して、BP列を削除するだけのことでは。 ーー 全般に、ここへ質問する前に。「エクセルvba データの抽出」ででも「VBA Autofilter 」ででもGoogle照会すべきです。そして自力でやることを目指してください。 http://officetanaka.net/excel/vba/db/db03.htm ほか多数の例が出てきます。 これらでうまく行かないなら、論点(うまく行かない点)を絞って質問すべきです。