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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

1回答

1321閲覧

テーブルの可視セルの指定列の値がすべて同じかどうか確認したいが・・・SpecialCells(xlCellTypeVisible)で設定したRangeをFor文で回すと非表示セルの値が返ってくる

退会済みユーザー

退会済みユーザー

総合スコア0

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2021/08/10 08:15

編集2021/08/10 08:48

環境

  • Windows10 x64
  • Microsoft 365

やりたいこと

可視範囲を帳票テンプレをコピーしたものに貼付け、新しい書類として帳票を作成したい。作成する前に、フィルタ―範囲の内の指定列がすべて同じ値がどうか確認したい

問題

https://www.relief.jp/docs/excel-vba-for-each-loop-visible-cells.html

こちらを参考に可視列をループして、一つでも一致しないものが見つかればBooleanのflag(変数名flg)を立てて、条件処理を行いたいのですが、
可視セルをループさせて確認処理する際、

  • Set yard_rng = .ListColumns(2).DataBodyRange.SpecialCells(xlCellTypeVisible)

こちらのRangeの長さ(Count)は絞り込まれたデータ数通り

  • ループ内でValueを確認してみると、最初のItem(1).Valueは可視セルの最初の値、以降のItem(i).Valueは可視/不可視に関わらず最初の可視セルの次からの値になります
  • 可視範囲のコピーは問題なくできます

ソースコード

VBA

1Sub Sample() 2 Dim dTop As String 3 Dim ws_temp As Worksheet 4 Dim Count, yard_rows As Long 5 Dim yard_rng, rng As Range 6 Dim flg As Boolean 7 flg = True 8 9 dTop = Environ("UserProfile") & "\Desktop\" 10 Set ws_temp = ThisWorkbook.Worksheets("Template") 11 With Worksheets("Sheet1").ListObjects(1) 12 Count = WorksheetFunction.Subtotal(3, .ListColumns(1).DataBodyRange) 13 If Count = 0 Then 14 MsgBox "該当データがありません", vbCritical, "プログラムを終了します" 15 Exit Sub 16 End If 17 18 Set yard_rng = .ListColumns(2).DataBodyRange.SpecialCells(xlCellTypeVisible) 19 yard_rows = yard_rng.Cells.Count 20' Debug.Print yard_rows 21 22 If yard_rows > 1 Then 23 24 Debug.Print yard_rng.Item(1).Value 25 For i = 2 To yard_rows 26 Debug.Print yard_rng.Item(i).Value 27 If yard_rng.Item(i).Value <> yard_rng.Item(i - 1).Value Then flg = False 28 Next i 29 Debug.Print flg 30      'flgのTrue or Falseに基づき条件処理 31      ・・・・・・ 32 Exit Sub 33 End If 34 35'この後、テンプレシートを複製し、可視範囲を張り付けていきます。 36 37End Sub 38

###対策は?
一度コピぺして、その値を検証した後不要であれば削除する、というので可能だと思うのですが、現行の方法で何がダメなのか、何を加えればいいのかよく分かりません。どなたかご教示いただけないでしょうか?

試したこと

  1. Set yard_rng = .ListColumns(2).DataBodyRange.SpecialCells(xlCellTypeVisible).Resize(.Rows.Count - 1)→エラー
  2. コピペして貼り付け先の値で確認→〇
  3. For Eachを使う→〇

VBA

1 yard = yard_rng.Item(1).Value 2 For Each rng In yard_rng 3 If rng.Value <> yard Then flg = False 4 yard = rng.Value 5 Next rng

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

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

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

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

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

guest

回答1

0

ベストアンサー

非連続な複数のAreaの場合には、各Areaごとに処理を回せば大丈夫な気がします。

VBA

1 Dim yard_rng As Range, rng As Range 2 Dim flg As Boolean 3 Dim i, j, yard 4 5 6 yard = yard_rng.Item(1).Value 7 For i = 1 To yard_rng.Areas.Count 8 For j = 1 To yard_rng.Areas(i).Count 9 If yard_rng.Areas(i).Item(j).Value <> yard Then flg = False 10 Next j 11 Next i

ただ、そこまでするならForEachでいいじゃない、という気もします。

投稿2021/08/10 10:42

jinoji

総合スコア4585

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

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

退会済みユーザー

退会済みユーザー

2021/08/11 01:37 編集

ご回答ありがとうございます。 Areaを理解するのに少々時間がかかりましたが、 yard_rng.Areas.Count は表示行の中で隣り合っている塊の数だったので=「連続する領域」という感じでしょうか。 確かにこれでもできました!が、おっしゃる通りEachの方が簡単でスッキリするかもですね。 なぜそもそも .SpecialCells(xlCellTypeVisible) と絞っているRangeオブジェクトがitemやcellsでアクセスするとInvisibleなセルが含まれるのか、未だに謎です。。。
退会済みユーザー

退会済みユーザー

2021/08/16 02:13

開発を進めていると、2つの列の可視セルを同時にForループで参照しなくてはいけない部分がでてきたのですが、 Areaをご教示いただいたおかげで(Unionと組み合わせて)できるようになりました。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2021/08/16 02:31 編集

コメント削除
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問