Excel VBA質問箱 IV

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

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


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

【53933】ある区切りまでの足し算 Vハチ 08/2/16(土) 2:51 質問[未読]
【53935】Re:ある区切りまでの足し算 ichinose 08/2/16(土) 10:32 発言[未読]
【54006】Re:ある区切りまでの足し算 Vハチ 08/2/20(水) 0:21 発言[未読]
【54015】Re:ある区切りまでの足し算 ichinose 08/2/20(水) 8:21 発言[未読]
【53936】Re:ある区切りまでの足し算 VBWASURETA 08/2/16(土) 10:33 発言[未読]

【53933】ある区切りまでの足し算
質問  Vハチ  - 08/2/16(土) 2:51 -

引用なし
パスワード
   本当にいつも感謝しています。

多少、前スレの続きになります。

前スレは一行挿入ということで質問させていただきました。
(www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=53891;id=excel)

実はこれある区切り線なのです。

例えば、1行目から5行目のD列の合計をその区切り線(6行目)のE列にいれます。
7行から8行までの合計を区切り線(9行目)のE列に入れます。

まー簡単に言うと、区切り線までの合計を出したいわけです。

難しいのは、区切りから区切りまでの行数が毎回変わること。くらいだと思います。

すみませんがよろしくお願いします。

【53935】Re:ある区切りまでの足し算
発言  ichinose  - 08/2/16(土) 10:32 -

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


>実はこれある区切り線なのです。
>
>例えば、1行目から5行目のD列の合計をその区切り線(6行目)のE列にいれます。
>7行から8行までの合計を区切り線(9行目)のE列に入れます。
>
>まー簡単に言うと、区切り線までの合計を出したいわけです。
簡単に書くのではなく、

「ここまで記述すれば、誰でもわかるだろう!! どうだ」
とご自分で思うくらい詳細に書いてください。
私が思う足りないのは 具体例です。

こんな入力データに対して、

こんな結果がほしいという具体例です。
例がひとつで足りなければ、ふたつでも三つでも記述してください。


新規ブックの標準モジュールに

'================================================================
Sub main()
  Dim rng As Range
  Dim ans As Variant
  Dim ele As Variant
  Dim st As Long
  Call mk_sample
  MsgBox "D列にサンプルデータ作成" & vbCrLf & _
      "これから、処理を開始します"
  st = 1
  Set rng = Range("d1", Cells(Rows.Count, "d").End(xlUp))
  With rng
    ans = Evaluate("transpose(if(" & .Address & _
           "="""",row(" & .Address & "),""" & Chr(&HFF) & """))")
    ans = Filter(ans, Chr(&HFF), False)
    st = 1
    For Each ele In ans
     Range("e" & ele).Value = Application.Sum(Range("d" & st, "d" & (ele - 1)))
     st = ele + 1
     Next
    Cells(Rows.Count, "d").End(xlUp).Offset(1, 1).Value = _
      Application.Sum(Range("d" & st, Cells(Rows.Count, "d").End(xlUp)))
     
    End With
End Sub
'===================================================================
Sub mk_sample()
  Cells.ClearContents
  With Range("d1:d5")
    .Formula = "=int(rand()*2000)+1"
    .Value = .Value
    End With
  With Range("d7:d9")
    .Formula = "=int(rand()*2000)+1"
    .Value = .Value
    End With
  With Range("d11:d12")
    .Formula = "=int(rand()*2000)+1"
    .Value = .Value
    End With
  With Range("d14:d18")
    .Formula = "=int(rand()*2000)+1"
    .Value = .Value
    End With
End Sub


新規ブックのアクティブシートのD列にサンプルデータをコードで
作成し、そのデータに対してE列に合計値を出力しています。

やりたい処理は、こんなことですか?

【53936】Re:ある区切りまでの足し算
発言  VBWASURETA  - 08/2/16(土) 10:33 -

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

条件による集計でしたら、Sumif関数は駄目でしょうか?

www.asahi-net.or.jp/~ef2o-inue/shiki/sub03_020_02.html

【54006】Re:ある区切りまでの足し算
発言  Vハチ  - 08/2/20(水) 0:21 -

引用なし
パスワード
   ichinose さん
ありがとうございます。

上の方のプログラムで無事できました。
ただ、自分の環境ではこれがエラーとなっえしまいます。
>Cells(Rows.Count, "d").End(xlUp).Offset(1, 1).Value = _
      Application.Sum(Range("d" & st, Cells(Rows.Count, "d").End(xlUp)))
なので、コメントアウトして実行しました。
その結果、例えば、

E列が10,20,30とあるとします。
前スレであったとおり、10,20,30を基準に、並び替えをします。
D列のの合計を出すのですが、30の合計が出してくれません。
なぜか一番最後の合計のみ算出しれくれません。

具体例:
あいうえお  100  10
さしすせそ  300  10
はひふへほ  100  30
なにぬねの  300  20
まみむめも  200  30
かきくけこ  200  10
たちつてと  200  20
  
     ↓

あいうえお  100  10
かきくけこ  200  10
さしすせそ  300  10
       600
たちつてと  200  20
なにぬねの  300  20
       500
はひふへほ  100  30
まみむめも  200  30
         ←ここが算出されません。

もしかしてラスト2行がこの処理を行っているのかな?
このソース結構難しいところが多く、自分では解読がマダ不可能でしたので、
マダわかりませんでした。
すみませんが対処法方あればよろしくお願いいたします。

【54015】Re:ある区切りまでの足し算
発言  ichinose  - 08/2/20(水) 8:21 -

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

>上の方のプログラムで無事できました。
>ただ、自分の環境ではこれがエラーとなっえしまいます。


>>Cells(Rows.Count, "d").End(xlUp).Offset(1, 1).Value = _
>      Application.Sum(Range("d" & st, Cells(Rows.Count, "d").End(xlUp)))

それは、サンプルデータ(Vハチ さんが記述された内容から作成しています)
とVハチ さんの実際のデータに差異があるからですよね!!

その違いを見極めてください。


どんなエラーメッセージですか?


>なので、コメントアウトして実行しました。
>その結果、例えば、
>
>E列が10,20,30とあるとします。
>前スレであったとおり、10,20,30を基準に、並び替えをします。
>D列のの合計を出すのですが、30の合計が出してくれません。
>なぜか一番最後の合計のみ算出しれくれません。

そりゃあね・・、そのコメントにしたコードが最終行の合計をだすコードですからねえ。


>
>具体例:
>あいうえお  100  10
>さしすせそ  300  10
>はひふへほ  100  30
>なにぬねの  300  20
>まみむめも  200  30
>かきくけこ  200  10
>たちつてと  200  20
>  
>     ↓
>
>あいうえお  100  10
>かきくけこ  200  10
>さしすせそ  300  10
>          600
>たちつてと  200  20
>なにぬねの  300  20
>          500
>はひふへほ  100  30
>まみむめも  200  30

ですよね?だって、

>例えば、1行目から5行目のD列の合計をその区切り線(6行目)のE列にいれます。
つまり、合計値(600や500や300)は、E列に設定するのでしょう?


上記の例題をコードで記述し、同じ算出コードで試します。

これも新規ブックの標準モジュールにて

'====================================================================
Sub main()
  Dim rng As Range
  Dim ans As Variant
  Dim ele As Variant
  Dim st As Long
  Call mk_sample
  MsgBox "D列にサンプルデータ作成" & vbCrLf & _
      "これから、処理を開始します"
  st = 1
  Set rng = Range("d1", Cells(Rows.Count, "d").End(xlUp))
  With rng
    ans = Evaluate("transpose(if(" & .Address & _
           "="""",row(" & .Address & "),""" & Chr(&HFF) & """))")
    ans = Filter(ans, Chr(&HFF), False)
    st = 1
    For Each ele In ans
     Range("d" & ele).Value = _
        Application.Sum(Range("d" & st, "d" & (ele - 1)))
     st = ele + 1
     Next
    Cells(Rows.Count, "d").End(xlUp).Offset(1, 0).Value = _
     Application.Sum(Range("d" & st, Cells(Rows.Count, "d").End(xlUp)))
    End With
End Sub
'===================================================================
Sub mk_sample()
  Cells.ClearContents
  Range("c1:e9").Value = Evaluate("{""あいうえお"",100,10;" & _
                  """かきくけこ"",200,10;" & _
                  """さしすせそ"",300,10;" & _
                  """"","""","""";" & _
                  """たちつてと"",200,20;" & _
                  """なにぬねの"",300,20;" & _
                  """"","""","""";" & _
                  """はひふへほ"",100,30;" & _
                  """まみむめも"",200,30}")


End Sub


mainを実行してみてください

E列に合計値が入るでしょう?(Excel2002では、正しく表示されます)

さて、実際のデータとどこが違うのか よく調べてみて下さい

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