[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『空白行のグループ化』(Ty)
マクロで B列およびD列ともに空白の行をグループ化をしたい
例題の 8行目〜13行目、24行目〜25行目を 各グループ化する
お教えください
よろしくお願いします
|[B] |[C]|[D] [1] | | | [2] |東京 | |大阪 [3] |東京一郎 | |大阪四郎 [4] |東京次郎 | |大阪五郎 [5] |東京三郎 | |大阪一郎 [6] |東京四郎 | |大阪次郎 [7] | | |大阪三郎 [8] | | | [9] | | | [10]| | | [11]| | | [12]| | | [13]| | | [14]|名古屋 | |福岡 [15]|名古屋一郎| |福岡一郎 [16]|名古屋次郎| |福岡次郎 [17]|名古屋三郎| |福岡三郎 [18]|名古屋四郎| |福岡桜子 [19]|名古屋五郎| |福岡楓 [20]| | |福岡由紀恵 [21]| | |福岡四郎 [22]| | |福岡五郎 [23]| | |福岡花子 [24]| | | [25]| | | [26]|札幌 | |京都 [27]|札幌三郎 | |京都四郎 [28]|札幌四郎 | |京都五郎 [29]|札幌五郎 | |京都花子 [30]|札幌花子 | |京都桃子 [31]|札幌桃子 | | [32]|札幌桜子 | | [33]|札幌楓 | | [34]|札幌由紀恵| | [35]| | |
< 使用 Excel:unknown、使用 OS:unknown >
参考になりますか? Sub test() Dim rng1 As Range Dim rng2 As Range
Set rng1 = Range([A1], Cells(Rows.Count, "A").End(xlUp)).SpecialCells(xlCellTypeBlanks).EntireRow Set rng2 = Range([B1], Cells(Rows.Count, "B").End(xlUp)).SpecialCells(xlCellTypeBlanks).EntireRow Debug.Print Intersect(rng1, rng2).Address End Sub 必要に応じて、空白セルが無い場合のエラー対応を追加してください。 (xyz) 2024/02/25(日) 12:39:26
ああ、列が違っていました。修正してください。 グループ化というのが曖昧ですが、 .Areasで各エリアのコレクションが得られます。 (xyz) 2024/02/25(日) 12:46:19
アウトラインのことかしら? (稲葉) 2024/02/25(日) 12:50:39
(Ty) 2024/02/25(日) 12:57:52
できました
差分の方で見ました
(Ty) 2024/02/25(日) 13:48:53
(隠居Z) 2024/02/25(日) 14:31:41
Option Explicit Sub OneInstanceMain() Dim i As Long Dim cnt As Long Dim lR As Long Dim r As Range Dim rr As Range Dim sy As Long Dim ey As Long With Worksheets("Sheet1") lR = .Cells(.Rows.Count, 2).End(xlUp).Row Set rr = .Range(.Cells(1, 2), .Cells(lR, 4)) End With rr.ClearOutline For i = 2 To lR If rr(i, 1) = "" And rr(i, 3) = "" Then cnt = cnt + 1 If cnt = 1 Then sy = i Else If cnt > 0 Then ey = i - 1 Set r = rr.Rows(sy & ":" & ey) r.Rows.Group cnt = 0 End If End If Next Worksheets("Sheet1").Outline.ShowLevels RowLevels:=1 End Sub (隠居Z) 2024/02/25(日) 14:43:19
既に、トピ主さまの要望による...本物のアウトラインマクロは解決済みです。
余興です。
アウトラインでは、個別に行範囲を操作できるのが利点ですが 一括で表示と非表示を切替するのも、場合によってはとっても便利ですね。
では...まず、アウトラインを解除して
Sub アウトライン一括クリア() Cells.ClearOutline End Sub
それから(xyz)さん提案の続きをして遊んでみた。
Sub test() Dim rng1 As Range, rng2 As Range Set rng1 = Range([B1], Cells(Rows.Count, "B").End(xlUp)).SpecialCells(xlCellTypeBlanks).EntireRow Set rng2 = Range([D1], Cells(Rows.Count, "D").End(xlUp)).SpecialCells(xlCellTypeBlanks).EntireRow 'Debug.Print Intersect(rng1, rng2).Address(0, 0) ' 8:13,24:25 Dim tmp As Variant, i As Long tmp = Split(Intersect(rng1, rng2).Address(0, 0), ",") For i = 0 To UBound(tmp) With Sheets("Sheet1").Rows(tmp(i)) .Hidden = Not .Hidden End With Next i End Sub
おしまい(笑) (あみな) 2024/02/25(日) 16:19:15
upし直しました。(セル範囲の特定方法は変わりませんが) Sub test() Dim rng1 As Range Dim rng2 As Range Dim r As Range With Worksheets("Sheet1") Set rng1 = .Range([B2], .Cells(Rows.Count, "B").End(xlUp)).SpecialCells(xlCellTypeBlanks).EntireRow Set rng2 = .Range([D2], .Cells(Rows.Count, "D").End(xlUp)).SpecialCells(xlCellTypeBlanks).EntireRow For Each r In Intersect(rng1, rng2).Areas r.Group Next .Outline.ShowLevels RowLevels:=1 End With End Sub # 既に回答いただいていましたが、折角なので。 (xyz) 2024/02/25(日) 16:33:16
隠居Z 様のマクロで解決済ですが
xyz 様のマクロでは
13行目がグループ化
25行目がグループ化
37行目〜45行目がグループ化
49行目〜56行目がグループ化
となりました
希望は
24行目〜25行目がグループ化
としたいのですが
です
後学のためお教えいただけるようでしたら
お願いします
あみな様のマクロでは
同じ個所が非表示になりました
(1行目除く)
(Ty) 2024/02/26(月) 09:43:49
(Ty)さんへ
私のは、アウトラインの設定はしないタイプです。 単純に、B列とD列が空白行があるなら、非表示と表示を 同一ボタンから切り替えると言った動作です。
因みに、1行目は見出しがないのなら、下記は
Set rng1 = Range([B2] Set rng2 = Range([D2]
としないと対象の行になってしまいます。 (あみな) 2024/02/26(月) 10:20:33
↑↑の説明訂正
誤
希望は
24行目〜25行目がグループ化
としたいのですが
正
希望は
8行目〜13行目がグループ化
24行目〜25行目がグループ化
としたいのですが
あみなさん
ご返事ありがとうございます
理解できました(非表示等)
ただ、非表示となった行が 13行目と25行目が選択された
マクロのどこの箇所で行指定されたのかが
理解できません
(Ty) 2024/02/26(月) 11:04:50
ん?
>ただ、非表示となった行が 13行目と25行目が選択された >マクロのどこの箇所で行指定されたのかが理解できません
それは、私に言っているのかな?それとも。。。 (xyz)さんなのか良く解りませんが…推定で^^;
対象の行を、どうやって取得しているか?って事ならですが SpecialCells(xlCellTypeBlanks)の部分で、私のも、(xyz)さんのも 取得しています。下記のような表があるとして
|[A]|[B] [1]|〇 |〇 [2]| | [3]|〇 |〇 [4]| |〇
この表の範囲を、UsedRange で取得しているのですが その中で、空白セルを下のマクロでは選択します。
Sub 空白セルを取得選択する() Dim rng As Range Set rng = _ ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks) rng.Select End Sub
参考URL https://www.relief.jp/docs/excel-vba-find-blank-cells.html
でもって、範囲を Set rng1 とSet rng2 に確保してから 私のは、Split くんと Intersect くんで頑張って貰って tmp くんに格納してから、ループで処理しています。
↓ここです。 tmp = Split(Intersect(rng1, rng2).Address(0, 0), ",")
↓(xyz)さんのはここで処理していますね。 Intersect(rng1, rng2).Areas
Intersectメソッドの 戻り値に 2列の中で、空白の対象行を (重なっている)部分を特定させていると言えばいいでしょうか。。
(あみな) 2024/02/26(月) 11:41:29
あみなさん 詳細の説明 ありがとうございます
※Intersectメソッドの 戻り値に 2列の中で、空白の対象行を (重なっている)部分を特定させている
となると最初の表では 8行目〜13行目が対象となります。
しかし 8行目のみが非表示されます(8行目〜13行目が空白重なっているが) その辺がわかりません
(Ty) 2024/02/26(月) 12:27:17
ええ...こちらでは、B列とD列に 同じ行が空白なら って条件でちゃんと、8行目から13行目迄が、私のも
非表示と表示を切替できますけど。 因みに、(xyz)さんのもちゃんとなるかと思いますが。。。
もしかして、B列とD列の 9行目から13行目のどちらかに 数式で空白がありませんか? (あみな) 2024/02/26(月) 12:40:04
あみなさん、コメントいただきありがとうございました。お手数かけました。
不思議ですね。 空白に見えて空白ではないセルがあるような気がします。 ・最初の行から、データのある最終行までの4列を選択したうえで、 ・「検索と選択」の「ジャンプ」- 「セル選択」機能を使って、「空白セル」を指定 してみて下さい。 想定したとおりのセルが空白セルとして選択されていますか? # 手元で仕様どおりの結果が得られたことを確認して投稿しています。
念のため、こういった確認をされると理解が進むかもしれません。 With Worksheets("Sheet1") Set rng1 = .Range([B2], .Cells(Rows.Count, "B").End(xlUp)).SpecialCells(xlCellTypeBlanks).EntireRow Set rng2 = .Range([D2], .Cells(Rows.Count, "D").End(xlUp)).SpecialCells(xlCellTypeBlanks).EntireRow Debug.Print rng1.Address ' add Debug.Print rng2.Address ' add Debug.Print Intersect(rng1, rng2).Address ' add For Each r In Intersect(rng1, rng2).Areas Debug.Print r.Address ' add r.Group Next .Outline.ShowLevels RowLevels:=1 End With '変数宣言等は不要ということではなく、投稿にあたって単に記載を省略しただけです。 (xyz) 2024/02/26(月) 12:49:43
該当行をデリートして
確認しましたら できました
個々において理解できました
ありがとうございました
(Ty) 2024/02/26(月) 12:56:51
deleteする前に確認して原因を追究すべきではなかったですか? 提示したコードは実行してもらったのでしょうか。そんな短時間で検討できるんですか。 結果オーライでなく、原因をよく追及して欲しかったです。何度も繰り返してしまう懸念があります。
(xyz) 2024/02/26(月) 13:18:19
※deleteする前に確認して原因を追究すべきではなかったですか? すみません
※提示したコードは実行してもらったのでしょうか。そんな短時間で検討できるんですか (あみな) 2024/02/26(月) 12:40:04 のあとすぐに あみなさんのコードと xyzさんのコードを実行し確認はしました
※結果オーライでなく、原因をよく追及して欲しかったです。何度も繰り返してしまう懸念があります 事前に空欄の確認をしてなかった等を 十分反省し今後に生かします。 ご指導を感謝します (Ty) 2024/02/26(月) 13:35:04
※・「検索と選択」の「ジャンプ」- 「セル選択」機能を使って、「空白セル」を指定 してみて下さい。 想定したとおりのセルが空白セルとして選択されていますか?
今確認しました
ご指摘どおり B8ほか空白にみえても 空白となっていませんでした 該当セルをダブルクリックしたあと 実質空白としました。 なぜそのように状態になったか、思い出すことができませんでした 今後ともよろしくお願いします
(Ty) 2024/02/26(月) 13:56:06
思い出しました
例題の表で各名前を作成した時、& で作成し 値で貼り付けしました。 それが影響しました (Ty) 2024/02/26(月) 14:04:31
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.