• ベストアンサー

串刺し関数の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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excel2000で条件付きの串刺し計算は可能か?

    タイトル通りなのですが詳細を書きます。 sheet1からsheet100まで全く同じフォーマットの集計 シートがあります。 シートを甲乙丙の3種類に分類するため、各シートのA1セル 、B1セル、C1セルの何れかに数字の「1」を入れてフラグを 立てています。 A2以下のセルには関数等で計算された数値があります。 ここでA1のセルに「1」が入力されているシートのみの数値を 甲合計シート、B1のセルに「1」が入力されているシート のみの数値を乙合計シートにという感じで串刺し算で求め たいのですが、SUMIFではうまくいきませんでした。 甲合計シートのA2セルに関数がおかしいのは承知で =SUMIF(Sheet1:Sheet100!A2,A1=1,Sheet1:Sheet100!A2) と入力してもダメでした。 当方VBAは全く知らないのですが、条件付の串刺し算は 関数では実現できないのでしょうか? VBAでなら可能というのであれば、その方法を教えて いただけませんか?

  • 【Excel VBA】串刺し集計について

    Excel VBA初心者です。 串刺し集計について質問させてください。 同じ構成のシートが3つあります。中には数字や文字列が入っています(各シートの同じセルに数字と文字列が入ることは無し)。 串刺しのイメージで数字が入っているセルは合計を、文字列が入っているセルにはどれか1つ(規則もマクロに入れる、例としては○、×、-であれば○など)を合計用の同じセルにいれたいのですが、マクロの組み方をご教授願います。

  • 【Excel-VBA】特定の処理をしている間、関数を止める方法について

    Excelで実現可能かどうか教えてください。 入力用Book1 ⇒ 入力シート1 入力用Book2 ⇒ 入力シート2 入力用Book3 ⇒ 入力シート3 集計用Book ⇒ 集計シート1、集計シート2、集計シート3、入力シート1、入力シート2、入力シート3 上記の4ファイルがあり、入力用Book1~3はそれぞれ5名ぐらいが 共有してデータを入力しています。 集計用Bookの集計シート1で入力シート1を集計したいので、VBAで 入力シート1~3を集計用Bookに取り込みたいと考えております。 ただ、集計シート1~3にはそれぞれSumproductを多用しており、 VBAで取込処理を行うと10分近くかかってしまいます。 集計シート1~3を削除して取込を行うと10秒ほどで完了します。 取込処理を行う間、各セルに入力している数式の処理を止めることは 可能でしょうか? 入力用シート1~3を扱うメンバーは定期的に変わるため、 全てをVBAで構築するのは躊躇われます。 なんとかsumifやsumproductを使用して、メンテナンス工数を 削減したいので、よろしくお願いいたします。

  • エクセル2003の「串刺し集計」について教えてください。

    年度別の売上等の集計表を作っています。 月毎にシート名を「0604」、「0605」・・・とし、半期毎にも集計を かけたいと思っています。(0604~0609のシート間) それぞれのシートは同じ表で、B列に「曜日(月~日)」が D列には「客数」が入っています。 そこで「特定の曜日の客数」を半期毎の集計シート(0609の後)に 表示させようとして、下記のような関数を入れました。 =sum('0604:0609'!,sumif($c$2:$c$30,"月",d2:d30)) しかし、「入力された数式は正しくない」と表示されてしまい ヘルプを参照しましたが、一般的な入力時の注意だけでした。 SUMにはSUMIFを組み合わせられないのでしょうか? 参照するセルの値が変わっても、集計結果に反映される関数を 教えていただけませんでしょうか。

  • エクセル 最小値を求める関数について

    複数シートの集計で串刺し集計を使っています。 最大値は =MAX('1:31'!G57) で求められるのですが、0以上の最小値を求める関数(SMALL,またはMIN)を使ってもうまくいきません。 0以上の最小値を求める関数を教えてください。よろしくお願いします。

  • データの串刺しの初歩的質問です。

    顧客管理でsheet1のA列に名前の一覧を入れ、sheet1には住所や連絡先関係の項目を、sheet2には販売履歴のデータの項目を入れる、という場合、「串刺し」という方法を使うと、sheet1のA列の名前がそのままsheet2にもコピーされ、新規の顧客名を増やしてもsheet2にもそのままそれが反映される、と聞きました。共通項はA列のみです。 過去問もみたのですが、「串刺し集計」という、私の初歩的質問の次の段階の回答が多いので、一番基本となる上記のやりかたがわかりません。 よろしくご教授ください。

  • シートを串刺しで抽出したいのですがそれはマクロですか?

    こんにちは。 エクセルの串刺し集計ではなく、串刺し抽出のことでわからないので 教えて下さい。 ・同じブック内に顧客20件のデータが管理されています。 ・1シート毎が1顧客の単価帳になっています。 ・A1に顧客の名前(同じくシート名もこれと同じく顧客の  名前をつけています。) ・抽出したいのは顧客20件の各シートのA50:B53です。 同じブックの新規シートに「A1の顧客名」と(どれを抽出したか わからなくなってしまうから必要なのかな?と思います。) 20シート全ての「A50:B53」を抜き出すことは可能でしょうか? 抜き出したいセル番地は20シート一緒です。 それぞれのシートはA2からA49までの抽出しなくてもいいセルは、  不規則にだらだらと製品名や個々の単価が入力されています。 転職した会社でデータ管理がなされていなくてビックリしています。 とは言え私もマクロなどは経験がなく、なにをしたらできるのかが さっぱり分かりません。 でも確か前の会社ではできていたのに・・・? あれはアクセスだったのかなぁ? などという状態です。 VBAマクロの本を読みあさりましたが よくわかりませんでした。 とっかかりを教えていただければありがたいです。 よろしくお願いします。

  • エクセル VBA? 関数?

    book1(データ入力用)とbook2(送信用)で作業します。 必ずbook1→book2の順番で開きます。 book1には1ヵ月の日数分のsheetがあり(約30sheet)、作業中のsheetのA1の日付を、book2を開いたときにbook2のB4に自動的に表示される様にしたいです。 関数でも可能であればOKですが、できればVBAの文章をおしえてください。Private Sub Worksheet_Activate()で可能でしょうか??? よろしくお願いします。

  • 関数をVBAで簡素化する

    よろしくお願いします シート枚数22枚 各シート セルG11からG71まで 各シートの各行にこの関数を入力するのは労を要します。 また、VBAに下のように1ツづつ入力するのも同じです。 Range("G11").Value="=IF(E11+F11=0,0,G10+E11-F11)"          ↓ Range("G71").Value="=IF(E71+F71=0,0,G70+E71-F71)" VBAで簡素化ができないでしょうか

  • エクセルの再集計について

    こんにちは エクセル2003で対応したいと考えております。 1ヶ月(1日から31日)までの中で、ある曜日だけの集計を別に取りたいと思います。 データ項目が 縦20項目+集計、横8項目あり、 それぞれの項目ごとの集計を1ヶ月単位でとっていますが、 別ノシートに、月曜のみの1ヶ月の集計、火曜のみの・・・と曜日ごとに取りたいと考えております。 「ピボットテーブル」を使用した所、メモリ不足にてうまくいきませんでした。 ただ、単純にシートを追加して、項目ごとに参照させれば、 単純ですが可能です。ただ手間が膨大です。 串刺しは、少し手間が省けますが、やはりいまひとつと言った感じです。 1年分となると大変な手間がかかり、なをかつ 毎年ではなをさらです。 (一応テンプレート対応、未熟ですが・・・) 何か良い方法はないか模索しております。 良きアドバイスありましたら、お願いいたします。

このQ&Aのポイント
  • 長女の会社での職域コロナワクチン接種に参加したものの、次女は未成年のため接種できなかった。
  • 次女は学校を休んで接種に行ったが、もし接種できなかった場合は欠席扱いになるのか心配。
  • 教育現場に詳しい方のアドバイスが欲しい。
回答を見る

専門家に質問してみよう