質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.86%

  • VBA

    1458questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

VBA 結合したセルを抽出したい

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 67

gitsunnie

score 1

イメージ説明

上のA1:F7ような表があるとします。
ここからAdvancedFilterを用いてデータ抽出をVBAを使って行いたいのですが、J1:O5のように結合されたセルが反映されず、正しく表示されません。

作ったコードは

Sub SampleExtraction()
Dim maxRow As Long
Dim InSheet As Worksheet
Set InSheet = Worksheets("sample")
Application.ScreenUpdating = False
InSheet.Range("J:O").Clear
maxRow = InSheet.Range("A65536").End(xlUp).Row
    With InSheet.Range(Cells(1, 1).MergeArea, Cells(maxRow, 6).MergeArea)
        .AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=InSheet.Range("H1:H2"), CopyToRange:=InSheet.Range("J1"), Unique:=False
    End With
Application.ScreenUpdating = True
End Sub


となっています。
ここからの改善点をお教えいただけるでしょうか?
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

基本的には「できません」
結合セルの一番左上以外のセルの内容はクリアされますので、
そこは空白セル扱いとなります。
また、抑々項目名行が2行の表にオートフィルタは対応しておりません。

裏技は…なくはないですが正常動作する(し続ける)保証はありません。

Office TANAKA 結合セルをオートフィルタで絞り込む

その元シートの見やすさを維持する為に結合セルを維持したいのであれば、
別シートに一行の項目名行を入れ、2行目以降に 参照…=sheet1!A2 
みたいな感じで一行の項目名の元データを用意して、
オートフィルタはそちらからやるのが良いかと思います。

あと、年齢で絞り込むだけであればVBAもオートフィルタも無しに、
関数だけでも実現できますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

結合セルは、先頭のセル(右上のセル)のみ値を持ち、他は空欄になります。
つまり、D1:F1 の結合セルは、D1 のみ値を持ち、E1 と F1 は空欄です。

AdvancedFilterは表の1行目を項目名と判断して、抽出します。
E1 と F1 は空欄ですので項目名がないと判断して、E列 F列のデータは抽出しません。

結合セルは使わずに下記のような表にすれば希望の結果を得られると思います。

表

どうしても結合セルにしたいのなら、結合を解除して上記の表のように項目名を代入してからAdvancedFilterを実行、その後、元の結合に戻す、というような処理にすることになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

C1セルからE1セルを結合しなくても、
セルの書式設定から
横位置を選択範囲内で中央にしたらそのように見えます。
なのでセルを結合せずに2行目をフィルターのタイトル行に使えるように、
するのが1案。

2案目は、
今のように特定の項目の特定の値だけを抽出するなら、

Sub test()
    Dim rngOld As Range
    Dim rngNew As Range
    Dim rngTarget As Range
    Dim strKey As String

    With Range("A1").CurrentRegion
        Set rngOld = Intersect(.Cells, .Offset(2))
    End With
    Set rngNew = Range("J2").Cells
    Let strKey = Range("H2").Value
    rngNew.CurrentRegion.Offset(1).ClearContents

    With rngOld     '.Columns(2)
        .Replace strKey, ""
        On Error Resume Next
        Set rngTarget = Intersect(.Cells, .SpecialCells(xlCellTypeBlanks).EntireRow)
        On Error GoTo 0
        If rngTarget Is Nothing Then Exit Sub
    End With

    rngTarget.Copy rngNew
    Union(rngOld, rngNew.CurrentRegion).SpecialCells(xlCellTypeBlanks).Value = strKey
End Sub

こんなやり方もあります。

が、エクセルを簡易データベースとして使うには、
データ1件→1行とし、タイトル行も含めて結合セルは使わない
ようにしましょう。

マクロでやるなら、
見せるシート
データベースとしてデータを置くシート
編集の途中を仮置きする作業用シート
と用意しておいて、
見せるシート上でいろいろ操作させて(ボタン等を押すなど)、
データを見せるように作るといいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    VAB 結合セルとループ

    前提・実現したいこと | 2013 | 1 | 山田 |      | 2 | 田中 |      | 3 | 佐藤 | 2014 | 1 | 山田 | 2015 | 1

  • 解決済

    エクセル VBA 1つのセルの値を分けて、逆並びで列に配置

    教えてください。 F列2行目から例えば、 43x43x5(×は大文字のx(エックス)で代用してます。) というサイズ「縦x横x高さ」が入力されています。 これを数値ごと

  • 解決済

    VBA Dictionaryオブジェクトの質問

    Dictionaryオブジェクトを使って割り付けをしています。 2つのシートがあります。 『抽出結果』シートと『条件』シートです。 『条件』シートのA列、B列、c列にデータが

  • 解決済

    VBAのDictionaryオブジェクトの質問

    Dictionaryオブジェクトを使って割り付けをしています。 2つのシートがあります。 『抽出結果』シートと『条件』シートです。 『条件』シートのA列、B列、c~複数列にデ

  • 解決済

    【VBA】ドメインのリスト一覧から配列に含まれるドメインのみを着色したい

    下記のような感じで、大量のドメインが記載されているExcelシートから、特定のドメインのみを着色するマクロを書きたいです。 Excelシートの例   A B C

  • 解決済

    エクセルVBA指定文字数を抽出したい

    エクセルファイルに”抽出結果”というシートがあり、"着手予定日"という列があります。 セルには9桁の数字が入っています。 1桁目~8桁目までで西暦4桁+月2桁+日2桁を表しています

  • 解決済

    VBA高速化について

    20個のエクセルファイルを読み込み、特定のシートにあるテーブルから特定の値を探し出し、その右横にあるセルの値を取り出します。 集計用のエクセルのテーブルでも、同じ特定の値をテーブル

  • 解決済

    指定範囲内のセルから数字を含まないセルを削除したい

    VBAを使ってエクセルの指定範囲内のセルから数字を含まないセルを削除したいと考えています。 具体的にはシート名”抽出”のJ列2行目から最終行までで、セル内に0~9の数字が入って

同じタグがついた質問を見る

  • VBA

    1458questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。