• ベストアンサー

串刺し関数のVBAについて

 VBAのエキスパートの方にお願いです。 下記の画像のとおり月単位等で6個項目について、任意の日数で集計しているのですが 串刺し関数では、結構手間がかかりますので VBAのヒントをくださればありがたいのですが なお、毎日入力のシートは、すべて同じです。

質問者が選んだベストアンサー

  • ベストアンサー
  • sora1515
  • ベストアンサー率58% (54/92)
回答No.3

既存VBAに組み込むと把握が面倒になるので単体で具体例を書きました。あと既存VBAですでに入れ子ループとそのカウントのセル番地応用を使っているので書けるものと思っていましたが。 なにか別な事が聞きたかったのでしょうか?すみませんまだ把握不足があるのか '入れ子がわかりやすいように行頭に全角スペースを入れてあります。 Private Sub test()  sSheet = 2 '集計開始シート  eSheet = 4 '集計終了シート  col = 5 '列数  Row = 5 '行数  For t = 3 To 3 + Row - 1 '行ループ    Cells(t, 2) = Worksheets(2).Cells(t, 2) '社名取得    For n = 3 To 3 + col '列ループ      For i = sSheet To eSheet 'セル集計        Sum = Sum + Worksheets(i).Cells(t, n)      Next i      Cells(t, n) = Sum      Sum = 0    Next n  Next t End Sub 行数は固定値5を入れてますが既存VBAの"日間"の値を入れ変えるなどして利用下さい。 あと足し算の部分はarray格納型もありますお好みでどうぞ。   Worksheets("Sheet1").Range("A1").Consolidate Sources:= _     Array("Sheet2!R1C1:R37C6", "Sheet3!R1C1:R37C6"), Function:=xlSum

wakaran01
質問者

お礼

本当に何度も、親切に教えていただきありがとうございました。すぐに、実施しました。セルの場所がずれてましたが、 自分で修正できます。エラーなく走りました。 ほんとうに、助かりましたし、自分でも、いろいろと勉強になりました。 ありがとうございました。

その他の回答 (2)

  • sora1515
  • ベストアンサー率58% (54/92)
回答No.2

やっと2つに絞り込めました。 1. あなたのVBAを6つの表で実現させるには? ということでしたら、 そのVBAを6回ループさせ対象セルを6回指定するだけになります。またはボタンを6個にする。 ※この場合串刺しは今回の質問に関係なくなる為違う気がしますがどうなのか。 2. 6つの表に=SUM('集計:10-31'!B3)という串刺し関数をVBAで書きたい。この書きかけマクロに追記するにはどうしたらいいか? ということでしたら、 データ範囲をルール制定しそこへシート分足し算するだけです。 ※データ範囲をルール制定する為の労力が大きくVBA化のメリットが小さい。参考として聞きたいのなら別。 2と想定し先へ進めてみます。 仕様確認ですが、 ・列は固定ですか? ・行は指定日数分ですか? ・集計:10-31のB列社名は固定並び順でよいか。 ・最終的に各表分ボタン6個でよいのか?1個とする場合開始日終了日の2回x6表で12回手入力するのか? ・全ての表で一旦フルデータ配置し日数分にクリア表示してもよいのか。(メリット:記述が楽/デメリット:少し遅い) 列固定/行数は日数指定分/社名順固定/各表ボタン有り/フル配置なし を想定し先へ進めます。 固定セルで足し算(集計:10-31:)しSheet1へ表示、続けて列数分ループ+行数分ループするだけです。 ・入れ子の具体的な書き方などがわからない場合は再度それを明記しお聞き下さい。 ・カウント値をセル番地とする具体的な書き方などがわからない場合は再度それを明記しお聞き下さい。 可変列だった場合の具体的な書き方がわからないという場合は再度それを明記しお聞き下さい。 その他パターンの場合は別途仕様をご明記下さい。 ps.なんだか仕事してる気分になりました・・・   文面では意思が伝わりませんがこちらは怒っても嘆いてもおりません。お気軽に続けてご質問をどうぞ。

wakaran01
質問者

補足

2の想定でヒントをください。 ・列は固定ですか?  固定です。 ・行は指定日数分ですか?  あります。 ・集計:10-31のB列社名は固定並び順でよいか。  固定並び順です。  集計シートを最初のシートとし、そこで、各対象セルを集 計させます。    固定セルで足し算(集計:10-31:)しSheet1へ表示、続けて列 数分ループ+行数分ループをどう書いたらいいかまた、  入れ子の具体例とカウント値をセル番地にする具体例があ れば、助かるのですが。    サポートおねがいします。

  • sora1515
  • ベストアンサー率58% (54/92)
回答No.1

画像は字がつぶれていて読めません。 縦横比を考慮して投稿してはいかがでしょうか。 画像を考慮せず次に進めると、 >月単位等で6個項目について、任意の日数で集計 意味がわかりません・・ 月単位の6個の表について、任意の日数(セル)で集計 もしくは 月単位シートで6個の表について、任意の日数(セル)で集計 でしょうか。 串刺し関数とは一般的にはシート間集計を行うものですが各シート同じ表形式でしょうか?シート間の記載がまったくないのでどういった関数を書いているのか想定できません。 もし同じ形式表で簡単な串刺し関数(足し算や平均値など)であればVBAより関数の方が楽です。もし可変形式表や検索機能など使った複雑な関数であればVBAがいいかもしれません。 大事な言葉が欠けた質問では的確な回答ができません。。 せめて今使ってる関数。どんなセル配置を串刺ししているか。 ぐらいは書くべきです。

wakaran01
質問者

補足

回答ありがとうございます。 つぶれた、画像および、意味の解らない質問申し訳ありません。 実は、上記の表のサンプルは罫線を除いて下記のようになっております。 上記のシートが1日から月単位で作成されております。 2日 ~ 12日 12日間 交換率 A製品 B製品 C製品 D製品 F製品 G製品 A社 1 2 3 4 5 6 B社 2 3 4 5 6 7 C社 2 3 4 5 6 7 D社 2 3 4 5 6 7 E社 2 3 4 5 6 7 串刺し関数は、これを各セルに 入れております。=SUM('集計:10-31'!B3) VBAに関しては、以前に教えていただいた。 物を応用しているのですが。これを、6個の表に 割り当てるには、セルを指定しなけばならないと おもうのですが、そのやり方に関してヒントがあれば、ご教授いただけないでしょうか? コマンドボタンに割り付けてます。 Private Sub CommandButton1_Click() Dim i As Long, j As Long, k As Long, staS As Long, endS As Long, endRow As Long, endCol As Long staS = InputBox("検索開始日を入力") endS = InputBox("検索終了日を入力") With Worksheets(1) endRow = .Cells(Rows.Count, "A").End(xlUp).Row endCol = .Cells(2, Columns.Count).End(xlToLeft).Column .Range("B1,D1,E1").ClearContents Range(.Cells(3, 2), .Cells(endRow, endCol)).ClearContents For i = 3 To .Cells(Rows.Count, "A").End(xlUp).Row For j = 2 To .Cells(2, Columns.Count).End(xlToLeft).Column For k = staS + 1 To endS + 1 .Cells(i, j) = .Cells(i, j) + Worksheets(k).Cells(i, j) Next k Next j Next i .Range("B1") = staS & "日" .Range("D1") = endS & "日" .Range("E1") = endS - staS + 1 & "日間" End With End Sub