• 締切済み

EXCEL VBA データ抽出について

ユーザーフォームを利用して、データの管理を行なっております 各データには、コードを設定しており 検出時に利用しています フォームでコードを入力する際には 前半(年・月) 後半(No.)で2か所に分けて入力しており 以下、コード前半⇒ コード1     コード後半⇒ コード2  ・・・としておきます シートへの転記も、コード1はA列・コード2はB列に分けて書き込んでいます 以下は、コードからデータを検出し、その内容をテキストボックスへ表記するように 書いたコードですが、コード1のみでの検索になっております コード2をどのように組み込めばいいのか、わからずとても困っています。 シート名 AllDate コード1 TextBox36    (A列) コード2 TextBox37    (B列) 1行目は項目名になっており、2行目からデータが蓄積されています。 また新規で登録した場合には、空欄最下部へフォームからシートへ転記されるように設定しています   ============================ Worksheets("AllDate").Activate Dim i As Long, kb As String If TextBox36.Text = "" Then MsgBox "検索する番号を入力してください" Exit Sub End If For i = 2 To Range("A1").CurrentRegion.Rows.Count If Cells(i, 1).Text = TextBox36.Text Then kb = TextBox36.Text Exit For End If Next If kb = "" Then MsgBox "指定した番号はありません" Exit Sub Else Call ReadRecord(kb) End If TextBox36.Text = "" TextBox37.Text = "" End Sub Sub ReadRecord(kb As String) Dim rw As Long Set kRange = Range("A1").CurrentRegion.Columns(1).Find(What:=kb, LookAt:=xlWhole) If kRange Is Nothing Then MsgBox "データがありません" Exit Sub End If rw = kRange.Row TextBox1.Text = Cells(rw, 1).Value TextBox2.Text = Cells(rw, 2).Value TextBox3Text = Cells(rw, 3).Value TextBox4.Text = Cells(rw, 4).Value =============================== また自分なりにも何とか模索しており、フィルターを使う方法も考えておりますが 何分まだまだ初心者LVの為、 こちらも難航しております。 フィルタを使用する場合 TextBox36の値で、A列にて抽出 抽出されたデータから、さらに TextBox37の値で、B列にて抽出 重複データは存在しないので、A2行へ常に1件のデータが残り それをセル指定で、テキストボックスへ転記さようと考えています。 また、修正⇒上書き作業も必要なので フィルタで抽出したデータをテキストボックスへ表示させ 修正後、同様にA2行へ書き込み その後、フィルター解除がいいのかな?と思っています。 長々となり恐縮なのですが 方法のオススめ コードのご教授など お力をお貸しいただけないでしょうか? よろしくお願いいたします!!

みんなの回答

  • TAKA_R
  • ベストアンサー率32% (26/79)
回答No.1

私としては普通に検索する時には、フィルターはお勧めしないかなぁ、と思いました。 (複数抽出してコピーとか、条件が複数とか、万単位のデータとかだとお勧めしますが) 検索するときに、すでにコード2は準備できているんでしょうか。 準備できているなら、 If Cells(i, 1).Text = TextBox36.Text Then kb = TextBox36.Text If Cells(i, 2).Text = TextBox37.Text Then kd = TextBox37.Text 'kbと同じようにメッセージボックスで確認できます。 Exit For End If End If でよいと思います。 Callする必要がなくなりますので、テキストボックスへの書き込みを本体へ移しましょう・・。 for next を使うのも良いですが、for each next のほうが行番号の取得がめんどくさく無くて私は好きです。 コード2が準備できていなかったら・・・フィルターや配列を使ってのコンボリストで、コード2を探させる必要が出てきますね・・・。

nachi_snap
質問者

お礼

ご返答からお礼がすごく遅くなり申し訳ありませんでした。 言い訳がましくて恐縮なのですが、お礼が未完了のまま放置されていることに 気づき慌てて再度し直した次第です。 助けて頂いたのに、このように無作法になってしまい心よりお詫びと共に 改めてお礼申し上げます。ありがとうございました

関連するQ&A

  • エクセル VBAのチェックボックスについて

    お読みくださり、ありがとうございます。 エクセル初心者でございます。 エクセルのマクロなのですが、 お詳しい方、是非教えて欲しいです!汗 調子に乗って入力フォームなるものを作りました。 入力フォームの中にて、チェックボックスで「ある」「なし」の項目を入れてみたのですが、チェックしていないのに、値が入る現象が起きています汗 以下、素人が書いたコードを恥を承知で記載させていただきます。 Private Sub CheckBox1_Click() If CheckBox1.Value = True Then OK = "○" End If End Sub Private Sub CheckBox2_Click() If CheckBox2.Value = True Then NO = "×" End If End Sub Private Sub UserForm_Click() End Sub '以下のコードは、登録ボタンがクリックされたときの処理! Private Sub 登録ボタン_Click() If TextBox1.Text = "" Then MsgBox "グッズ名を入力してください。" Exit Sub End If If TextBox2.Text = "" Then MsgBox "アプローチ先を入力してください。" Exit Sub End If With Worksheets("協賛グッズ") With Cells(Rows.Count, 2).End(xlUp) .Offset(1, 0).Value = TextBox1.Text .Offset(1, 1).Value = mori .Offset(1, 2).Value = mori2 .Offset(1, 3).Value = TextBox2.Text .Offset(1, 5).Value = TextBox3.Text .Offset(1, 6).Value = TextBox4.Text .Offset(1, 7).Value = TextBox5.Text .Offset(1, 8).Value = TextBox6.Text End With End With TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" CheckBox1.Value = False CheckBox2.Value = False End Sub 以上です。 おかしなところ満載かと思いますが、 チェックを入れた項目だけ値を入れたいと考えております。 おわかりになるかたおりましたら何卒お助けください汗 よろしくお願いいたします。

  • VBAで複数列からの条件指定でデータを抽出したい

    講習会の受講者名簿を作成しています。(名簿は科目別で3つのシートに分かれています。) 現在下記モジュールで、受講者名・受講者番号を個々に入力し検索出来るようにしていますが、 受講日(例:2014/4/1~2014/4/31の間)で受講者を抽出できるようにしたいと考えています。 しかし、受講予定日は過去のものも含め複数列(I列~N列)まであり、受講者によって受講日の入力されている列がI列~N列間でまちまちです。 このような場合、どのようにVBAを変更したら受講日で検索が可能になるでしょうか? 宜しくお願いします。 Sub Sample2() Dim k As Long, endRow As Long, wS As Worksheet Set wS = Worksheets("検索&抽出") If wS.Range("B1") = "" And wS.Range("B2") = "" Then MsgBox "検索データを入力してください" Exit Sub End If endRow = wS.Cells(Rows.Count, "A").End(xlUp).Row If endRow > 4 Then wS.Rows(5 & ":" & endRow).ClearContents End If For k = 2 To 4 With Worksheets(k) If wS.Range("B1") <> "" Then .Range("A1").AutoFilter field:=2, Criteria1:=wS.Range("B1") End If If wS.Range("B2") <> "" Then .Range("A2").AutoFilter field:=3, Criteria1:=wS.Range("B2") End If If .AutoFilter.FilterMode Then endRow = .Cells(Rows.Count, "A").End(xlUp).Row If endRow > 2 Then Range(.Cells(3, "A"), .Cells(endRow, "N")).Copy wS.Cells(Rows.Count, "A").End(xlUp).Offset(1) End If .AutoFilterMode = False End If End With Next k End Sub

  • データ抽出に時間がかかり困っています

    皆様大変お世話になっております。ところで、データ抽出の件で大変困っておりまして、ご教授いただきたくご連絡差し上げました(使用OSはXP、エクセルは2007です。)。企業の決算期データを抽出したいのですが、毎年度決算月のみのデータを月次データからどのようにすれば速く抽出できるかで悩んでおります。データの構成は:A列に年度・決算月(例えば、1978/03)、B列に企業コード、C列に年度・月(例えば、1984/01)、D列に企業コード、E列にはC・D列に対応した月次データが入力されております。A・B列は(各企業の年毎の決算月)各70698行、C・D・E列は(各企業の月次毎データ)各248964行となっております。ここで、A・B列に等しいC・D列のセルをみつけ、その横のE列の値を当該A・B列に対応した行のF列に書き出させたいのです(回りくどい説明で申し訳ありません。)。初心者ながら、いろいろなVBA説明ページを参照しつつ、以下のコードを作成しました: Sub Sorting01() Dim ra As Long, rc As Long Application.ScreenUpdating = False For ra = 3 To Range(A70698).End(xlUp).Row If Cells(ra, 1) <>"" Then For rc = 3 To Range(C248964).End(xlUp).Row If Cells(rc, 3) <>"" And Cells(ra, 1).Value = Cells(rc, 3).Value And Cells(ra, 2) = Cells(rc, 4) Then Cells(ra, 7).Value = Cells(rc, 5).Value Exit For End If Next rc End If Next ra MsgBox Done End Sub データの一部(100行分)を別のシートに貼り付けて動くかどうか試したところ、問題ありませんでしたが、元のデータに適用したところ、とてつもなく時間がかかっております。上述のコードが非常に非効率的なものではないかと考えております。初心者で誠に恥ずかしい限りですが、きわめて急いでいることもありご連絡差し上げました。時間短縮のため、効率的なコード、または他の方法(関数)がありましたら、教え願いたく存じます。重ねながら、どうぞ宜しくお願いいたします。 追伸:A列・C列の/は取り除き数字の状態に変えてあります(例えば、1977/01 =>197701)。一点、申し上げておきたいことは、B列に出てくるコードがD列に必ずしもあるわけではありません。

  • Exit Subでコードを抜け出したい

    If textbox.value "" Then X1 = textbox.Value For i = 1 To 100 X2 = ws.Cells(i, 1).Value If X1 = X2 Then Holder = i Exit For End If If X1 <= X2 Then Holder = i Exit For End If Next i End If 上記のようなコードがあります。textboxというテキストボックスの中の文字列とExcelのセルの文字列を比較して処理を行いたいと思っています。X1=X2、もしくはX1 <=X2の時ループを抜けます。 これに追加して、X1=X2、X1<=X2以外にこれにあてはまらない文字列がある場合は処理を中止してexit subをしたいと思っています。 わからないのは、ExcelのセルのA列から100行を検索して、その結果上記の二つの条件を満たさない場合は"データがありません"でexit subをしたいと思っています。どこにexit subで抜けるようなコードを追加すればよいでしょうか?

  • EXCEL VBAで・・・。

    テキストボックス34に入力した値を、ExcelのA列の値より検索し その隣の値をテキストボックス4に表示させる、と言う処理をしています。 検索時に検索データが見当たらない場合、メッセージボックスを表示し、 更に、テキストボックス34のデータを消去→テキストボックス34にフォーカス移動 させたいのです。 下記のコードですと、メッセージボックス表示と テキストボックス34のデータ消去までは出来るのですが フォーカス移動してくれません。 イベントをexitにしている理由は特にないのですが、changeを使うと、 テキストボックス34に1文字入力された時点でメッセージボックスが表示されたり、 1文字でも一致するデータが順に表示されてしまいます。 (テキストボックス34に入力するデータの文字数は3文字固定です。) 何か良いお知恵がありましたら、お教え下さい。 ----------------------------------------------------------- Private Sub Textbox34_exit(ByVal Cancel As MSForms.ReturnBoolean) Dim Result As Variant Set Result = Range("A:A").Find(what:=TextBox34.Text, MatchCase:=True, matchbyte:=True) If Result Is Nothing Then MsgBox ("入力されたコードは登録されていません。") TextBox34.Text = "" TextBox34.SetFocus Else Range("A:A").Find(what:=TextBox34.Text, MatchCase:=True, matchbyte:=True).Activate ActiveCell.Offset(0, 1).Select TextBox4.Text = ActiveCell.Value End If End Sub

  • エクセルVBAについて

    http://okwave.jp/qa/q7236213.html 上記質問の発展形なのですが 同様のことを E列に日付 F列に売上 G列に結果 でやりたいのですが この時A列~C列のマクロも残したままでしたいのですが 下記のように同様のプロシージャーを下段に書けばできると思ったのですが うまくいきません。 Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$A$1" Then Exit Sub If Target = "" Then Exit Sub Range("C10:C65536").ClearContents With Range(Cells(9 + Range("A1").Value, "C"), Cells(Range("A65536").End(xlUp).Row, "C")) .FormulaR1C1 = "=MAX(RC2:R[" & -Range("A1").Value + 1 & "]C2,FALSE)" .Value = .Value End With End Sub Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$E$1" Then Exit Sub If Target = "" Then Exit Sub Range("G10:G65536").ClearContents With Range(Cells(9 + Range("E1").Value, "G"), Cells(Range("E65536").End(xlUp).Row, "G")) .FormulaR1C1 = "=MAX(RC6:R[" & -Range("A1").Value + 1 & "]C6,FALSE)" .Value = .Value End With End Sub どなたかお知恵を拝借できませんでしょうか?

  • VBAで複数列からの条件指定でデータを抽出したい

    講習会の受講者名簿を作成しています。(名簿は科目別で3つのシートに分かれています。) 現在下記モジュールで、受講者名・受講者番号を検索出来るようにしていますが、 別シートに次回受講日(例:2014/4/1~2014/4/31)で受講者を抽出できるようにしたいと考えています。 しかし、受講予定日は過去のものも含め複数列(I列~N列)まであります。 このような場合、どのようにしたら受講日で検索が可能になるでしょうか? 宜しくお願いします。 Sub Sample2() Dim k As Long, endRow As Long, wS As Worksheet Set wS = Worksheets("検索&抽出") If wS.Range("B1") = "" And wS.Range("B2") = "" Then MsgBox "検索データを入力してください" Exit Sub End If endRow = wS.Cells(Rows.Count, "A").End(xlUp).Row If endRow > 4 Then wS.Rows(5 & ":" & endRow).ClearContents End If For k = 2 To 4 With Worksheets(k) If wS.Range("B1") <> "" Then .Range("A1").AutoFilter field:=2, Criteria1:=wS.Range("B1") End If If wS.Range("B2") <> "" Then .Range("A2").AutoFilter field:=3, Criteria1:=wS.Range("B2") End If If .AutoFilter.FilterMode Then endRow = .Cells(Rows.Count, "A").End(xlUp).Row If endRow > 2 Then Range(.Cells(3, "A"), .Cells(endRow, "N")).Copy wS.Cells(Rows.Count, "A").End(xlUp).Offset(1) End If .AutoFilterMode = False End If End With Next k End Sub

  • エクセルVBAもし同じ値なら!!

    エクセルVBAもし同じ値なら!! 開いているBookのFormから違うBookのSheet1のA列にDATAを入力することはできます。 例)TextBox1の値があれば次の列に入れることはできます。 悩んでいるのは (1)TextBox1と違うBookの"Sheet1”のA列が同じ値なら  MsgBox "既に登録済みです。"と表示させて  ElseでDATAを入力させたいです。 '使用行を格納 lngYcnt_K = SH1.UsedRange.Rows.Count For lng = 1 To lngYcnt_K 'TextBox1と同じ値を見つけてテキストボックスの値を入力。 If CStr(TextBox1.Text) = CStr(SH1.Cells(lng, 1)) Then MsgBox "既に登録済みです。" Else 最終行 = SH1.Range("a65536").End(xlUp).Row TextBox1.Text = SH1.Cells(lng, 1) TextBox2.Text = SH1.Cells(lng, 2) End If Next lng どのようにすれば良いのでしょうか?? 教えて下さい!

  • エクセル2003のVBAで、ユーザーフォームにあるテキストボックスに入力制限をつけたいのですが

    エクセル2003のVBAで、ユーザーフォーム上にあるテキストボックスに入力制限をつけようとしています。 エクセルのセル13列目にdeg値 0 0.5 1 1.5 2 ・ ・ ・ があります。 ここにない値を入力するとエラーメッセージを表示させます。 下記のコードで、小数点を入力した瞬間(例えば「1.」)にエラーメッセージが表示されてしまいます。 どう修正したらよいか、どなたか分かりませんでしょうか? よろしくお願いいたします。 Private Sub TextBox21_Change() For i = 7 To 1446 If TextBox21.Value = ThisWorkbook.Sheets(\"default\").Cells(i, 13).Value Then Exit For Next i If i = 1447 Then MsgBox \"deg値と一致しません。補正値を入れなおしてください。\" TextBox21.Text = \"\" End If End Sub

  • Excelで検索結果表示の修正

    下記のマクロでA列だけ検索できるようにしたいのですが、どこを修正したらいいのか教えてください。 Private Sub CommandButton1_Click() AAA End Sub Sub AAA() strMoji$ = UserForm1.TextBox1.Text If UserForm1.TextBox1.Text = "" Then MsgBox "検索条件を入力してください。", 48 Exit Sub End If On Error GoTo Fail Cells.Find(What:=strMoji, After:=ActiveCell, LookIn:=xlValues, LookAt:= _ xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ ).Activate lonNUM& = Selection.Row UserForm1.TextBox2.Text = Cells(lonNUM, 2).Value UserForm1.TextBox3.Text = Cells(lonNUM, 3).Value Exit Sub Fail: MsgBox "該当なし", 48 End Sub Private Sub UserForm_Click() End Sub

専門家に質問してみよう