[[20180523011339]] 『「特定行が空白の場合その列を非表示にするマクロ』(asa) ページの最後に飛ぶ

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

 

『「特定行が空白の場合その列を非表示にするマクロ」[250M] について』(asa)

投稿
[[20080702165519]] 『特定行が空白の場合その列を非表示にするマクロ』(250M) 
について...

Sub 列_非表示()

    Dim r As Range
    Set r = Range("A3").Resize(, Range("IV3").End(xlToLeft).Column) '仮に3行目とした
    r.SpecialCells(xlCellTypeBlanks).EntireColumn.Hidden = True
 End Sub

上記の解説をお願いしたいです。
こちらを使用して、マクロを仕上げたいのです。
宜しくお願い申し上げます。

< 使用 Excel:Excel2016mac、使用 OS:unknown >


どこまでがわかっていて、どこまでがわからないのでしょうか?
例えば↓でいうと、どれがわからないですか?

・変数「r」にセットされるセル範囲がどうなるかわからない。
・「SpecialCells(xlCellTypeBlanks)」がどういう意味かわからない。
・「EntireColumn」が何かわからない
・「Hidden = True」がわからない
(もこな2) 2018/05/23(水) 07:34


http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html#specialcells

だいたいのことは↑ここに書いてあるけど、そこみて解りませんかね?

.End(xlToLeft)
は、Ctrlキー+←の操作で選択されるセルが取得できます。

EntireColumn
は、 Ctrlキー+Spaceキーの操作で得られるセル範囲が取得できます。

SpecialCells
は、
Ctrlキー+Gキーで出てくるダイアログボックスのセル選択を押した機能のことです。
で、括弧の中はその中で各各の選択するオプションを指定します。

他はわかりますかね?

(まっつわん) 2018/05/23(水) 08:06


早速のご回答ありがとうございます。

説明不足でした。すみません。

まず、何をしたいのかと言いますと、
以下のように複数の商品と各種成分が羅列されている表があり、
フィルターで比較したい商品を選択し、どの成分が含まれているのかを調査したいのです。
ですが、成分は100個以上あり比較するには分かりづらいため、
成分の空白セルを非表示(左詰め)にするプログラムをVBAで組んでみようと試みている次第です。


番号 商品名 成分1 成分2 成分3 成分4 成分5 成分6 成分7 ・・・
1    a   ア           イ
2   b   カ   キ ク
3   c サ シ




Set r = Range("A3").Resize(, Range("IV3").部分の()内の値だけを変更して使用しようとしましたが、
如何にもこうにもうまくいきません... ↑これ自体を理解しておりません...
すみません、VBA初心者なもので、質問自体が愚問だったように思います。

ご教授いただけると助かります。
宜しくお願い致します。

(asa) 2018/05/23(水) 15:54


上記説明が少し分かりづらいように感じたので追記です。

フィルター選択した複数商品名の[成分]セルに値が入っている列だけを抽出したいのです。
(asa) 2018/05/23(水) 18:01


2018/05/23(水) 15:54 の投稿に対してです。

>↑これ自体を理解しておりません...
ということは、「・変数「r」にセットされるセル範囲がどうなるかわからない。」
これですね。

 Range("A3").Resize(, Range("IV3").End(xlToLeft).Column)
とりあえず↑を分解してみましょう。

「Range("A3")」
 対象となるセル(範囲)ですよね。

「.Resize」
 セル範囲を広げる(狭める)メソッド(命令)です

「Range("IV3").End(xlToLeft).Column」
 IV3セルから左に見ていって、最初に見つかるデータが入っているセルの列番号を取得します。
 ※まっつさんさんの↓の説明のとおり。
  >.End(xlToLeft)
  >は、Ctrlキー+←の操作で選択されるセルが取得できます。

ここまではOKですか?(ダメならちょっと読み返していただいて、〇〇が解りませんと追加質問してください。)


上記をふまえると、「A3」というセル範囲を「(省略しているので)行は変更なし、列を3行目の最終列の列番号分増やしなさい。
という意味になっているので、
たとえば、D3セルより右にデータが入ってなければ、
A3セルを、「IV3セル」から左に見ていって最初に見つかるD3セルの列番号。つまり4列分になるように増やしなさい。
ということになって、A3セルがD3まで拡張されて、「A3:D3」というセル範囲が変数「r」にセットされます。

ただ、それって、アクティブシートの3行目のA〜最終列なので、そこだけ見れば↓のほうがわかりいいかも・・・やってることは同じ(はず)です。

    Sub Sample()
        Dim r As Range

        With ActiveSheet
            Set r = .Range(.Range("A3"), .Cells(3, .Columns.Count).End(xlToLeft))
        End With

        Debug.Print r.Address(0, 0)

    End Sub

(もこな2) 2018/05/23(水) 20:03


>フィルターで比較したい商品を選択し、どの成分が含まれているのかを調査したいのです。
>ですが、成分は100個以上あり比較するには分かりづらいため、
>成分の空白セルを非表示(左詰め)にするプログラムをVBAで組んでみようと試みている次第です。

こちらは状況はなんとなくわかりましたけど、どのようにしたいのかは解りません。
行ごとに非表示にする列が選べるわけではないので、
成分2が両方に無いなら非表示にしてもいいでしょうけど、片っぽだけある場合はどうするんでしょうか?

わたしなら、抽出した商品を行ごと別シートにコピペして、空白セルを削除して、左に詰めますかね・・・
「SpecialCells(xlCellTypeBlanks)」が理解できていれば、すぐできるとおもいます。

逆にどちらにも含まれていなければ非表示っていうようにしたいのでしょうか?
ちょっと質問からはそこは読み取れないですが、その場合だったら、もうちょい手を加えないとできないとおもいます。(少なくとも提示のコードは1行しか対象にしていません。)

(もこな2) 2018/05/23(水) 20:16


ちょっとミスしました。

誤 少なくとも提示のコードは1行しか対象にしていません。

正 少なくとも、提示のコードは1行しか対象にしていませんし、EntireColumn使ったら、どちらかのセルがブランクだったら、非表示にする列ということになっちゃいます。
(もこな2) 2018/05/23(水) 20:20


ご丁寧なご説明ありがとうございました。
利用しようとしていたコードの意味が理解できました。
こちらでは、やりたいように動作しないのは当たり前でしたね...

行ごとに非表示にする列が選べるわけではないので、 成分2が両方に無いなら非表示にしてもいいでしょうけど、片っぽだけある場合はどうするんでしょうか? 逆にどちらにも含まれていなければ非表示っていうようにしたいのでしょうか? おっしゃる通り、どちらにも含まれていない成分の列は非表示にし、
片っぽあるいは一つ以上ある場合はその成分の列は空白セルもそのまま表示させておきたいのです。

例えば、人のアレルギーを調査する際に、
AさんBさんCさんの中で、(B2:B4セル)
AさんBさんは蕎麦アレルギー(Cさんは空白セルのままC列残す)
誰も蟹アレルギーではない(D列非表示)
Aさんだけピーナッツアレルギー(CさんBさんは空白セルのままE列残す)
↑のように表示させたいのです。

別シートにコピペして手動で非表示すればよい話なのですが、成分列が多いため、
自動化できたら嬉しいのです...
ご面倒をおかけしますが、ご教授いただきたいです。宜しくお願い致します。

(asa) 2018/05/23(水) 21:29


SpecialCells(xlCellTypeBlanks)
↑を理解すれば可能でしょうか?
(asa) 2018/05/23(水) 21:34

ちなみに、行(上記でいうところのB列)にはすべて値が入っている表です。

宜しくお願い致します。
(asa) 2018/05/23(水) 21:37


Columns("C:DL").SpecialCells(xlCellTypeBlanks).Select
空白セルは無事選択することができました。
ここから、その列に一つ以上値が入っていれば選択解除、
すべて空白セルなら非表示
というように条件文コードを考えれば宜しいのでしょうか...

(asa) 2018/05/23(水) 22:03


シートモジュールでの参考例です。

Sub 空白列非表示()

    Dim 非表示 As Range
    Dim c As Range
    If Me.FilterMode = False Then Exit Sub
    Call 再表示
    For Each c In Me.AutoFilter.Range.Columns
        If WorksheetFunction.Subtotal(3, c) = 1 Then    '項目行以外ブランクなら
            If 非表示 Is Nothing Then
                Set 非表示 = c
            Else
                Set 非表示 = Union(非表示, c)           '対象列を集合
            End If
        End If
    Next
    If Not 非表示 Is Nothing Then 非表示.EntireColumn.Hidden = True
End Sub

Sub 再表示()

    If Me.FilterMode Then
        Me.AutoFilter.Range.Columns.Hidden = False
    Else
        Me.UsedRange.Columns.Hidden = False
    End If
End Sub

(kazuo) 2018/05/23(水) 22:09


ご回答ありがとうございます。

「Meキーワードの使い方が正しくありません」
とメッセージエラーが出るのですが、
AutoFilterメソッドの記述が必要でしょうか?
(asa) 2018/05/23(水) 22:34


kazuoさんは、シートモジュールでの参考例です。

と、仰っていますが、その通りにしてますか?
(もこな2) 2018/05/23(水) 22:57


もこな2さん、kazuoさん

やりたかったことがバッチリと動作するようになりました。
大変助かりました。ありがとうございました。

(asa) 2018/05/23(水) 23:50


コメント返信:

[ 一覧(最新更新順) ]


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