Excel VBA質問箱 IV

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

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


3547 / 13645 ツリー ←次へ | 前へ→

【61483】小計の連続処理 みやちゃん 09/5/13(水) 10:30 質問[未読]
【61484】Re:小計の連続処理 ゆみこん 09/5/13(水) 10:47 発言[未読]
【61485】Re:小計の連続処理 ゆみこん 09/5/13(水) 11:06 発言[未読]
【61489】Re:小計の連続処理 ひつまぶし 09/5/13(水) 12:54 発言[未読]
【61493】Re:小計の連続処理 ゆみこん 09/5/13(水) 14:54 発言[未読]
【61490】Re:小計の連続処理 みやちゃん 09/5/13(水) 12:56 質問[未読]
【61494】Re:小計の連続処理 ゆみこん 09/5/13(水) 15:01 発言[未読]
【61503】Re:小計の連続処理 みやちゃん 09/5/13(水) 22:25 お礼[未読]

【61483】小計の連続処理
質問  みやちゃん  - 09/5/13(水) 10:30 -

引用なし
パスワード
   初めての投稿ですが 宜しくお願いいたします。

  A   B   C   D   E   F
1 項目  数量 単位  単価  計
2 16520  1   set  1500  1500
3 16011  2   set  1000  2000
4  ・   ・   ・  ・   ・
5  ・   ・   ・  ・   ・
6 16011  2   set  1000  2000
7        小計     18000

以下の行に同様の表が存在し、各々小計をマクロにて計算するプログラムを作成しております。※小計までの項目行数は様々です。
今までのレスを拝見させていただき下記のプログラムまでは行着きましたが、Forメソッドなども使ってみましたが、連続しての"小計検索&オートSAM"がうまくいきません。
ご教授いただきたつく、投稿させていただきました。

Sub 検索()
 Range("A1").Select   '検索開始セルは"A1"  
   With Cells.Find(What:="小計", After:=ActiveCell, LookIn:=xlValues, LookAt:= _
    xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
    , SearchFormat:=False).Activate
    ActiveCell(1, 3).Select
  End With 
  Dim i As Long
  Dim lngCount As Long
   With ActiveCell
    'データ行数の初期値を設定
    lngCount = 0
    '現在のセルより上のデータが数字でなくなるまで繰り返し
    i = i - 1
    Do Until .Row + i = 0
      '操作行が数値無く、若しくはEmpty値ならDoを抜ける
      If (Not IsNumeric(.Offset(i).Value)) Or IsEmpty(.Offset(i).Value) Then
        Exit Do
      Else
        'データ行数をカウント
        lngCount = lngCount + 1
      End If
      '操作行を更新
      i = i - 1
    Loop
    '数式を出力
    .FormulaR1C1 = "=Sum(R[-" & (lngCount) & "]C:R[-1]C)"
  End With
End Sub

宜しくお願い足します。

【61484】Re:小計の連続処理
発言  ゆみこん  - 09/5/13(水) 10:47 -

引用なし
パスワード
   例えばB列が”小計”の行にデータがない事で纏まりを区切れるとした場合なら、

Sub try()
Dim r As Range

For Each r In Range("B2", Cells(Rows.Count, 2).End(xlUp)).SpecialCells(xlTextValues).Areas

r.Item(r.Cells.Count).Offset(1, 4).Value = Application.Sum(r.Offset(, 4))

Next

End Sub

こんな感じとか?
⇒”小計”の結果はF列でいいのですよね?

【61485】Re:小計の連続処理
発言  ゆみこん  - 09/5/13(水) 11:06 -

引用なし
パスワード
   F列を基準として、

Sub try2()
Dim r As Range

For Each r In Range("F2", Cells(Rows.Count, 6).End(xlUp)).SpecialCells(xlTextValues).Areas

r.Item(r.Cells.Count).Offset(1).Value = Application.Sum(r)

Next

End Sub

こちらの方が良いかな?

【61489】Re:小計の連続処理
発言  ひつまぶし  - 09/5/13(水) 12:54 -

引用なし
パスワード
   重箱の隅をつつくようですが、ちょっと気になったのでコメントします。
ゆみこんさん提示のSpecialcellsメソッドでの引数の使い方ですが、
このメソッドは、
Function SpecialCells(Type As XlCellType, [Value]) As Range
であり、1番目の引数TypeにはxlCellType列挙型の定数を指定します。
ご提示の案では、xlCellTypeConstants(=2)を指定すべきだと思います。
なお、2番目の引数Valueは、1番目で定数や数式を指定した時に、
さらに細かく指定する場合のものです。
なお、xlTextValues(=2)は本来、当メソッドの2番目の引数用の定数だと思います。
たまたまどちらの定数でも値は同じだったので、
得られる結果は同じになるでしょうが、ちょっと不自然に感じたので意見させてもらいました。

ついでに、私もAutoFilterを使った例を書いときます。
Sub tot()
Dim RR As Range, r As Range
Dim sCel As Range, eCel
With ActiveSheet.Range("A1").CurrentRegion.Columns("D")
  .Worksheet.AutoFilterMode = False
  .AutoFilter 1, "小計"
  On Error Resume Next
  Set RR = .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible)
  On Error GoTo 0
  .Worksheet.AutoFilterMode = False
  Set sCel = .Cells.Item(2).Offset(, 1)
End With
If Not RR Is Nothing Then
'  MsgBox RR.Address
  For Each r In RR
    Set eCel = r.Offset(-1, 1)
   '数式でセットしたいなら
    r.Offset(, 1).Formula = _
      "=SUM(" & Excel.Range(sCel, eCel).Address(0, 0) & ")"
   '数式でなく、結果だけがほしいなら
    'r.Offset(, 1).Value = WorksheetFunction.Sum(Excel.Range(sCel, eCel))
    Set sCel = r.Offset(1, 1)
  Next
End If
End Sub

提示のデータ配置がよく分からないので、
・"小計"があるのはD列である。
・小計を取りたい項目はE列である。
としてます。

【61490】Re:小計の連続処理
質問  みやちゃん  - 09/5/13(水) 12:56 -

引用なし
パスワード
   早速のご回答ありがとうございました。

 F7小計の下の行にも同じ項目があり、下の行の小計も拾い出し 隣のセルに小計を出したいと考えております。
  A   B   C   D   E   F
1  項目  数量 単位  単価  計
2 16520  1   set  1500  1500
3 16011  2   set  1000  2000
4 16009  1   set  800  800
5 16011  3   set  1000  3000
6 16011  2   set  1000  2000
7          小計      9300
8  項目  数量 単位  単価  計
9 16520  1   set  1500  1500
10 16011  2   set  1000  2000
11 09011  2   set  500  1000
12 16520  2   set  1800  3600
13 16011  2   set  1000  2000
14 16011  1   set  1000  1000
15          小計      11100
  ※上記の様に小計に至る行数が変わります。
ゆみこんさんのお考えいただいたプログラムに何を足せばそのようになりますでしょうか・・・
ご教授宜しくお願いいたします。

【61493】Re:小計の連続処理
発言  ゆみこん  - 09/5/13(水) 14:54 -

引用なし
パスワード
   ▼ひつまぶし さん:
>重箱の隅をつつくようですが、ちょっと気になったのでコメントします。
>ゆみこんさん提示のSpecialcellsメソッドでの引数の使い方ですが、
>このメソッドは、
>Function SpecialCells(Type As XlCellType, [Value]) As Range
>であり、1番目の引数TypeにはxlCellType列挙型の定数を指定します。
>ご提示の案では、xlCellTypeConstants(=2)を指定すべきだと思います。
>なお、2番目の引数Valueは、1番目で定数や数式を指定した時に、
>さらに細かく指定する場合のものです。
>なお、xlTextValues(=2)は本来、当メソッドの2番目の引数用の定数だと思います。
>たまたまどちらの定数でも値は同じだったので、
>得られる結果は同じになるでしょうが、ちょっと不自然に感じたので意見させてもらいました。

ひつまぶし さん

今まで”たまたま”動いていたもので自分で変な風に『理解(納得?)』していました。

省略して良い部分とそうでない部分を、きちんと理解すべきですよね。
勉強になりました。ありがとうございます。

【61494】Re:小計の連続処理
発言  ゆみこん  - 09/5/13(水) 15:01 -

引用なし
パスワード
   ”計”と言うのがF列でしたら、

Sub try3()
Dim r As Range

For Each r In Range("F2", Cells(Rows.Count, 6).End(xlUp)).SpecialCells(xlCellTypeConstants).Areas

r.Item(r.Cells.Count).Offset(1).Value = Application.Sum(r)

Next

End Sub

と言う感じでしょうか?

【61503】Re:小計の連続処理
お礼  みやちゃん  - 09/5/13(水) 22:25 -

引用なし
パスワード
   ゆみこんさん 
いろいろお考えいただき誠にありがとうございました。
このプログラムをもとに考えていきたいと思います。
ありがとうございました。

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