• ベストアンサー

EXCELでシート名を含む数式を作成するマクロ

エクセルで困っています。 (WindowsXP+Excel2000です) シートが5枚、シート名を「No1」~「No4」と「集計」と付けています。 シートの体裁は全て同じで、「No1」から「No4」のシートを串刺し演算して「集計」シートに合計を表示させています。 =SUM('No1:No4'!A1) のような感じです。 質問なんですが、「集計」シートのA2にNo2と入力し、A3にNo3と入力した後にマクロを実行すれば、A1の数式が =SUM('No2:No3'!A1) のように変わるマクロは出来ないでしょうか。 INDIRECTとか使ってみてもうまく行きません。 よろしくお願いします。

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

Sub macro1() Sheets("集計").Range("A1").Formula = "=SUM('" & Range("A2").Value & ":" & Range("A3").Value & "'!A1)" End Sub ではいかがでしょう?

char0078
質問者

お礼

出来ました(喜) ありがとうございました。 ちょっとした工夫なんですね。まだまだ勉強不足でした。

その他の回答 (6)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

#5 のWendy02です。 修正があります。最後から9行目(大きく空白行が開いているところ)から、最後までを以下を貼り付けで書き換えてください。 =ThreeDSum("No1:No3",A1:B1) のような場合に、前回のままですと計算できません。また、現在のコードですと、大文字・小文字の違いを無視してくれません。  For j = FirstNo To LastNo    If StrConv(Worksheets(j).Name, vbUpperCase) Like StrConv(BaseName, vbUpperCase) & "#*" Then      If TypeName(Worksheets(j).Range(rngAddress)) = "Range" Then       dblSum = dblSum + WorksheetFunction.Sum(Worksheets(j).Range(rngAddress))      End If    End If   Next j   ThreeDSum = dblSum End Function

char0078
質問者

お礼

検証していただいてたんですね。 ホントに申し訳ないです。ありがとうございました。

  • tmom
  • ベストアンサー率25% (11/44)
回答No.6

No.1です。 応用性はありませんが、No.2さんの回答でうまくいくはずです。「SUM(」の後と最後の「!A1)」の前二ヶ所に「'」を2箇所追加することで数字のみのシート名に対応しています。

char0078
質問者

お礼

おかげさまで、うまく出来ました。お手間取らせて申し訳ないです。 自分でやってると、「'」の数がワケが分からなくなってきたりで、まだまだ勉強不足です。 どうもありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんばんは。 確かに、INDIRECTの串刺し計算は出来ませんね。確か、配列数式で出来たように思ったのですが、結果が出ませんでした。ただ、今回の場合、マクロではなく、ユーザー定義関数ですね。マクロですと、もう少し簡単ですね。 入力例: ** =ThreeDSum(B2,A1) B1: No1:No4  [ここは文字列] × 'No2:No3' このように['] を入れてはいけません。 また、数字だけのシート名の場合は、"1:3" としてください。通常は、[""]は、必要ありません。 ** 「0512-1」~「0512-4」の場合 =ThreeDSum("0512-1:0512-4",A1) または、 =ThreeDSum(B1,A1) B1: 0512-1:0512-4 シート間で、別のシート名があれば、それは計算されません。 '--------------------------------------------------- '<標準モジュール> Option Explicit Function ThreeDSum(SheetName As Variant, rng As Range)   '串刺しSum: ThreeDSum("Sheet1:Sheet3",A1)   Dim num As Integer   Dim i As Integer   Dim j As Integer   Dim BaseName As String   Dim FirstNo As Integer   Dim LastNo As Integer   Dim buf As Integer   Dim sh1 As String   Dim sh2 As String   Dim rngAddress As String   Dim dblSum As Double   Application.Volatile     '数字のシート名   If InStr(SheetName, """") > 0 Then    SheetName = Mid$(SheetName, 2, Len(SheetName) - 2)   End If     num = InStr(SheetName, ":")   If num > 0 Then    sh1 = Mid$(SheetName, 1, num - 1)    sh1 = WorksheetFunction.Substitute(sh1, vbNullChar, "")    sh2 = Mid$(SheetName, num + 1)   Else    Exit Function   End If   For i = Len(sh1) To 1 Step -1   If IsNumeric(Mid$(sh1, i, 1)) = False Then Exit For   Next   BaseName = Mid$(sh1, 1, i)   rngAddress = rng.Address   If TypeName(Worksheets(sh1)) <> "Worksheet" Then    Exit Function   End If   If TypeName(Worksheets(sh2)) <> "Worksheet" Then    Exit Function   End If   FirstNo = Worksheets(sh1).Index   LastNo = Worksheets(sh2).Index   'シート名の順が逆になった時   If FirstNo > LastNo Then    buf = FirstNo    FirstNo = LastNo    LastNo = buf   End If     For j = FirstNo To LastNo    If Worksheets(j).Name Like BaseName & "#*" Then      If VarType(Worksheets(j).Range(rngAddress)) = vbDouble Then       dblSum = dblSum + Worksheets(j).Range(rngAddress)      End If    End If   Next j   ThreeDSum = dblSum End Function 一応、いくつかのパターンを想定しましたが、まだ十分に検証されておりません。

char0078
質問者

お礼

ご丁寧な回答頂きありがとうございます。 お時間とらせて申し訳ありません。 ユーザー定義関数と言う物を、恥ずかしながら初めて知りました。これは、使いこなせば便利な物のようですね。 やってみましたら、確かにうまく動きます。 あとは私自身のユーザー定義関数の理解度にかかっているような気がします。何がどうなって計算できているのか、今のところナニがなんだかって感じですので^^: どうもありがとうございました。

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.4

#3の回答を参考にして Worksheets("集計").Range("B1").Formula = "=INDIRECT(""'"" & A2 & ""'!A1"")+INDIRECT(""'"" & A3 & ""'!A1"")" のようにしてみました。 複数のセルに対応するのは工夫が必要ですね。

char0078
質問者

お礼

ご回答頂きありがとうございます。 ご回答の方法で出来ましたが、実はどうしてもSUM関数を入れなければならない事情がありまして。 INDIRECT関数をマクロの中に突っ込もうとして悪戦苦闘していた次第で。。。 工夫するのもまた楽しいんですけど、今回は切羽詰っていました物で。。。 また勉強しなおしますm(__)m

  • odessa7
  • ベストアンサー率52% (101/192)
回答No.3

 INDIRECTで出来ませんか?  ご質問の場合ですと =INDIRECT(A2&"!A1")+INDIRECT(A3&"!A1")  などとすれば、表示されると思います。  ご参考まで。

char0078
質問者

お礼

ご回答頂きありがとうございます。 ご回答の方法で出来ましたが、実はどうしてもSUM関数を入れなければならない事情がありまして。 INDIRECT関数をマクロの中に突っ込もうとして悪戦苦闘していた次第で。。。 また勉強しなおしますm(__)m

  • tmom
  • ベストアンサー率25% (11/44)
回答No.1

こんな感じでいかがでしょうか? Sub macro1() Sheets("集計").Range("A1").Formula = "=SUM(" & Range("A2").Value & ":" & Range("A3").Value & "!A1)" End Sub

char0078
質問者

お礼

早速解答頂きありがとうございました。 ご回答の方法でやると確かにうまく行きました。 ですが、非常に申し訳ないんですが、補足させてくださいm(__)m

char0078
質問者

補足

実は質問の内容を簡単にするために、シート名を簡略していました。 実際には「0512-1」~「0512-4」と「集計」と言うシート名です。 ご回答のマクロを書き換えて実行してみましたら数式が =SUM(512-3:512-'4'!A1) (A2に0512-3、A3に0512-4を入力。文字列形式で。) のようになってしまい、何故か循環警告まで出てしまいました。 何とかならないでしょうか。 せっかく回答いただきながら申し訳ないです。。。

関連するQ&A

  • セルの値に応じて数式を入力するシートを変えたい

    シート名が 「aaa」 「bbb」 「ccc」 「ddd」 という4つのシートがあります。 シート「aaa」のD4セルに入力した値(シート名)に応じて、 (上記で設定したシート)のF7セルに "=SUM(F5:F6)"という数式を入力したいのですが、 おわかりの方がいらっしゃいましたらご教授いただければ幸いです。 例) シート「aaa」のD4セルに「ccc」と入力して実行すると、 シート「ccc」のF7セルに「=SUM(F5:F6)」の数式を入力するマクロを作成したい。 (シート「aaa」のD4セルに「ddd」と入力して実行すると、 同様に、シート「ddd」のF7セルに数式をマクロで入力したい)

  • エクセルのマクロ(2回目)を教えて下さい。

    串刺し加算(多数のシートの同じセル番地を集計する)のマクロは出来ますか?? シート数が10 加算したいセル数が約1000箇所 加算する位置はA1,A2,B4,B5,D6など様々です。 各支店別の在庫数と出荷数および金額のシートを各支店合計のシートに集計したいからです。 各支店別と各支店合計のフォーマットは同じです。 できれば、あらかじめ集計する各支店別シートとセル番地をシートに記載できるとベストですが。 こんなわがままなマクロなんて出来ますか?

  • Excelマクロの集計を算式でなく数値で記録・表

    C2~C10セルの値を集計してC1に表示と記録する場合、計算式sum(C2:C10)を残さず集計された値として表示と記録をしたいのですが、具体的にどの様な方法があるでしょうか? VBEとかです。VBEの記述方法などもお願いできますか? Win10,のOffice365のExcel を使用しています。 追伸:上記例のようなシートが同一ブック内に数多くあり、全シート統一したセルの数項目の合計を更に串刺し手法で統合したいのです。串刺しではsum(C2:C10)で集計したままのセルは使えないようですが、数値をいれれば串刺し統合が出来ます。

  • エクセルの数式の置換

    エクセルの数式の置換 FileAの数式をFileBにコピーしたのですが、「FileA」の書式が残ってしまい、それを置換しようとしてもうまくいきません。 串刺し計算の数式 =SUM('[FileA.xls]Sheet1:Sheet4'!セル)を FileBの中で =SUM('Sheet1:Sheet4'!セル) となるように置換したいのですが、どのようにすればいいでしょうか?

  • エクセルでのシートを飛ばした数式

    教えてください、エクセルでシートを何枚も追加しているのですが合計をまとめて最後のページで集計したいのですが数式が分かる方お願いします。

  • 【Excel VBA】データを集計する数式を入力するマクロ

    Excel2003を使用しています。   A列   B列   C列   D列   E列   F列 1      9/1                    20000 2      9/2              1000 3      9/10              5000 : : 10           9月計        ※1    ※2    11 12 13     10/1                   10000 14     10/10             2000 15     10/14                   4000 : : 20           10月計       ※3    ※4 上記のデータでいうと、 ※1(E10セル) =SUM(E1:E9) ※2(F10セル) =SUM(F1:F9) ※3(E20セル) =SUM(E13:E19) ※4(F20セル) =SUM(F13:F19) という内容の数式を入力するマクロを作成したく、数式を入力したいセルをアクティブにして、ボタン等に登録したマクロを実行すると数式が入力されるようにしたいと考えていますが、その際、集計範囲の最下行は、アクティブセルの1行上までになりますが、最上行をどのようにして取得すればよいかがわかりません。 (実際のデータは、もっと行数も入力されているデータ数も多いです) また、他にもこんな方法があるとか、こうしたほうが簡単とかあれば、教えていただけると勉強にもなりますので助かります。 うまく説明できなくて申し訳ありませんが、よろしくお願いします。

  • エクセル数式の質問です。

    エクセルで日付別のシートが(1~31)まであります。 集計シートに日別での集計表を作っていますが、 集計シートに1日のシートの数式を=SUM('1'!$R$7:$R$8)と集計シートのB2にあります。 これを右に連続コピーでシートの2~31を作る事って出来ますか? 元の数式が変わっても構いませんのでよろしくです。 ちなみに集計シートB3には=SUM('1'!$R$9:$R$10)とあります。 1日の集計分の数式は出来てるのですがまとめて右にコピーしてシート名を一つずつ変更してます。効率のいい方法を教えてください。

  • エクセル数式の質問です。

    エクセルで日付別のシートが(1~31)まであります。 集計シートに日別での集計表を作っていますが、 集計シートに1日のシートの数式を=SUM('1'!$R$7:$R$8)と集計シートのB2にあります。 これを右に連続コピーでシートの2~31を作る事って出来ますか? 元の数式が変わっても構いませんのでよろしくです。 ちなみに集計シートB3には=SUM('1'!$R$9:$R$10)とあります。 1日の集計分の数式は出来てるのですがまとめて右にコピーしてシート名を一つずつ変更してます。効率のいい方法を教えてください。

  • シート名を計算式に反映させる方法

    お世話になります。 エクセル2003で、毎日の日報を作成しており、日ごとに1シートを使用しています。B1セルには日付が入り、シート名はその日付と連動させています。その中で、当日までの売り上げの累計欄があり、その計算方法は串刺し計算で、日々のシートの前後に「Top」と「End]というシートを作り、例えばA1セルに当日の売り上げを入力するとすれば、A2セルに「=SUM(Top:End!A1)」と入力して、「Top」から「End」の合計を出しています。 ところがこの方法では、日付を遡って日報を出したい場合は、Endシートまでの合計が、遡った日付のシートでも計算されてしまうので、これを解決しようと思い、B1セルの日付データを使って =SUM('Top:text(B1,m月d日)'!A1) と入力してtopシートから当日までの串刺しをしようとしてみたのですが、=SUM('Top:[text(B1,m月d日)]text(B1,m月d日)'!A1)という式に自動的に変わってしまいできません。どのようにすればよいのでしょうか。マクロは使わない方向で、できればよろしくお願いいたします。

  • エクセルのマクロで数式を入力したい

    エクセルのマクロで数式を入力したい エクセルのマクロでシート1のA1に シート2のA1の値を表示させる数式を入力したいと思って Sub tamesi() Sheet1.Activate Range("a1") = "=sheet2!a1" End Sub と書くと動作します ここにIF文をいれてシート2のA1に値がないときは シート1のA1には空白で返したいと思い Sub tameshi2() Sheet1.Activate Range("a1") = "=if(sheet2!a1= 0,"",sheet2!a1)" End Sub と打つと動作しませんでした アプリケーションの定義またはオブジェクトの定義のエラーです と返ってきます。 いろいろやってみたのですが、なにせ勉強し始めで よくわかりませんでした。 教えてください よろしくお願いします

専門家に質問してみよう