• ベストアンサー

EXCEL Advancedfilter Name(Criteria)の自動作成

重複データから重複のないデータを抜き出すため、下記のようにCriteriaRangeを指定せずに、Advancedfilterを実行していますが、その際にシートの特定のセルにCriteriaという名前(Nameオブジェクト)が自動的に作成され、それが残る現象が生じます。 シートにその名前(Criteria)が残ると、別のSUBで重複データから重複のないデータを抜き出すためAdvancedfilterを実行すると機能しません(表題部だけ抜き出してくる)。 そこで、2点ご教示いただければ幸いです。 1 Criteriaを残さないAdvancedfilterの実行方法 2 残ってしまうCriteriaを削除する方法として、下記のコードを加えていますが、Namesコレクションの特定のName(Criteria)を特定して削除させていますが、この方法は=を使っていることが、後日のコード解析を分かりづらいものにするため、避けた方がよいと別に指導を受けているため、これ以外の効率的な方法があればご教示願います(例えば、Nameのプロパティを変更する方法による対処方法)。 Criteriaを削除するコード   Dim Objname As name For Each Objname In ActiveWorkbook.Names If Objname.name = "作業用シート!Criteria" Then Objname.Delete End If Next Objname Advancedfilterのコード   With Worksheets("作業用シート") M = .Range("B10000").End(xlUp).Row .Range(.Cells(6, 5), .Cells(M, 5)).AdvancedFilter _ Action:=xlFilterCopy, _ CopyToRange:=.Range("AA6:AA2000"), Unique:=True end with  

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

こんにちは。 (1)削除について If Objname.name Like "*Criteria" Then If Instr(Objname.name, "Criteria")>0 Then If Right(Objname.name,8) = "Criteria" Then (2)Advancedfileterについて 引数の CriteriaRange:="" を付加するのはどうでしょう。 .Range(.Cells(6, 5), .Cells(M, 5)).AdvancedFilter _   Action:=xlFilterCopy, _   CopyToRange:=.Range("AA6:AA2000"),   Unique:=True _   CriteriaRange:="" ただ、(2)のようにCriteriaRange:="" を付加してやれば、 (1)の削除は必要ないかと思いますが。   外してましたらご容赦願います。 以上です。  

yoshio2
質問者

お礼

早速のご指導ありがとうございました。 (2)は機能しました。参考書を鵜呑みにするしか能のない私にはコロンブスの卵のような発想です。 今後とも、ご指導よろしくお願いします。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 Criteria は、数少ないExcelの予約語ですから、任意で名前を付けなければ、AdvancedFilter等で、自動的に振られる単語には、ブレはありません。 ですから、 削除するなら、以下のようにすればよいです。 なお、Names のコンテナのクラスは、Application, Workbook, Worksheet とありますが、一応、今回は、Workbook クラスにしておけば、問題はないと思います。  On Error Resume Next  ThisWorkbook.Names("Criteria").Delete  If Err.Number > 0 Then   MsgBox "'Criteria' が見つかりません", 32  End If  On Error GoTo 0   これは、文字の比較ではありません。ブックが、ThisWorkbook ではないのなら、Workbooks("xxxx").Names("Criteria").Delete にしてください。 >この方法は=を使っていることが、後日のコード解析を分かりづらいものにするため、避けた方がよいと別に指導を受けているため、これ以外の効率的な方法があればご教示願います それは、指導に対して、誤解をされているか、もしくは、指導された方の認識度が低いかもしれません。 文字列比較は、VB系では、'=' を使いますが、アルファベットには、大文字・小文字の違いがあり、Binary で比較されるために、必ずしも、文字では一致しないことがあります。そのために、モジュール自体をOption Compare Text モードにして、Like 演算子で比較するか、StrConv で、UpperCase(LowerCase) にして文字を統一して変換するか、StrComp のTextCompare モードにするのです。Instrの場合は、引数を省略しないで、TextCompare モードにします。 ちなみに、私は、StrComp を使っています。ただ、予約語に対して、大文字、小文字の違いを考慮するというのは、本来は、それほど重要なことではありませんね。前述のように、'Criteira'は、予約語ですから、自動で付けられたものに自体には、ブレはありません。

yoshio2
質問者

お礼

丁寧なご指導ありがとうございました。 私の理解度が浅いところについて、よく分かる説明で助かりました。 文字列比較も色々あり、奥が深いですね。 予約語という発想は私にはなく、予約語について再確認できました。 今後とも、ご指導のほどよろしくお願いします。

関連するQ&A

  • excelでAdvancedFilterを使って重複データを削除したい。

    初心者質問で申し訳ありません。 重複データを削除したいんですが、調べたところ AdvancedFilterを使って・・・とのことでした。 Sheets("コピー元sheet").Range("範囲").AdvancedFilter _ Action:=xlFilterCopy, _ CopyToRange:=Sheets("コピー先sheet名 ").Range("範囲"), _ Unique:=True ということは分かったのですが、「どの項目の重複 を削除したいのか?」というのはどこで指定するのでしょうか・・・。(例:B列の「部署」という項目の列で重複している部署があったらデータを削除したい・・・等) 例文が見苦しかったらごめんなさい!!!

  • Excel 2007 マクロ AdvancedFilterについて(再

    Excel 2007 マクロ AdvancedFilterについて(再投稿) 先ほど同じ質問を投稿したのですが、画像を添付していませんでした。削除できないため再度投稿しました。 元データ(Sheet1)の表が4つあります。元データは画像に添付しました。 この表で製品名かぼちゃで「空白」と「-」以外の数値が入っている行をSheet3にコピーして貼り付けるマクロを作成しています。 <Sheet2> 製品名その他 かぼちゃ<> かぼちゃ- 下記マクロを実行したところ、Sheet3にはA列の番号のみ表示されます。 Sub Test1() Sheets("Sheet1").Range("A1:E34").AdvancedFilter xlFilterCopy, _ Sheets("Sheet2").Range("A1", Sheets("Sheet2").Cells.SpecialCells(xlCellTypeLastCell).Address), _ Sheets("Sheet3").Range("A1") End Sub <Sheet3> A列は空白です。 B列からE列は表示されていません。 どのように修正すればよろしいでしょうか。

  • EXCEL VBA 作業用シートの使い回し

    データのあるシートから、一定の条件にあうデータを当初から用意した作業用シート抜き出してきた上で、抜き出したシートの1つの列にあるデータ集から重複のないデータを抜き出すため、advancedfilterを使用しています。 別のサブルーチンを作成して、同一作業用シートを使い回す形で上記の作業を実行すると、表題のみコピーしてデータをコピーしなくなる現象が生じました。 作業用シートを削除して、新たにシートを挿入して作業用シートと名前を付けて、advancedfilterを実行すると、正常に機能しました。 このような現象がおきる理由をご教示願います。 この現象を避けるには、作業用シートをサブルーチンごとに挿入・削除を繰り返す必要が生じ、処理スピードが落ちると予想されます。 よき、アドバイスがあればよろしくお願いします。 Sub フィルター() Dim rows As Double '重複を削除した番号リスト作成 With Worksheets("作業用") rows = .Range("b65536").End(xlUp).Row .Range(.Cells(6, 3), .Cells(rows, 3)).AdvancedFilter Action:=xlFilterCopy, _ copytorange:=.Range("N6"), unique:=True End With End Sub

  • AdvancedFilterを使って値のみ貼り付け

    あるAシートからあるBシートに重複したコードのみ抽出して値のみの貼り付けたいのですが、 AdvancedFilterでは全コピーになってしまいます。 Bシートの書式は変更したくないので、 何かいい方法をご存知ないでしょうか?

  • excelで複数条件で抽出する

    excel VBAで質問です。(初心者レベルです) A列からZ列までデータがあり、オートフィルタでE列で条件に当てはまるものと、E列では条件外だが、Y列では条件に当てはまるものを別シートに抽出したいと思っています。 Sub Macro1()   With Worksheets("Sheet1")     .Range("A1").AutoFilter _       Field:=5, Criteria1:="*条件*"     .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _       Worksheets("Sheet2").Range("A1")   End With End Sub Fieldを変えて、E列、Y列それぞれはできるのですが、データが重複してしまいます。 重複分を削除するため、セル入力で連番を降って、重複するものを削除しようとしましたがうまくいかず。 なにかいい方法はないでしょうか。

  • Excel VBA 重複なしリスト作成

    VBA初心者です。 よろしくお願いいたします。 重複なしリスト作成用コードを次のように入力しました。 Worksheets("Sheet 1").Columns("BF:BF").AdvancedFilter Action:=xlFilterCopy, _ CopyToRange:=Worksheets("Sheet 2").Range("A1"), Unique:=True この抽出先であるシート2のセルが常にA列の最終行の続きから入力できるようにしたいのですが、どうしたらよいでしょうか? 下記のようなコードで試しましたがうまくいきませんでした。 Worksheets("Sheet 1").Columns("BF:BF").AdvancedFilter Action:=xlFilterCopy, _ CopyToRange:=Worksheets("Sheet 2").Range(.Cells(Rows.Count, "A").End(xlUp).Row + 1), Unique:=True 不勉強で申し訳ありませんが、どなたかご回答いただければ幸いです。

  • AdvancedFilterの状態把握

    ExcelのVBAで、AdvancedFilterを使って、データを 抽出するプログラムを作っています。 今のシートの状態が、AdvancedFilter実行後かどうか をVBAで取得したいのですが、可能でしょうか? ちなみに、AutoFilterは、「ActiveSheet.AutoFilterMode」 で取得できるようですが、AdvancedFilterの状態は 取得することができませんでした。 よろしくお願いします。

  • セルに付けたNameオブジェクトの完全削除

    お世話になります。 エクセルVBAを使用しています。 Execel2003の時に、次の様に沢山のNameを付けました。 Range("B003:B024").Name = "namA_User" これで複数のシートにコピーしていました。 これの欠点は、手作業でシートをコピーしようとすると、重複Nameの確認メッセージが表示される事です。 故に、Execel2010に移行した時に、Nameの使用を止めて、Constant定義に替えました。 併せて、Names("XXXX").Deleteで、出来るだけ、削除しましたが、削除しきれずに、まだ残っています。 数式表示の項目に表示されますが、削除出来ないものがあるという事です。 さて、質問ですが、最近、次の現象がある事がわかりました。 Excell2010です。 (Excell2003では試していません。) Nameを定義していないシートを、手作業でコピーして、そのコピーされたシートを再び手作業でコピーしようとすると、重複Nameの確認メッセージが表示されてしまいます。 Execll2003の時に定義して消したつもりのNameが20個ぐらい表示されます。 これは、どうしてでしょうか? 実感としては、シートにはNameはないが、Bookのどこかに、残っている感じです。 なお、数式表示項目で見てもNameはありません。 併せて、Nameオブジェクトを一発で削除する方法はないでしょうか> 御教示、よろしくお願いいたします。

  • VBAのAdvancedFilterについて with構文で囲まないとオブジェクト定義エラーになる理由

    エクセルでVBAの下記コードで実行すると、実行時エラー'1004' アプリケーション定義またはオブジェクト定義のエラーとなりますが、 Worksheets("作業用").Activate Worksheets("職員").Range(Cells(6, 1), Cells(Wrow, 12)).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("a6:c8"), CopyToRange:=Range("d6:z2000"), Unique:=False それを下記のようにwith end with構文で囲むとエラーとなりません。 形式的には同じコードに見えるのですが、実質的に何が違うためオブジェクト定義エラーにならないのでしょうか。 AdvancedFilterに限らず、しばしば同様の原因によるエラーに悩まされていますので、ご教示いただければ幸いです。 Worksheets("作業用").Activate With Worksheets("職員") .Range(.Cells(6, 1), .Cells(Wrow, 12)).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("a6:c8"), CopyToRange:=Range("d6:O2000"), Unique:=False End With

  • エクセルVBAで自動チャート作成。 エラーになります

    シート1に複数のデータが縦に入っています(A3:A90、B3:B90,C3:C90 といった具合です)データの数は30個です。 それぞれのデータを個々のチャートにして別のシート(シート名: Chart1)に並べて表示させたいです。 それで以下の様なコードを書きました。 このコードはうまく動くのですが、同じようにシート2のデータをChart2のシートにチャートを出そうと思って、4行目の・・・Source:=Sheet1.Range(Cells(3, j)・・・のところをSource:=Sheet2.Range(Cells(3, j)にして実行するとエラーになります。 何故だか分からなくて困っています。 対処方法を教えてください。 エラーは Run-time error ‘1004’: Application-defined or Object-defined error です。 お願いします。 For j = 1 To 30 Set ch = ActiveSheet.ChartObjects.Add(10, 5 + j * 105, 500, 100) ch.Chart.ChartType = xlColumnClustered ch.Chart.SetSourceData Source:=Sheet2.Range(Cells(3, j), Cells(90, j)), PlotBy:=xlColumns ch.Chart.Location where:=xlLocationAsObject, Name:="Chart1" With ch.Chart .HasTitle = True .ChartTitle.Characters.Text = False .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False End With Next j

専門家に質問してみよう