• 締切済み

オートフィルタで「・・で始まる」数値の抽出方法

VBAでオートフィルタを使用して「95」から始まるデータを抽出して、そのデータを1行目の項目行を省いて別シートの最終行に貼り付けするマクロを作成していますが、上手くいかない部分があり困っています。 オートフィルタはセルに入っている値が数値データの場合は「○○で始まる」検索オプションが使えない仕様とのことです。 https://support.microsoft.com/ja-jp/kb/170230 数字をテキスト形式に変換すれば文字列として扱われるので、上記の検索オプションが使えるとのことで数値が入った列を全て文字列にしようとしましたが、上手くいきません。 下記のコードが一部抜粋のコードで、A列にオートフィルタで抽出したい5桁の数値が入っているとします。 元シート(移動先シートも同じような構成でデータが入っている) A    B   C   D    E ID   品名  単価  数量  金額 92153 りんご 100   10   1000 95235 ばなな 150   15   2250 95589 みかん 50   20   1000 87896 ぶどう 200   7   1400 Dim LastRow As Long, mySt(1) As Worksheet ActiveWorkbook.Worksheets("元シート").Activate Set mySt(0) = Worksheets("元シート") Set mySt(1) = Worksheets("移動先シート") Columns("A:A").Select Selection.NumberFormatLocal = "@" '←選択列を文字列にしようとしたが上手くいかず With mySt(0) LastRow = .Cells(Rows.Count, 1).End(xlUp).Row With .Range(.Rows(1), .Rows(LastRow)) .AutoFilter Field:=1, Criteria1:="95*", Operator:=xlAnd With .SpecialCells(xlCellTypeVisible) .Copy mySt(1).Rows(1) End With End With End With また、オートフィルタで抽出したデータをコピーして、既にデータが入っている移動先シートの最終行に貼り付けたいのですが、上手くいかず、2行目に貼り付けられてしまいます。 移動先シートの最終行の取得と貼付け方法が検索してもよく分からず困っています。 2点につきまして、分かる方がいましたら教えて頂けますと助かります。 よろしくお願いいたします。

みんなの回答

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.7

 回答No.2様や回答No.3様の様に、For Each ~ Nextの様な繰り返し処理を使っても構わないという事であれば、別に 繰り返し処理でデータを1つずつ文字列に変換   ↓ オートフィルタで抽出   ↓ 抽出データをコピーして別シートに貼り付け   ↓ 元データを数値に戻す などという面倒な事をしなくても、単純に 「繰り返し処理でデータを1つずつチェックして行って、『95』から始まるものが見つかれば、その都度1行ずつ別シートにデータ(と表示形式)を転記する」 というやり方をすれば済む話なのではないでしょうか? Sub QNo9229485_オートフィルタで_○○で始まる_数値の抽出方法() Const ItemRow = 1 Const SearchColumn = "A" Const OrigColumns = "A:E" Const PasteColumn = "A" Dim LastRow As Long, mySt(1) As Worksheet, c(2) As Range, myRows As String Set mySt(0) = Worksheets("元シート") Set mySt(1) = Worksheets("移動先シート") With mySt(0) LastRow = .Range(SearchColumn & Rows.Count).End(xlUp).row If LastRow <= ItemRow Then MsgBox "処理すべきデータが見当たりませんません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If Application.ScreenUpdating = False Application.Calculation = xlManual For Each c(0) In .Range(SearchColumn & ItemRow + 1 & ":" & SearchColumn & LastRow) If c(0).Value Like "95*" Then Set c(1) = Intersect(c(0).EntireRow, .Range(OrigColumns)) Set c(2) = mySt(1).Range(PasteColumn & Rows.Count).End(xlUp).Offset(1) _ .Resize(1, c(1).Columns.Count) c(2).Value = c(1).Value c(2).NumberFormatLocal = c(1).NumberFormatLocal End If Next End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub

  • kkkkkm
  • ベストアンサー率65% (1616/2455)
回答No.6

> With .SpecialCells(xlCellTypeVisible) > .Copy mySt(1).Rows(1) > の.Rows(1)の設定の仕方が悪いのでしょうか・・ Rows(1)だと1行目を指定してますので1行目に貼り付けられています。元シートの1行目(項目名)からコピーしてますから、貼り付け先の1行目は変わらないために2行目から貼り付いているように見えるだけです。 その部分で最終行に貼り付けたい場合は、元シートの2行目からコピーして移動先シートの最終行の後に貼り付けになりますので、以下のように変更してみればいかがでしょう。 With mySt(0) LastRow = .Cells(Rows.Count, 1).End(xlUp).Row .AutoFilterMode = False .Range(.Rows(1), .Rows(LastRow)).AutoFilter _ Field:=1, Criteria1:="95*", Operator:=xlAnd .Range(.Rows(2), .Rows(LastRow)).SpecialCells(xlCellTypeVisible).Copy _ mySt(1).Rows(mySt(1).Cells(Rows.Count, 1).End(xlUp).Row + 1) End With

  • Chiquilin
  • ベストアンサー率30% (94/306)
回答No.5

桁が決まっているなら 数値で条件指定すればいいだけだと思います。 後「オートフィルタ」に拘りがないなら フィルタの詳細設定を使えばいいです。 F1に「95」 F2に「=LEFT(A2,2)=F$1&""」 と入れて検索条件範囲を「F1:F2」に。

MauMofu
質問者

補足

桁数は変化します。 最初の質問に記載していなくて申し訳ありません。

  • kkkkkm
  • ベストアンサー率65% (1616/2455)
回答No.4

No3です。 Trimは不要でした。 c.Value = Trim(CStr(c.Value)) ↓ c.Value = CStr(c.Value)

  • kkkkkm
  • ベストアンサー率65% (1616/2455)
回答No.3

文字列にするのは以下のコードでいかがでしょう。 Dim c As Range Columns("A:A").Select Selection.NumberFormatLocal = "@" For Each c In Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp)) c.Value = Trim(CStr(c.Value)) Next 2行目に貼り付けられる件が、何もデータがない場合1行目に貼り付けたいのに2行目になるという事でしたら Cells(Rows.Count, 1).End(xlUp).Row は1行目にデータがない場合には1を返しますので(0行目があり得ないため)取得した最終行に1を加算した行目に貼り付けると2行目になってしまいます。 既に1行目以降数行分データがあるにも関わらず2行目に貼り付けられる場合、最終行を取得するシートの指定が間違っている可能性があります。

MauMofu
質問者

補足

回答ありがとうございます。 教えて頂いたサンプルコードで数値データを文字列データに変換できることが確認できました! No.2さんのコードでも同じことができますが、シンプルで見やすいですね。 移動先シートの件は、1行目には必ず項目名を入れるようにしてあります。 ただ、最終行の取得とその直下の行にデータを貼り付ける動作が上手くいかず、必ず2行目に貼り付けられてしまいます。 With .SpecialCells(xlCellTypeVisible) .Copy mySt(1).Rows(1) の.Rows(1)の設定の仕方が悪いのでしょうか・・ それともシートの指定方法が不味いのでしょうか

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.2

「必ず5桁」ってのが保証されているなら 「95000」「以上」 AND 「96000」「より小さい」 というフィルタを設定すれば良いのでは? もし「95も950も9500も95000も抽出したい」って場合は、どこか別の作業列に =LEFT(A1,2) って言う式を書いて、下まで必要なだけコピーして、その作業列の値が「95」になっている物だけを抽出する必要があります。 >数字をテキスト形式に変換すれば文字列として扱われるので、上記の検索オプションが >使えるとのことで数値が入った列を全て文字列にしようとしましたが、上手くいきません。 「数字をテキスト形式に変換すれば」の意味は「データそのものを文字列に変換する」って意味です。 >Selection.NumberFormatLocal = "@" '←選択列を文字列にしようとしたが上手くいかず これは「表示形式を文字列にしようとしているだけ」であって「データそのものは何も変わってない」です。 「データそのものを文字列にする」のであれば Dim Rg As Range Set Rg = Range("A:A") For Each tg In Rg If IsEmpty(tg) Then Exit For If (VarType(tg) >= vbInteger And VarType(tg) <= vbCurrency) Or VarType(tg) = vbDecimal Then tg.Value = "'" & tg.Value End If Next というプログラムで「データそのものを文字列値に置き換えする」必要があります。 こうすれば「95」「で始まる」をオートフィルタに設定可能です。

MauMofu
質問者

補足

回答ありがとうございます。 質問内容に書いていませんでしたが95で始まる数字は桁数が変わる場合があります。ですので、数字の範囲で以上以下でちょっと難しかったです。 データ自体を文字列に変換するやり方の解説ありがとうございます。 他の方の回答のコードでも同じことができるので、色々なアプローチの方法があるんだなと勉強になりました。 文字列に変換できましたので、オートフィルタで「95で始まる」検索ができるようになりました。

  • shintaro-2
  • ベストアンサー率36% (2266/6244)
回答No.1

>数字をテキスト形式に変換すれば文字列として扱われるので、上記の検索オプションが使えるとのことで数値が入った列を全て文字列にしようとしましたが、上手くいきません。 90000以上 95000以上 95500以上とか 数値で指定すればよいのでは?

MauMofu
質問者

補足

実務で使うデータは桁数が変わるため数値の以上以下だと関係ないデータまで引っ張ってしまう可能性がある気がしました。 桁数が変わっても95で始まる数字のみをピックアップしたいのが正確なやりたいことでした。

関連するQ&A

  • オートフィルタ抽出データをコピーするマクロについて

    マクロについて勉強中の者です。 "Sheet1"にあるデータをオートフィルタで抽出し、 "Sheet2"に抽出データのみをコピーをしたいと思っています。 Range("A10:G59").Select Selection.ClearContents With Worksheets("Sheet1").Range("A1") .AutoFilter .AutoFilter Field:=1, Criteria1:="○" .CurrentRegion.SpecialCells(xlCellTypeVisible).Copy Worksheets("Sheet2").Range("A9") End With End Sub としてみたのですが、 これを実行すると、オートフィルタが1行目(A1)ではなく、 2行目で設定されてしまい、抽出データがずれてしまいます。    A    B    C 1 品 名  仕入先  発注数 ←タイトル行に設定したい 2 りんご  ヤマト   10  ← この行に▼が設定される 色々調べた結果のマクロなので、どこが悪いのか見当がつきません。 解りやすく教えていただける方がおられましたら、よろしくお願い致します m(__)m

  • Excelマクロ オートフィルター条件設定で不等号を使いたい

    Excelマクロ オートフィルター条件設定で不等号を使いたい 請求シートより抽出条件シートに条件を設定し、抽出シートにコピーするマクロ を作成しています。 抽出条件に比較演算子の不等号<>を使った場合、条件が無視されてしまいます。 どのようにしたら良いでしょうか? 請求シートのA列には会社番号が数字4桁で入力されています。 抽出条件シートA5セルに下記の条件を設定した場合、 1と2の場合は上手くフィルターが機能しますが、3の不等号を 使った場合は機能しません。どなたか宜しくお願いします。 1:1000 2:>1000 3:<>1000 Sub テスト() Dim LastRow As Long, LastColumn As Long Dim myData As Range Dim myCriteria As Range With Worksheets("請求") LastColumn = .Cells(5, Application.Columns.Count).End(xlToLeft).Column LastRow = .Cells(Application.Rows.Count, "A").End(xlUp).Row Set myData = .Range("A5", .Cells(LastRow, LastColumn)) End With Set myCriteria = Worksheets("抽出条件").Range("A5").CurrentRegion Worksheets("抽出").Range("A6:R1000").ClearContents myData.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=myCriteria, _ CopyToRange:=Worksheets("抽出").Range("A5:R5"), Unique:=False Set myData = Nothing Set myCriteria = Nothing End Sub

  • オートフィルターで一つずつ抽出したものを....

    Bの行にオートフィルターをかけ、列の11で一つずつ抽出したものをコピーし、新規シートに貼り付けたいのですがどうやれば良いですか? 見出し『商品』として抽出されるもの全て新規シートにそれぞれコピーしたいです。 VBAの場合、初心者ですのでわかりやすくお願いします。 わかる方には面倒な事ばかりで申し訳ありませんが宜しくお願いします。 エクセル2010です。

  • 重複しないレコードを抽出するとオートフィルタの矢印が消える

    リストを作成しています。 B列に氏名が入っています。その他C列には地域、D列には分類などそれぞれのデータが入力してあり、オートフィルタで抽出できるようになっています。 ここでB列の重複しない人の名前をAF列に抽出・転記したマクロを作ったのですが、マクロが動作すると同時に、今まであったオートフィルタの矢印も消えてしまいます。 重複しない人の名前を抽出・転記したあとも、今まで通りオートフィルタの矢印(機能)を表示するにはどうしたらいいのでしょうか。 Private Sub Workbook_Open() With Worksheets("顧客管理表") .Columns("B").AdvancedFilter _ Action:=xlFilterCopy, _ CopyToRange:=.Columns("AF"), _ Unique:=True .EnableAutoFilter = True End With End Sub いろいろ試したのですが、ダメでした。よろしくお願い致します。

  • マクロで分と秒だけのデター抽出を教えてください。

    マクロで分と秒だけのデター抽出を教えてください。 シート1のA列に5:15:30以下にランダムな時刻が入力されています。(時間と分と秒が表示になっています。) それを分と秒だけシート2のA列に表示したいと思っています。 とりあえず、データーだけでもシート2に移せたら(転記)と思い以下の記述をしたのですが、 これでは、時刻データーも29035.0658333333となったりA列以外のデーターも 全部転記してしまいます。 誰か教えて頂けませんでしょうか?お願いします。 Sub データー抽出() Dim LastRow As Long Dim k As Long LastRow = Worksheets("シート1").Range("A65536").End(xlUp).Row For r = 2 To LastRow Worksheets("シート2").Rows(r).Value = Worksheets("シート1").Rows(r).Value Next r end sub

  • エクセルVBAでオートフィルタの結果をコピーして別シートに貼り付け

    よろしくお願いします。今下のようにコードを書いています。 見よう見まねですが・・・。 追加情報の範囲をデータシートのデータのある最終行の下に 入れるものなのですが、 追加情報シートでオートフィルタをかけてから、その結果を 貼り付けたいのですが、コードをどのようにつなげたらいいか 教えていただけないでしょうか。 追加情報シートのBD列で、0より大きい値を抽出して、それを 元の(下のコード)のようにサイズを変更して、貼り付けたいと思います よろしくお願いします。 With Worksheets("追加情報").Range("AA1").CurrentRegion .Offset(1, 2).Resize(.Rows.Count - 1, .Columns.Count - 2).Copy End With Worksheets("データ").Range("C65536").End(xlUp).Offset(1). _ PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False Sub オートフィルタ() Range("BD1").Select Selection.AutoFilter Selection.AutoFilter Field:=30, Criteria1:=">0", Operator:=xlAnd End Sub

  • エクセルの、オートフィルタ抽出後の貼り付けについて

    エクセルで、 A列に連番のデータIDが、B列~Z列まで数値データが入っています。 A列には、24データごとに、-1、-2、-3の3行が入り、その後、連番が続きます。 行-1は平均値、-2は最小値、-3は最大値を求める数式が入っています。 オートフィルタで、この数式の入った行以外を抜き出した後、別シートから数値を貼り付けたいのですが、隠れてる行にも張り付いてしまいます。 表示されているところのみにデータを貼り付ける方法はありますでしょうか?

  • オートフィルター後の見出し以外をコピー

    お世話になっております。Excel2003を使ってます。 オートフィルター後の、見出し以外をコピーしようと考えています。 現在は With ThisWorkbook.Worksheets("テスト") .Range("B2:B" & Cells(Rows.Count, 2).End(xlUp).Row).SpecialCells(xlCellTypeVisible).Select '可視セルの選択 Selection.Copy '可視セルコピー ThisWorkbook.Worksheets("フィルタ用").Range("A" & m).PasteSpecial 'A列に貼り付け! Excel.Application.CutCopyMode = False 'クリップボードの内容クリア End with この内容で上手くいっていましたが、 見出し+1行しかない場合、 全範囲選択になってしまい、上手くいかない状況です。 どうやったら、見出し以外のB列をコピーできるのでしょうか? Offset とか、 Resize を使えばいけるのでしょうか…? 見出し以外の行、 B列、C列、D列 F列 を 「TEST」シートにコピーしたいです。 With ThisWorkbook.Worksheets("テスト").Range("A1").CurrentRegion .Offset(1, 1).Resize(.Rows.Count - 1, 3).Copy _ Destination:=Thisworkbook.worksheets("TEST").Range("A" & m) .Offset(1, 4).Resize(.Rows.Count - 1, 1).Copy _ Destination:=Thisworkbook.worksheets("TEST").Range("D" & m) End With 考えたのですが、良く分からなくなってしまいました。 回答をお願い致します!

  • オートフィルタで抽出したデータをVBAで貼り付けしたい

    質問させていただきます。 エクセルで仕入帳を作っています。 各取引先ごとに1枚のシートになっているのですが、 該当する月をオートフィルタで抽出して、そのデータを1枚のシートに貼り付けていき、各月ごとにデータをまとめたいと思っています。 ユーザーフォームで月を入力してオートフィルタで抽出しているのですが、データのないシートの場合不要な部分までコピー&ペーストされてしまいます。 これを回避するにはどのようにコードをかけばいいのでしょうか。 よろしくお願い致します。 現在はこのようなコードで抽出しています。 Private Sub CommandButton1_Click() Application.ScreenUpdating = False Worksheets("sheet2").Select Range("H1:H17").Select Range("H17").Activate Selection.AutoFilter Field:=8 Rows("2:2").Select Rows("2:500").Select Selection.ClearContents RowIndex = 3 '行番号の初期値設定 Do While Worksheets("目次").Cells(RowIndex, 1).Value <> "" '拾ったセルの値が空でない間ループ内の処理をする 検索値 = UserForm1.TextBox1.Text DataSheetName = Worksheets("目次").Cells(RowIndex, 1).Value Worksheets(DataSheetName).Select Range("A2").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.AutoFilter Selection.AutoFilter Field:=13, Criteria1:=検索値 & "月分" Set tbl = ActiveCell.CurrentRegion tbl.Offset(2, 0).Resize(tbl.Rows.Count - 2, tbl.Columns.Count).Select Selection.Copy Worksheets("sheet2").Select IRow = Range("A" & Rows.Count).End(xlUp).Row Range("A" & IRow + 1).PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False Worksheets(DataSheetName).Select Selection.AutoFilter Field:=13 RowIndex = RowIndex + 1 '行番号カウントアップ Loop Application.ScreenUpdating = True Worksheets("sheet2").Select Range("A2").Select Unload UserForm1 End Sub

  • Excel2003 オートフィルタで「*」を抽出

    Excel2003でオートフィルタを使って文字列「*」を含む行を抽出したいのですが、どのようにすれば抽出できますか?

専門家に質問してみよう