[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『「特定行が空白の場合その列を非表示にするマクロ」[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
だいたいのことは↑ここに書いてあるけど、そこみて解りませんかね?
.End(xlToLeft)
は、Ctrlキー+←の操作で選択されるセルが取得できます。
EntireColumn
は、 Ctrlキー+Spaceキーの操作で得られるセル範囲が取得できます。
SpecialCells
は、
Ctrlキー+Gキーで出てくるダイアログボックスのセル選択を押した機能のことです。
で、括弧の中はその中で各各の選択するオプションを指定します。
他はわかりますかね?
(まっつわん) 2018/05/23(水) 08:06
説明不足でした。すみません。
まず、何をしたいのかと言いますと、
以下のように複数の商品と各種成分が羅列されている表があり、
フィルターで比較したい商品を選択し、どの成分が含まれているのかを調査したいのです。
ですが、成分は100個以上あり比較するには分かりづらいため、
成分の空白セルを非表示(左詰め)にするプログラムをVBAで組んでみようと試みている次第です。
Set r = Range("A3").Resize(, Range("IV3").部分の()内の値だけを変更して使用しようとしましたが、
如何にもこうにもうまくいきません... ↑これ自体を理解しておりません...
すみません、VBA初心者なもので、質問自体が愚問だったように思います。
ご教授いただけると助かります。
宜しくお願い致します。
(asa) 2018/05/23(水) 15:54
フィルター選択した複数商品名の[成分]セルに値が入っている列だけを抽出したいのです。
(asa) 2018/05/23(水) 18:01
>↑これ自体を理解しておりません...
ということは、「・変数「r」にセットされるセル範囲がどうなるかわからない。」
これですね。
Range("A3").Resize(, Range("IV3").End(xlToLeft).Column) とりあえず↑を分解してみましょう。
「Range("A3")」
対象となるセル(範囲)ですよね。
「.Resize」
セル範囲を広げる(狭める)メソッド(命令)です
「Range("IV3").End(xlToLeft).Column」
IV3セルから左に見ていって、最初に見つかるデータが入っているセルの列番号を取得します。
※まっつさんさんの↓の説明のとおり。
>.End(xlToLeft)
>は、Ctrlキー+←の操作で選択されるセルが取得できます。
ここまではOKですか?(ダメならちょっと読み返していただいて、〇〇が解りませんと追加質問してください。)
ただ、それって、アクティブシートの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
こちらは状況はなんとなくわかりましたけど、どのようにしたいのかは解りません。
行ごとに非表示にする列が選べるわけではないので、
成分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
宜しくお願い致します。
(asa) 2018/05/23(水) 21:37
(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
と、仰っていますが、その通りにしてますか?
(もこな2) 2018/05/23(水) 22:57
やりたかったことがバッチリと動作するようになりました。
大変助かりました。ありがとうございました。
(asa) 2018/05/23(水) 23:50
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.