VBAでオートフィルタを設定して、SUBTOTALの値を変えたいが、Rangeで設定すると成功して、Rowsで設定すると失敗する

実現したいこと

3行目以降にデータが挿入されており、特定の列でフィルタを設定したい。
それらでフィルタした結果をエクセルの計算式、SUBTOTAL(9,xxx)をつかって集計したい。

発生している問題・エラーメッセージ

Range("A3").AutoFilter Field:=1, Criteria1:="A" '3行目にオートフィルタを設定してA列(1列)目を"A"に格納された値ででフィルタ。
→SUBTOTALで計算した結果がエクセル上で反映されている

Rows(3).AutoFilter Field:=1, Criteria1:="A" '3行目にオートフィルタを設定してA列(1列)目を"A"に格納された値ででフィルタ。
→フィルタは設定されているにも関わらず、フィルタする前のSUBTOTALで計算した結果がエクセル上で反映されている(値が更新されていない)
VBA上ですべてのセルの再計算などを実行してみたものの効果がない。
マクロではなくマニュアルでSUBTOTALが記述されているセルを編集モードで開いて閉じると、値が更新される。

###質問事項
VBAでオートフィルタする場合、オートフィルタを設定するプログラムによっては、SUBTOTALの値などが上書きされない可能性があるのか教えていただけますと幸いです。

VBA

1Public EXL_X, EXL_Y As Single 2Public I, J As Single 3Public SUB_TOTAL_Y As Single 4Public Filter As String 5Public SUM As Single 6Public LAST_X As Single 7 8Sub EXL_CAL() 9 Range("B38:F41,AP4:BI35").Select 10 Range("AP4").Activate 11 Selection.ClearContents 12 13 EXL_X = 42 14 EXL_Y = 4 15 J = 0 16 17 Do Until Cells(3, EXL_X + J) = "" 18 I = 0 19 Do Until Cells(EXL_Y + I, 1).Value = "" 20' Cells(EXL_Y + I, EXL_X + J).Select 21 Cells(EXL_Y + I, EXL_X + J).Value = Cells(EXL_Y + I, EXL_X - 20 + J).Value * Cells(EXL_Y + I, EXL_X - 40 + J).Value 22 I = I + 1 23 Loop 24 J = J + 1 25 Loop 26 27 '=SUBTOTAL(9,AP4:AP34) 28 29 EXL_X = 42 '初期値に戻す 30 EXL_Y = 4 '初期値に戻す 31 I = 0 32 J = 0 33 34 Do Until Cells(EXL_Y, EXL_X + J).Value = "" 35 I = 0 36 Do Until Cells(EXL_Y + I, EXL_X + J).Value = "" 37 I = I + 1 38 Loop 39 Formula = "=SUBTOTAL(9,R" & EXL_Y & "C" & EXL_X + J & ":R" & EXL_Y + I - 1 & "C" & EXL_X + J & ")" 'SUBTOTALの式を設定 40 Debug.Print "挿入する関数→" & Formula 41 Cells(EXL_Y + I, EXL_X + J).FormulaR1C1 = Formula 'R1C1形式で関数を代入 42 J = J + 1 '列方向をインクリメント 43 Loop 44 45 LAST_X = EXL_X + J - 1 46 SUB_TOTAL_Y = EXL_Y + I 'サブトータルを入れている行番号を保存 47 EXL_X = 2 '初期値に戻す 48 EXL_Y = 38 '初期値に戻す 49 50 Do Until Cells(EXL_Y, 1).Value = "" 'Customerの検索対象がなくなるまで検索 51 EXL_X = 2 '変数初期化 52 Do Until Cells(37, EXL_X).Value = "" 'Qの検索対象がなくなるまで検索 53 Filter = Cells(EXL_Y, 1).Value 54 Debug.Print Filter & "でフィルタします" 55' Range(Cells(3, 1), Cells(SUB_TOTAL_Y - 1, LAST_X)).AutoFilter Field:=1, Criteria1:=Filter '3行目にオートフィルタを設定してA列(1列)目をFilterに格納された値ででフィルタ。 56 Range("A3").AutoFilter Field:=1, Criteria1:=Filter '3行目にオートフィルタを設定してA列(1列)目をFilterに格納された値ででフィルタ。 57' Rows(3).AutoFilter Field:=1, Criteria1:=Filter '3行目にオートフィルタを設定してA列(1列)目をFilterに格納された値ででフィルタ。** 58 SUM = 0 '変数初期化 59 I = 42 'AP列からスタート 60 Do Until Cells(SUB_TOTAL_Y, I).Value = "" 'SUBTOTAL行のデータがなくなるまで継続 61 If Cells(2, I).Value = Cells(37, EXL_X).Value Then 62 SUM = SUM + Cells(SUB_TOTAL_Y, I).Value 63 End If 64 I = I + 1 65 Loop 66 Debug.Print Cells(37, EXL_X).Value & "の合計は" & SUM 67 Cells(EXL_Y, EXL_X).Value = SUM 68 Range(Cells(3, 1), Cells(SUB_TOTAL_Y - 1, LAST_X)).AutoFilter 69' Rows(3).AutoFilter 70 EXL_X = EXL_X + 1 '変数をインクリメント 71 Loop 72 EXL_Y = EXL_Y + 1 '変数をインクリメント 73 Loop 74 75End Sub 76

コメントを投稿

0 コメント