Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


9807 / 13644 ツリー ←次へ | 前へ→

【25313】subtotal tamago 05/5/27(金) 21:29 質問[未読]
【25318】Re:subtotal ponpon 05/5/27(金) 22:55 回答[未読]
【25319】Re:subtotal kobasan 05/5/27(金) 23:18 回答[未読]
【25320】Re:subtotal tamago 05/5/27(金) 23:24 お礼[未読]
【25335】Re:subtotal nossori 05/5/28(土) 20:51 質問[未読]
【25337】Re:subtotal kobasan 05/5/28(土) 21:38 回答[未読]
【25338】Re:subtotal ponpon 05/5/28(土) 22:15 回答[未読]
【25339】Re:subtotal kobasan 05/5/29(日) 0:23 発言[未読]
【25343】Re:subtotal kobasan 05/5/29(日) 8:52 発言[未読]
【25347】Re:subtotal ponpon 05/5/29(日) 10:08 発言[未読]
【25348】Re:subtotal ponpon 05/5/29(日) 10:24 発言[未読]
【25352】Re:subtotal kobasan 05/5/29(日) 11:33 発言[未読]
【25364】Re:subtotal ponpon 05/5/29(日) 19:56 お礼[未読]

【25313】subtotal
質問  tamago  - 05/5/27(金) 21:29 -

引用なし
パスワード
   vba超初心者です。f列の最下端から2行下にsubtotal関数を挿入しオートフィルターで抽出した個数をカウントさせようとしています。
subtotal関数の範囲はf2からf列の下端までです。
Range("f1").End(xlDown).Select
Selection.Offset(3, 0).Select
行 = Range("f1").CurrentRegion.Rows.Count
ActiveCell.FormulaR1C1 = "=SUBTOTAL(3,R[行]C:R[-2]C)"
以下略
これを実行すると最終行のところで"アプリケーション定義またはオブジェクト定義のエラーです。"
と出てきます。行のところに−をつけたりいろいろやったのですが、
どうしてもできませんでした。よろしくご教授ください。

【25318】Re:subtotal
回答  ponpon  - 05/5/27(金) 22:55 -

引用なし
パスワード
   こんばんは。

>オートフィルターで抽出した個数をカウントさせようとしています。

オートフィルターで抽出する表が"sheet1"にあり、項目が1行目にあるとすれば、
もっと簡単な方法がありそうですが、
オートフィルターをかけた後で

With Worksheets("sheet1")
 On Error Resume Next
   MsgBox .AutoFilter.Range.Columns(1).SpecialCells _
       (xlCellTypeVisible).Count - 1
 On Error GoTo 0
End With

で、取得できると思いますが・・

こういう意味でなかったら、ごめんね!

【25319】Re:subtotal
回答  kobasan  - 05/5/27(金) 23:18 -

引用なし
パスワード
   ▼tamago さん ponponさん 今晩は

>vba超初心者です。f列の最下端から2行下にsubtotal関数を挿入しオートフィルターで抽出した個数をカウントさせようとしています。
>subtotal関数の範囲はf2からf列の下端までです。
>Range("f1").End(xlDown).Select
>Selection.Offset(3, 0).Select
>行 = Range("f1").CurrentRegion.Rows.Count
>ActiveCell.FormulaR1C1 = "=SUBTOTAL(3,R[行]C:R[-2]C)"
>以下略
>これを実行すると最終行のところで"アプリケーション定義またはオブジェクト定義のエラーです。"
>と出てきます。行のところに−をつけたりいろいろやったのですが、

'行は変数でので""の外に出すといいです。SUBTOTAL(3,R[-" & (行 + 2) & "]C:R[-3]C)"

Sub test()
Dim lastC As Range
  On Error Resume Next
  Sheets(1).Columns("F").SpecialCells(xlCellTypeFormulas, 23).ClearContents
  On Error GoTo 0
  Set lastC = Range("f65536").End(xlUp)
  行 = Range("f1").CurrentRegion.Rows.Count
  lastC.Offset(3, 0).FormulaR1C1 = "=SUBTOTAL(3,R[-" & (行 + 2) & "]C:R[-3]C)"
End Sub

【25320】Re:subtotal
お礼  tamago  - 05/5/27(金) 23:24 -

引用なし
パスワード
   ▼kobasan さん ponponさん どうもありがとうございました。
おかげさまで、個数をカウントして別のセルに貼り付けることが
できました。VBAは何度も挫折して、やっと最終セルの取得や
R1C1などがわかるようになり、今回で変数の使い方を覚えました。
これからもかめのようにこつこつとがんばっていきます。

【25335】Re:subtotal
質問  nossori  - 05/5/28(土) 20:51 -

引用なし
パスワード
   ▼kobasan さん:

今晩は、私もオートフィルターをかけて、このような体験をしたのですが・・・
オートフィルターをかけたがため、計算(個数)されているのですが、隠れて
しまい(非表示され)ます。それを避ける方法はあるのでしょうか。

例えば次のような例です
1  項目 ▽
2  22
3  33
4  44
5  55
6  22
7  55
8  100


項目22で絞り、カウントするとカウント数が出ません
出す方法で何か良い方法はあるでしょうか。


>Sub test()
>Dim lastC As Range
>  On Error Resume Next
>  Sheets(1).Columns("F").SpecialCells(xlCellTypeFormulas, 23).ClearContents
>  On Error GoTo 0
>  Set lastC = Range("f65536").End(xlUp)
>  行 = Range("f1").CurrentRegion.Rows.Count
>  lastC.Offset(3, 0).FormulaR1C1 = "=SUBTOTAL(3,R[-" & (行 + 2) & "]C:R[-3]C)"
>End Sub

【25337】Re:subtotal
回答  kobasan  - 05/5/28(土) 21:38 -

引用なし
パスワード
   ▼nossori さん 今晩は。

>
>今晩は、私もオートフィルターをかけて、このような体験をしたのですが・・・
>オートフィルターをかけたがため、計算(個数)されているのですが、隠れて
>しまい(非表示され)ます。それを避ける方法はあるのでしょうか。
>
>例えば次のような例です
>1  項目 ▽
>2  22
>3  33
>4  44
>5  55
>6  22
>7  55
>8  100
>
>
>項目22で絞り、カウントするとカウント数が出ません
>出す方法で何か良い方法はあるでしょうか。
>
>'以下のように、オートフィルターをかけたあと、
' ブロージャ「表示件数」を配置すればよいと思います。

Sub MainMacro()
  
  'オートフィルターをかけるコード
  表示件数 "F"
  
End Sub

Sub 表示件数(列 As String)
Dim 行 As Long
Dim lastC As Range
  On Error Resume Next
  Sheets(1).Columns(列).SpecialCells(xlCellTypeFormulas).ClearContents
  On Error GoTo 0
  Set lastC = Range(列 & 65536).End(xlUp)
  行 = Range(列 & 1).CurrentRegion.Rows.Count
  lastC.Offset(3, 0).FormulaR1C1 = "=SUBTOTAL(3,R[-" & (行 + 2) & "]C:R[-3]C)"
End Sub

【25338】Re:subtotal
回答  ponpon  - 05/5/28(土) 22:15 -

引用なし
パスワード
   nossoriさん、kobasan さん こんばんは。

前もって行方向に空白セルを挟んで数式を入れていれば問題なく、
表示するようですが・・

VBAならこんなんでもできると思います。
なんかもっとスマートな方法はないものでしょうか?
なんかベタでちょっといや。。。

Sub test()
  Dim myR As Range
  Dim cnt As Long
  Dim 行 As Long
 
 With Worksheets("sheet1")
  Set myR = .Range("A1").CurrentRegion
  行 = myR.Rows.Count
  
  myR.AutoFilter field:=1, Criteria1:="22"
  
   On Error Resume Next
   cnt = .AutoFilter.Range.Columns(1).SpecialCells _
       (xlCellTypeVisible).Count - 1
   On Error GoTo 0
    With .Range("A" & 行).Offset(3, 0)
    .ClearContents
    .Value = cnt
    End With
  End With
End Sub

【25339】Re:subtotal
発言  kobasan  - 05/5/29(日) 0:23 -

引用なし
パスワード
   皆さん 夜分遅くですが 今晩は。

>
>前もって行方向に空白セルを挟んで数式を入れていれば問題なく、
>表示するようですが・・
>

件数が変化する場合、数式を移動させることになるから、
この方法は、使い難いかもしれませんね。
件数が変化しないときは、この方法は簡単でいいですね。

【25343】Re:subtotal
発言  kobasan  - 05/5/29(日) 8:52 -

引用なし
パスワード
   ▼ponpon さん おはようございます。

'提示のコードでは、件数が変化したとき、表示件数を消去できないので、
'表示件数を消去する方法を検討してみました。
'こんな具合でどうですか。

Sub test6()
  Dim myR As Range
  Dim cnt As Long
  Dim 行 As Long

 With Worksheets("sheet1")
  Set myR = .Range("A1").CurrentRegion
  行 = myR.Rows.Count
  '
  '-------------件数が変化したとき、空白行を調べて件数消去
  myR.AutoFilter
  With Range("A65336").End(xlUp)
    If .Offset(-1) = "" And .Offset(-2) = "" Then .Value = Empty
  End With
  MsgBox ""
  '------------------------ここまで追加
 
  myR.AutoFilter field:=1, Criteria1:="22"
  
   'On Error Resume Next '<----ない方がいいです
   cnt = .AutoFilter.Range.Columns(1).SpecialCells _
       (xlCellTypeVisible).Count - 1
   'On Error GoTo 0'<----ない方がいいです
    With .Range("A" & 行).Offset(3, 0)
    '.ClearContents   '<---件数が変化したとき、消去してくれない
    .Value = cnt
    End With
  End With
End Sub

【25347】Re:subtotal
発言  ponpon  - 05/5/29(日) 10:08 -

引用なし
パスワード
   おはようございます。
朝早くからありがとうございます。

消えるか消えないかいろいろと試行錯誤したのですが、
オートフィルター後の「行」取得ではずれてしまうので
オートフィルター前で取得すると「行」は固定されると考えたのです。
EXCELのバージョンの違いでしょうか?
私の環境では、件数が変わっても消去してくれますが・・
ちなみに EXCEL2003です。
オートフィルターの解除は手動でしています。
それと、
> 'On Error Resume Next '<----ない方がいいです
>   cnt = .AutoFilter.Range.Columns(1).SpecialCells _
>       (xlCellTypeVisible).Count - 1
>   'On Error GoTo 0'<----ない方がいいです

これは、SpecialCellsを使うときは、おまじないのように
使っているのですが・・・
あっそうか必ず項目があるからですね。
今気づきましたが、このまま送ります

【25348】Re:subtotal
発言  ponpon  - 05/5/29(日) 10:24 -

引用なし
パスワード
   おはようございます。
オートフィルターを解除後
実行するようにしましたが、
ちゃんと書き直しをしてくれます。

 With Worksheets("sheet1")
  Set myR = .Range("A1").CurrentRegion
  行 = myR.Rows.Count
  myR.AutoFilter  ’←追加
  myR.AutoFilter field:=1, Criteria1:=Range("c1").Text
  
   cnt = .AutoFilter.Range.Columns(1).SpecialCells _
       (xlCellTypeVisible).Count - 1
    With .Range("A" & 行).Offset(3, 0)
    .ClearContents
    .Value = cnt
    End With
  End With

【25352】Re:subtotal
発言  kobasan  - 05/5/29(日) 11:33 -

引用なし
パスワード
   ▼ponpon さん 今日は 

もし、最終データと件数を入れた行の間の空白2行にデータを入れた場合、
データは消えなくなります。

こんなことが起こるかもしれないと考えたら、
【25337】のコードで間に合っているのかな。

【25364】Re:subtotal
お礼  ponpon  - 05/5/29(日) 19:56 -

引用なし
パスワード
   そういう意味ですね。
わかりました。
ありがとうございました。

9807 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free