[[20160917183553]] 『結合したセルのオートフィルターで抽出する方法』(こた) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『結合したセルのオートフィルターで抽出する方法』(こた)

前回と同じコードについて質問です。

結合したセルをオートフィルターで抽出できる表を作成しています。
前回はマクロが実行できないということで、たくさんのアドバイスを頂き解決しました。ありがとうございます。
今回の質問はコードの内容についてです。
ご指摘頂けたらと思います。

コードの内容は前回同様、
1、作業列のセルQK6に=IF(C6="",QK5,C6)を挿入。
2、オートフィルでQK209までコピー。
3、QK6〜QK209まで選択してコピー。
4、隣の列QL6〜QL209を選択して「値」で貼り付け。
5、QL6〜QL209まで選択してコピー。
6、5を結合セルC6〜C209に「数式」で貼り付け。
7、D2から抽出したい文字列を読み取り、抽出。
8、作業列 QK、QLの数式及び値の削除

・結合セルC6〜C209
・抽出の項目A5〜G5
・抽出の表の範囲A5〜G209
・作業列 QK、QL

Sub 進研、ベネッセ_名前抽出()

   Range("QK6").FormulaR1C1 = "=IF(RC[-450]="""",R[-1]C,RC[-450])"
   Range("QK6").AutoFill Destination:=Range("QK6:QK209"), Type:=xlFillDefault
    Range("QK6:QK209").Select
    Selection.Copy
    Range("QL6:QL209").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    Selection.Copy
    Range("C6:C209").Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Range("A5:G5").Select
    Application.CutCopyMode = False
   ActiveCell.Range("A1:G1").Select
   Selection.AutoFilter
   ActiveSheet.Range("$A$5:$G$209").AutoFilter Field:=3, Criteria1:="*" & Range("D2").Value & "*"
    Range("QK6:QL211").Select
    Selection.ClearContents
End Sub

QLの値をC列に数式で貼りつけた時に、下記のように、空白のセルは空白のままにしたいのですが、

(QL列の値をC列に数式で貼り付け後)
C6・7(結合セル) 山田
C8・9(結合セル) 田中
C10・11(結合セル)伊東
C12・13(結合セル)鈴木
C14・15(結合セル)
C16・17(結合セル)
C18・19(結合セル)
  ・
  ・
  ・
C208・209(結合セル)

しかし、いまの=IF(C6="",QK5,C6)だと当然ながら
C14・15(結合セル)以降のセルが、下記の例の場合ですと、C12・13(結合セル)の「鈴木」になってしまいます。

(QL列の値をC列に数式で貼り付け後)
C6・7(結合セル) 山田
C8・9(結合セル) 田中
C10・11(結合セル)伊東
C12・13(結合セル)鈴木
C14・15(結合セル)鈴木
C16・17(結合セル)鈴木
C18・19(結合セル)鈴木
  ・
  ・
  ・
C208・209(結合セル)鈴木

C6〜C209の文字列もしくは空白を読み取って、最後に数式で貼りつけるときに
空白のセルは空白のままで・・という方法はあるのでしょうか?
私自身、マクロはもちろん関数にしてもあまり理解できておらず、ネットで集めた情報を組み合わせているような状態ですので、説明が分かりにくいかとは思いますが、皆さまのご指摘や意見を頂けたらと思いますので、宜しくお願い致します。

< 使用 Excel:Excel2013、使用 OS:Windows8 >


 要は、C列が2行ずつ結合され、そこに名前が入っている。その名前で絞り込みたい。
 そういう要件ですね。

 結合セルが存在する列に対して、オートフィルターをかけるということ自体は、ちょっとしたテクニック(というほどのものではないですが)で
 可能です。

 要件として冒頭で述べたことが正しいかどうかの確認をお願いします。

(β) 2016/09/17(土) 20:09


その通りです。
間違いありません。
(こた) 2016/09/17(土) 20:25

 では以下でお試しください。
 作業列は QK のみ使用。オリジナルシートには細工をせず、オリジナルシートをコピーした新規シートで作業しています。
 オリジナルシート名を "Sheet1" にしてありますが、★印のところ、実際のシート名に変更してください。

 Sub Sample()
    Dim shN As Worksheet
    Dim v() As String
    Dim i As Long
    Dim c As Range

    Application.ScreenUpdating = False

    Sheets("Sheet1").Copy After:=Sheets("Sheet1")   '★
    Set shN = ActiveSheet

    shN.AutoFilterMode = False          '念のため、いったん解除
    shN.Range("A5:G209").AutoFilter     '再設定 行数固定でいいのかなぁ?

    '=====結合セルの隠れたセルに、表のセルの値を埋め込む
    With shN.AutoFilter.Range
        With .Columns(3).Offset(1).Resize(.Rows.Count - 1)
            ReDim v(1 To .Rows.Count, 1 To 1)
            i = 1
            For Each c In .Cells
                If Len(c.Value) = 0 Then
                    v(i, 1) = v(i - 1, 1)
                Else
                    v(i, 1) = c.Value
                End If
                i = i + 1
            Next
        End With
    End With
    With shN.Range("QK1").Resize(UBound(v, 1))
        .Value = v
        .Copy
    End With
    With shN.AutoFilter.Range
        .Columns(3).Offset(1).Resize(UBound(v, 1)).PasteSpecial Paste:=xlPasteFormulas
        Application.CutCopyMode = False
    End With
    '=====埋め込み終了

    shN.AutoFilter.Range.AutoFilter Field:=3, Criteria1:="*" & shN.Range("D2").Value & "*"

    shN.Columns("QK").Clear
    shN.Select

 End Sub

(β) 2016/09/17(土) 20:37


 ↑のコード、こちらにある 結合セルシート上でのオートフィルター処理の一部を使いましたが
 当初の、そちらの 数式埋め込みによる処理のほうが、コード数も少なく、わかりやすかったですね。

 こたさん方式によるコードを以下に。(勉強になりました!)

 Sub Sample2()
    Dim shN As Worksheet
    Dim c As Range
    Dim n As Long

    Application.ScreenUpdating = False

    Sheets("Sheet1").Copy After:=Sheets("Sheet1")   '★
    Set shN = ActiveSheet

    shN.AutoFilterMode = False          '念のため、いったん解除
    shN.Range("A5:G209").AutoFilter     '再設定 行数固定でいいのかなぁ?
    n = shN.AutoFilter.Range.Rows.Count - 1

    '=====結合セルの隠れたセルに、表のセルの値を埋め込む
    With shN.Range("QK2").Resize(n)
        .Formula = "=IF(C6="""",C5,C6)"
        .Value = .Value
        .Copy
    End With

    With shN.AutoFilter.Range
        .Columns(3).Offset(1).Resize(n).PasteSpecial Paste:=xlPasteFormulas
        Application.CutCopyMode = False
    End With
    '=====埋め込み終了

    shN.AutoFilter.Range.AutoFilter Field:=3, Criteria1:="*" & shN.Range("D2").Value & "*"

    shN.Columns("QK").Clear
    shN.Select

 End Sub

(β) 2016/09/17(土) 21:07


 こんばんわ。

 要件は、
 空欄の結合セルに一つ上の人の名前が入ってしまうのを防ぎたい。
 抽出条件に合う、結合セル全てを表示したい。
 ですね。

 質問者さんのコードを使って、数式を修正して、後無駄なselectなどを省いてみました。

 Sub 進研ベネッセ_名前抽出()

    ActiveSheet.AutoFilterMode = False
    With Range("QK6:QK209")
        .Formula = "=IF(MOD(ROW(),2),C5&"""",C6&"""")"
        .Value = .Value
        .Copy
        Range("C6:C209").PasteSpecial Paste:=xlPasteFormulas
        .ClearContents
    End With
    Range("A5:G209").AutoFilter Field:=3, Criteria1:="*" & Range("D2").Value & "*"

 End Sub

(sy) 2016/09/17(土) 21:34


たくさんのアドバイスありがとございます。
お陰でようやく表を完成させることが出来ました。
本当にありがとうございました。
(こた) 2016/09/17(土) 22:37

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.