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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

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

Q&A

解決済

3回答

7657閲覧

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

gitsunnie

総合スコア8

VBA

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

0グッド

0クリップ

投稿2018/06/14 11:42

編集2018/06/14 11:43

イメージ説明

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

作ったコードは

vba

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

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

VBA

1 2Sub test() 3 Dim rngOld As Range 4 Dim rngNew As Range 5 Dim rngTarget As Range 6 Dim strKey As String 7 8 With Range("A1").CurrentRegion 9 Set rngOld = Intersect(.Cells, .Offset(2)) 10 End With 11 Set rngNew = Range("J2").Cells 12 Let strKey = Range("H2").Value 13 rngNew.CurrentRegion.Offset(1).ClearContents 14 15 With rngOld '.Columns(2) 16 .Replace strKey, "" 17 On Error Resume Next 18 Set rngTarget = Intersect(.Cells, .SpecialCells(xlCellTypeBlanks).EntireRow) 19 On Error GoTo 0 20 If rngTarget Is Nothing Then Exit Sub 21 End With 22 23 rngTarget.Copy rngNew 24 Union(rngOld, rngNew.CurrentRegion).SpecialCells(xlCellTypeBlanks).Value = strKey 25End Sub

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

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

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

投稿2018/06/17 04:37

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

表

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

投稿2018/06/14 12:41

hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

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

投稿2018/06/14 12:32

shinobu_osaka

総合スコア456

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問