• 締切済み

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/17068)
回答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 ほか多数の例が出てきます。 これらでうまく行かないなら、論点(うまく行かない点)を絞って質問すべきです。

関連するQ&A

  • VBA マクロ シート 転記

    はじめまして。VBA初心者です。今シート1のA列1行目セルにA社、A列2行目にB社、A列3行目にC社と・・ざっと1000行程あり、それぞれB列には値があります。この値をシート2のB列に転記したいと思っています。ただ、毎月シートを追加していきますので、左隣のシートから転記しなければなりません。シート2の項目は同じA列とB列で構成されています。A列の値が多少前後するので、FINDを使って以下のようなプログラムを作りました。ただ、左隣のシートから転記とう内容をどうやって追加したら良いのかがわかりません。Previous をどこかに使えばできるのかなとも思うのですが、その方法がわかりません。 Sub 転記() Dim ws As Worksheet, ws1 As Worksheet, r As Range, r1 As Range Dim LastRow As Long, i As Long, er As Long, wkey As String Set ws = Worksheets("Sheet1") Set ws1 = Worksheets("Sheet2") LastRow = ws.Range("A1").End(xlDown).Row er = ws1.Range("A1").End(xlDown).Row Set r = ws.Range("A1:A" & LastRow) For i = 1 To er wkey = ws1.Range("A" & i) Set r1 = r.Find(What:=wkey, LookIn:=xlValues, LookAt:=xlWhole) If Not r1 Is Nothing Then ws1.Range("B" & i) = r1.Offset(, 1) End If Next Set r1 = Nothing Set r = Nothing Set ws = Nothing Set ws1 = Nothing End Sub どなたか詳しいお方いらっしゃいましたら、初心者の私に教えて頂けませんでしょうか?宜しくお願いします。

  • VBA 検索するSheetの位置の変更

    現在、グループの数だけユーザー名の合計数をSheet2に抽出するという 事をやっているのですが....... コードの方は下記になります Sub Sample3() Dim i As Long, j As Long, k As Long, lastRow As Long, lastCol As Long Dim wS2 As Worksheet, wS3 As Worksheet Set wS2 = Worksheets("Sheet1") Set wS3 = Worksheets("Sheet2") Application.ScreenUpdating = False If wS2.Range("Y1") = "" Then wS2.Range("Y1") = "ダミー" End If With Worksheets("Sheet1") If .Range("A4") = "" Then .Range("A4") = "ダミー" End If lastRow = .Cells(Rows.Count, "B").End(xlUp).Row Range(.Cells(5, "B"), .Cells(lastRow, "B")).AdvancedFilter Action:=xlFilterCopy, copytorange:=wS3.Range("A1"), unique:=True '★ For i = 2 To wS3.Cells(Rows.Count, "A").End(xlUp).Row wS2.Cells(7, (i - 2) * 8 + 3) = wS3.Cells(i, "A") .Range("A4").AutoFilter field:=2, Criteria1:=wS3.Cells(i, "A") Range(.Cells(5, "AA"), .Cells(lastRow, "AA")).SpecialCells(xlCellTypeVisible).Copy wS2.Cells(7, (i - 2) * 8 + 2) For k = wS2.Cells(Rows.Count, (i - 2) * 8 + 2).End(xlUp).Row To 7 Step -1 wS2.Cells(k, (i - 2) * 8 + 3) = WorksheetFunction.CountIfs(.Range("AA:AA"), wS2.Cells(k, (i - 2) * 8 + 2), .Range("B:B"), _ wS2.Cells(7, (i - 2) * 8 + 3)) If WorksheetFunction.CountIf(wS2.Columns((i - 2) * 8 + 2), wS2.Cells(k, (i - 2) * 8 + 2)) > 1 Then wS2.Cells(k, (i - 2) * 8 + 2).Resize(, 2).Delete shift:=xlUp End If Next k Next i wS2.Range("B1").CurrentRegion.Borders.LineStyle = xlContinuous wS2.Cells.Replace what:="ダミー", replacement:="", lookat:=xlWhole .Cells.Replace what:="ダミー", replacement:="", lookat:=xlWhole wS3.Cells.Clear .AutoFilterMode = False End With Application.ScreenUpdating = True End Sub このコードで検索をかけるSheet1のセルBの文字をセルCに移動して検索かけたいという事なのですが、下記の用なコードでBをCに変更してみた結果エラーが発生してしまいます。 lastRow = .Cells(Rows.Count, "C").End(xlUp).Row Range(.Cells(5, "C"), .Cells(lastRow, "C")).AdvancedFilter Action:=xlFilterCopy, copytorange:=wS3.Range("A1"), unique:=True '★ For i = 2 To wS3.Cells(Rows.Count, "A").End(xlUp).Row wS2.Cells(7, (i - 2) * 8 + 3) = wS3.Cells(i, "A") .Range("A4").AutoFilter field:=2, Criteria1:=wS3.Cells(i, "A") Range(.Cells(5, "AA"), .Cells(lastRow, "AA")).SpecialCells(xlCellTypeVisible).Copy wS2.Cells(7, (i - 2) * 8 + 2) For k = wS2.Cells(Rows.Count, (i - 2) * 8 + 2).End(xlUp).Row To 7 Step -1 wS2.Cells(k, (i - 2) * 8 + 3) = WorksheetFunction.CountIfs(.Range("AA:AA"), wS2.Cells(k, (i - 2) * 8 + 2), .Range("C:C"), _ どなたかご教授の方お願い致します。

  • VBA 検索して一致したセルへジャンプさせたい

    Excelにて、シート1のA列とシート2のA列のデータにNoを入れます。 シート1のA列のNoをクリックすると、シート2のA列の同じNoにジャンプするマクロを組みたいです。 現在組んでいるマクロは、 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim Sht As Worksheet Dim Rng1 As Range Dim Rng2 As Range Dim FindCell As Range Set Sht = Worksheets("シート2") Set Rng1 = Range("A2:A100") Set Rng2 = Sht.Range("A2:A100")If Intersect(Target, Rng1) Is Nothing Then Exit Sub If Target.Count > 1 Then Exit Sub Set FindCell = Rng2.Find(Target.Value) If Not FindCell Is Nothing Then Application.Goto Reference:=FindCell, Scroll:=False End If End Sub です。 一応マクロは実行されますが、そうすると、シート1のA列の編集(Noを追加したり変更したり・・・)できません。 編集や変更もできて、検索マクロも実行できるというマクロの組み方はありますでしょうか?

  • Excel VBAで文字列の部分一致の文字列を表示

    以前、こちらで頭5文字までの一致で文字列を表示するVBAを教えて頂きました。今回はFINDなどの部分一致での文字列を表示することをしたいのですが、ご教示いただけますと幸いです。 下記はSheet1のA3に文字を5文字以内いれるとSheet2のC列からピックアップしてSheet1のA列に文字列を表示する及びSheet2のB列のデータをSheet1のC列に表示させるVBAです。 Sub Test2() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim SData As String, i As Long, VRet As Variant Dim c As Range, LastRow As Long Set Ws1 = Sheets("Sheet1") Set Ws2 = Sheets("Sheet2") SData = CStr(Ws1.Range("A3").Value) If SData = "" Then Exit Sub i = 5 LastRow = Ws1.Cells(Rows.Count, "A").End(xlUp).Row If LastRow < i Then LastRow = i End If Ws1.Range(Ws1.Cells(i, "A"), Ws1.Cells(LastRow, "C")).ClearContents With Ws2 For Each c In .Range(.Cells(1, "C"), .Cells(Rows.Count, "C").End(xlUp)) VRet = InStr(1, CStr(c.Value), SData, vbTextCompare) If VRet = 1 And Len(c.Value) >= 10 Then Ws1.Cells(i, "A").Resize(1, 2).Value = c.Resize(1, 2).Value 'とりあえずSheet2のB列のデータ(C列のデータに同期したデータ)をSheet1のC列に Ws1.Cells(i, "C").Value = .Cells(c.Row, "B").Value i = i + 1 End If Next End With End Sub 宜しくお願い致します。

  • シート1の氏名をシート2に反映

    sheet1の氏名をsheet2の日付、記号(A,B,C)にマッチした位置に入力させたいのですが下記コードで他で試したのですがうまくいきません。どなたかコードが解る方よろしくお願いします。 Sub 入力() Dim i As Long, j As Long, k As Long, L As Long Dim wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") i = wS2.Range(wS2.Cells(6, 1), wS2.Cells(8, 1)) j = wS2.Cells(3, Columns.Count).End(xlToLeft).Column Range(wS2.Cells(3, 2), wS2.Cells(i, j)).ClearContents On Error Resume Next For i = 2 To wS1.Cells(Rows.Count, 4).End(xlUp).Row If WorksheetFunction.CountA(wS1.Rows(i)) > 1 Then For j = 2 To wS1.Cells(i, Columns.Count).End(xlToLeft).Column If wS1.Cells(i, j) <> "" Then k = WorksheetFunction.Match(wS1.Cells(i, 4), wS2.Range(wS2.Cells(6, 1), wS2.Cells(8, 1)), False) L = WorksheetFunction.Match(wS1.Cells(5, j), wS2.Rows(3), False) wS2.Cells(k, L) = wS1.Cells(i, j) End If Next j End If Next i End Sub

  • VBAで条件が一致する行のデータを別シートに抽出で…

    QNo.4034421『VBAで条件が一致する行のデータを別シートに抽出』の続きになります。 下記のような記述を前回ご教授賜っていたのですが、Keywrd"a"が無い場合、SubステートメントからExitではなく、 "Sheet2の"A387"の列を空白にしたまま次のプログラムに移行するように"Else"を使用して記述してみたのですが、上手くいきません。 ご教授願えませんでしょうか。 Dim Keywrd As String Dim TargetCell As Range Keywrd = "a" If Keywrd = "" Then Exit Sub With Worksheets("Sheet1").Columns("A:A") Set TargetCell = .Find(Keywrd, LookAt:=xlWhole, LookIn:=xlValues) If TargetCell Is Nothing Then MsgBox Keywrd & " は見つかりません。" Exit Sub End If End With TargetCell.EntireRow.Copy Worksheets("Sheet2").Range("A387") TargetCell.EntireRow.Delete Shift:=xlUp

  • VBAでオートフィルを使って指定する文字列を含むものを表示させたい

    VBAを使って、セルD1に入力した文字列を検索するマクロを作りたいと思っています。 私は初心者で前に似たようなものを作ってもらって それを加工しようとしたのですが、うまくいきませんでした。 以前は完全に一致するもので表示でしたが、 今回は含むものを表示させたいです。 ワイルドカードは*をつけるのはわかるのですが、 いろいろやってみましたがダメでした。(単純なことかもしれないですけど) Private Sub Worksheet_Change(ByVal Target As Range) Dim myRng1 As Range Dim myRng2 As Range Set myRng1 = Target.Cells(1) If Application.Intersect(myRng1, Range("D1")) Is Nothing Then Exit Sub Set myRng2 = Range("D1").CurrentRegion With myRng2 If myRng1 = "" Then ActiveSheet.ShowAllData Else .AutoFilter Field:=4, Criteria1:=myRng1.Value End If End With End Sub

  • VBA シートプログラムでRangeエラー

    いつもお世話になっております。 Excel2003を使用しております。 シートに直接プログラムを書いています。 (例として、Sheet1とします) シートの内容が変わったときに、色々プログラムを実行していこうと思っているのですが、 Private Sub Worksheet_Change(ByVal Target As Range) のTargetが上手く取得できていない気がします。 今までは上手く動いていたのですが、 急にTargetの値に数値(セルに入力した値)が入ってしまうようになり 上手く組めなくて困っています。 Private Sub Worksheet_Change(ByVal Target As Range) Dim 開始1 As Range Dim 終了1 As Range Dim 開始2 As Range Dim 終了2 As Range Set 開始1 = Range("D5:D63") Set 終了1 = Range("E5:E63") Set 開始2 = Range("F5:F63") Set 終了2 = Range("G5:G63") If ThisWorkbook.ActiveSheet.ProtectContents Then '保護かかってたら End '強制終了 End If If Not Application.Intersect(Target, 開始1) Or Application.Intersect(Target, 実績日開始2) Is Nothing Then Call 開始(Target, 開始1, 開始2) ElseIf Not Application.Intersect(Target, 終了1) Or Application.Intersect(Target, 終了2) Is Nothing Then Msgbox "テスト!" End If End Sub '----------------------------------------------- Sub 開始(ByVal Target As Range, 開始1 As Range, 開始2 As Range) If Not Application.Intersect(Target, 開始1) Is Nothing Then MsgBox Target.Row End If If Not Application.Intersect(Target, 開始2) Is Nothing Then MsgBox Target.Row + 1 End If End Sub 全部シートに書いています。 まだ、テスト段階のため適当なプログラムしか書いておりません。 (指定範囲が変更された場合に、Msgboxを出したりなど 単純なことしかしていません) どこが悪いのか、教えて頂けないでしょうか? よろしくお願い致します。

  • リストボックスの内容を検索したいが...

    エクセル2019を使っています。 添付画像のようにユーザーフォームにテキストボックスとリストボックスを作り、テキストボックスに入力した文字でリストボックスの内容を検索しようとコードを作成しました。 Private Sub TextBox1_Change() Dim LastRow As Integer Dim rng As Range, r As Range With Worksheets("Sheet1") If .AutoFilterMode <> True Then .Range("A1").AutoFilter End If LastRow = .Cells(Rows.Count, 1).End(xlUp).Row .Range("A1").AutoFilter 1, "*" & TextBox1.Value & "*" If .Cells(Rows.Count, "A").End(xlUp).Row > 1 Then Set rng = .Range("A2:A" & LastRow).SpecialCells(xlCellTypeVisible) Else Me.ListBox1.Clear Exit Sub End If End With Me.ListBox1.Clear With Me.ListBox1 For Each r In rng .AddItem r.Value .List(.ListCount - 1, 1) = r.Offset(0, 1).Value Next r End With End Sub Private Sub UserForm_Initialize() Dim LastRow As Integer Dim rng As Range, r As Range With Worksheets("Sheet1") If .AutoFilterMode <> True Then .Range("A1").AutoFilter End If LastRow = .Cells(Rows.Count, 1).End(xlUp).Row Set rng = .Range("A2:A" & LastRow) End With With Me.ListBox1 .ColumnCount = 1 For Each r In rng .AddItem r.Value .List(.ListCount - 1, 1) = r.Offset(0, 1).Value Next r End With ListBox1.ListIndex = 0 End Sub とりあえず検索はできるのですが、使用されていない文字や記号を入力したあとにバックスペースキーで入力した文字や記号を削除するとリストボックスの内容が意図した内容で表示されません。 どこを修正したらいいでしょうか。

  • エクセルVBA フォルダ内のどんなシート名であっても読み込みたい

    フォルダ内の別ブック(D3で指定)の「情報」シートを読み込んで対象年月日に該当するデータを抽出して別ブックに貼り付けるものなんですが、下のコードではSet ws = wb.Worksheets("情報")と、なっていて、限定しているのですが、これをD3のファイルのどんなシート名であっても読み込みたいのですが、どのようにコードにしたらいいでしょうか?D3で指定するブックには必ずひとつのシートしかありません。 よろしくお願いします。 Sub test_1() Dim wb As Workbook Dim ws As Worksheet Dim ms As Worksheet Dim nb As Workbook Dim r As Long Set ms = ThisWorkbook.Worksheets("メニュー") Set wb = Workbooks.Open(ms.Parent.Path & "\" & ms.Range("D3").Value) Set ws = wb.Worksheets("情報") Set nb = Workbooks.Add With ws .Range("Q1").AutoFilter _ Field:=17, _ Criteria1:=">=" & ms.Range("D5").Text, _ Operator:=xlAnd, _ Criteria2:="<=" & ms.Range("F5").Text With .AutoFilter.Range r = .Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count If r = 1 Then MsgBox "抽出対象データ無し。" wb.Close False nb.Close False Set wb = Nothing: Set ws = Nothing Set ms = Nothing: Set nb = Nothing Exit Sub End If .Copy End With End With With nb.Worksheets(1) .Paste With .Range("A1:AG1") .Interior.ColorIndex = 6 .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With End sub

専門家に質問してみよう