環境
- 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
###対策は?
一度コピぺして、その値を検証した後不要であれば削除する、というので可能だと思うのですが、現行の方法で何がダメなのか、何を加えればいいのかよく分かりません。どなたかご教示いただけないでしょうか?
試したこと
Set yard_rng = .ListColumns(2).DataBodyRange.SpecialCells(xlCellTypeVisible).Resize(.Rows.Count - 1)
→エラー- コピペして貼り付け先の値で確認→〇
- 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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/08/11 01:37 編集
退会済みユーザー
2021/08/16 02:13
退会済みユーザー
2021/08/16 02:31 編集