- ベストアンサー
エクセルのマクロについて教えていただきたいのですが・・・
見積書を作成しているんですが、1枚目のシート(見積書)に明細が書ききれなかった時に、マクロを実行すると、『明細書』と言う名前のシートが(1)~(5)枚目まで追加され、各シートの小計を1枚目のシートに書き出す・・・と言うマクロを作りたいのですが、うまくいかずに困っています>< 追加されるシートの元となる『見積もりマスター』と言うシートがあって、そのシート内でそれぞれのシートの小計は取れるのですが・・・ 下記のマクロの中に何か追加すればうまくいく方法はありますか?? (明細書は追加する時もあれば追加しない時もあってその都度、使う人が、最大5枚まで何枚追加するかを決めるそうです。) Sub Macro1() Dim cnt As Integer Dim wkNum As Double Dim ws As Worksheet For Each ws In Worksheets If Left(ws.Name, 4) = "明細書(" Then If IsNumeric(Mid(ws.Name, 5, 1)) Then wkNum = Val(Mid(ws.Name, 5, 1)) If cnt < wkNum Then cnt = wkNum End If End If End If Next ws If cnt >= 5 Then MsgBox ("明細書シートが既に5枚以上あるため追加できません") Exit Sub Else Sheets("明細マスター").Copy after:=Sheets(Worksheets.Count) ActiveSheet.Name = "明細書(" & cnt + 1 & ")" End If End Sub マクロ自体をあまり理解できてなくて、会社の人や、ここで教えていただいて進めているので、出来ればそのままコピーして使用できるようにしていただけるとありがたいです。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#02、04です。まだわかりません。#04の補足説明が補足要求の答になっていません。 明細書マスターおよび明細書(1)~(5)で小計のセルはE31:F31ですね。 それをなぜD52のような1つのセルにコピーするのですか? もしかしてE31:F31セルは結合されているのですか? とりあえず明細書(1)~(5)のE31を見積書シートのD52~D56に表示できるようにマクロを書きかえました(1行追加しただけですが…) また複数枚明細シートが必要なら複数回マクロを実行してください。枚数入力させるとマクロも長くなります。 お仕事で使うようですから、後は会社の人に相談されるとよいでしょう(^^) Sub Macro1() Dim cnt As Integer Dim wkNum As Double Dim ws As Worksheet For Each ws In Worksheets If Left(ws.Name, 4) = "明細書(" Then If IsNumeric(Mid(ws.Name, 5, 1)) Then wkNum = Val(Mid(ws.Name, 5, 1)) If cnt < wkNum Then cnt = wkNum End If End If End If Next ws If cnt >= 5 Then MsgBox ("明細書シートが既に5枚以上あるため追加できません") Exit Sub Else Sheets("明細マスター").Copy after:=Sheets(Worksheets.Count) ActiveSheet.Name = "明細書(" & cnt + 1 & ")" Sheets("見積書").Cells(cnt + 52, "D").Formula = "='明細書(" & cnt + 1 & ")'!E31" 'この行が追加されました End If End Sub
その他の回答 (4)
- zap35
- ベストアンサー率44% (1383/3079)
#02です。前回の回答に補足をいただいていたのですね。 でも回答に対して何日も経ってから補足書き込みされても、前の回答を巡回しなくなりますから、本当にお困りなら書き込みレスポンスは早くする方がよいですよ。今日のレスポンスも早いとは言えませんね(^^; それに折角前の質問に補足を書いたなら、前回の質問番号も書く方が親切でしょう。今回の皆さんの回答がムダになります >詳しく言うと・・・ >追加されたシート『明細書(1)~(5)』の、セル『E31:F31』を、>表紙『見積書』の『D52~D56』にコピーすると言う内容です。 >D52~D56は最後に集計を取る時の数式に使用します。 これも変ですね。明細書(1)~(5)のE31:F31を転記するとなると、見積書シートのセルは2×5=10個必要になるはずですが、書き込み先はD52:D56の5個ですか? また「追加する時もあれば追加しない時もあって」もどのようにすれば良いのかがわかりません。他人にわかりやすく整理していただけないでしょうか
お礼
そうだったんですね↓ ここに書き込みするようになったのもまだ最近だったんで、どうしたらいいのかイマイチ分かってなくて・・・ ありがとうございます、次からは気をつけます。 >詳しく言うと・・・ >追加されたシート『明細書(1)~(5)』の、セル『E31:F31』を、>表紙『見積書』の『D52~D56』にコピーすると言う内容です。 >D52~D56は最後に集計を取る時の数式に使用します。 上の部分は、明細マスターでの小計のセルが『E31:F31』で、見積書にコピーして来たいセルが、追加された1枚目がD52・2枚目がD53・3枚目がD54・4枚目がD55・5枚目がD56・・・と言う意味です。 >また「追加する時もあれば追加しない時もあって」もどのようにすれば良いのかがわかりません。他人にわかりやすく整理していただけないでしょうか この部分は、使う人が数人いるのですが、その時々によって、見積書が1枚だけでいい場合もあれば、たくさんの量の明細書が必要だったりするそうで、追加したい明細書の枚数もその都度変わるようです。 いつも分かりにくい質問ですいません><が、よろしくお願いしますm( 。 。)m
- -yellowtail-
- ベストアンサー率65% (43/66)
かなり説明不足ですので、意味が違ってとらえているかも知れません。 一応、明細書(n)というシートは出来るけど、そのシートの小計を明細書に書き出せないと言う意味だと思います。 書き出す方法ですが、明細書追加時に書き出すとすると、常に小計は0ですよね? なので、明細書追加時に、追加した明細書シートの小計欄にリンクを貼る方法が良いかと思います。 そのままコピーして使用できるようにするには、ほんとに情報が少なすぎてムリなので、多少の改善は質問者様で頑張って行ってください。 例えば、明細の書き込める行が5行目~24行目、小計欄が25行目とします。 また項目を2列目(B列)に書き、金額を3列目(C列)に書くとします。 そして、明細書(1)の20~24行目は必ず空行にし、別シートの小計を記載する欄として利用者に徹底をお願いします。 その場合、記載していただいたマクロの下から3行目、EndIFの上に以下を付け加えてください。 ActiveSheet.Name = "明細書(" & cnt + 1 & ")" Sheets("明細書").Cells(20 + cnt, 2) = "明細書(" & cnt + 1 & ") 小計" Sheets("明細書").Cells(20 + cnt, 3).FormulaR1C1 = "=" & "'明細書(" & cnt + 1 & ")'" & "!R[" & 5 - cnt & "]C" End If これで、実行すると明細書シートが1枚増え、小計が明細書シートにも記入されるようになります。 多分、明細書の書式が違うので、数字を変えてください。 変える場所は「Cells(20 + cnt, 2)」の20に小計をコピーしてくる行の数字、 「Cells(20 + cnt, 2)」の2に項目名の列数(A=1、B=2・・・)、 その下の「Cells(20 + cnt, 3)」も同様です。3には金額の列を。 いかがでしょうか?ご質問の趣旨に沿っているといいですが・・・。 あ、それから、もし「見積書」シートと「明細マスター」シートの書式が違って、金額の列が違う場合はまたちょっと変更があります。 例えば明細マスターではC列だけど、見積書ではD列に金額、と言う場合など。 その時は "=" & "'明細書(" & cnt + 1 & ")'" & "!R[" & 5 - cnt & "]C" この最後が変わります。 このCのあとに[1]という感じで数字を付け足してください。 CからDは1増えるので[1]です。2ふえるなら[2]。減るなら[-1]って感じです。 とりあえず、式をコピーして実行してみればわかってもらえるかと思います。 説明が下手ですみません。
お礼
ありがとうございます☆ こちらこそ、質問が分かり辛くてすいません>< 言いたかった内容は、お返事頂いた通りなんで、セルを変えて実行してみます。 ありがとうございました。
- zap35
- ベストアンサー率44% (1383/3079)
少し補足をお願いします マクロが実行されたときに「明細書の追加をする/しない」の確認をするだけなら例えば以下のようにすればよいですが、そもそもこのマクロは請求書を追加するために実行するのではありませんか? 追加する必要がないなら「実行しなければよい」ようにも思いますが… Sub Macro1() Dim cnt, res As Integer Dim wkNum As Double Dim ws As Worksheet res = MsgBox("明細書を追加しますか", vbYesNo) If res = vbYes Then For Each ws In Worksheets If Left(ws.Name, 4) = "明細書(" Then If IsNumeric(Mid(ws.Name, 5, 1)) Then wkNum = Val(Mid(ws.Name, 5, 1)) If cnt < wkNum Then cnt = wkNum End If End If End If Next ws If cnt >= 5 Then MsgBox ("明細書シートが既に5枚以上あるため追加できません") Exit Sub Else Sheets("明細マスター").Copy after:=Sheets(Worksheets.Count) ActiveSheet.Name = "明細書(" & cnt + 1 & ")" End If End If End Sub
補足
質問が分かり辛くて申し訳ありません。 シート(明細書)の追加まではうまく行っていて、使う側が明細書を追加したいときだけ、マクロを実行する(最大で5枚までで、追加する枚数は使う側がその都度、見積書の明細の量によって変わる)そうです。 その際に、追加された明細書の一番下の行に小計を取るようにしていて、そのセルは『E31:F31』で、その小計を、表紙『見積書』のD52~D56にコピーして来ると言うマクロを作りたいのですが・・・ 追加された明細書の1枚目の小計はD52に・・・2枚目はD53に・・・・・ と言う内容です。 分かりにくい質問&補足で申し訳ありませんが、よろしくお願いしますm( 。 。)m
- x0000x
- ベストアンサー率52% (67/127)
>うまくいかずに困っています どのように上手く行かないのでしょうか?
補足
質問が分かりにくくて申し訳ありません>< まず、明細書を追加する部分までは、質問に載せたマクロでうまく行くのですが、追加された明細書でそれぞれ、小計を取り(セルはE31:F31です)、その小計を、表紙『見積書』の、セルD52~D56にコピーすると言う内容です。 追加した明細書(1)の小計はD52へ・・・明細書(2)の小計はD53へ・・・明細書(3)の小計はD54へ・・・明細書(4)の小計はD55へ・・・明細書(5)の小計はD56へコピーしたいのですが。 うまく行かないと言うより、小計をコピーするマクロが分からないと書いた方が正しかったですね↓ 分かりにくい質問&補足で本当に申し訳ありませんがよろしくお願いします。
お礼
ありがとうございます。 明細書の小計のセルは結合されています。その小計を、見積書の一部にコピーして全てのシートの一覧が見れるようにしたかったので、こういうセルになってしまいました・・・それも書き込んだ方がよかったんですね。 これで、一度、マクロを作り直して実行してみます。 後は、会社の人に相談して教えてもらいます☆ 何度もありがとうございました。