この人頭いいなと思ったエピソード

初めて質問をさせていただきます。文面など、分かりにくい部分も
多々あるかと思いますが、ご容赦ください。

Excel2003のVBAで1つのマクロを複数のシートで実行したいのですが、
上手くできません。過去のQAも拝見しているのですが、
思うように動かずです。

具体的には
Sub カレンダー作成G5()
Dim 日数 As Long
Dim 日付 As Variant
Dim 月 As Integer, 年 As Integer
Dim 入力セル As Range

日付 = Application.InputBox _
("yyyy/m 形式の年月を半角で入力してください" & Chr(10) _
& " 例)2013年の1月 → 2013/1")

If 日付 = False Or IsDate(日付) = False Then
Exit Sub
End If


月 = Month(日付)
年 = Year(日付)
Range("c3").Value = DateSerial(年, 月, 1)

Range("G5:Ak5").Select
Selection.ClearContents
日数 = 0

For Each 入力セル In Selection
入力セル.Formula = "=$c$3+" & 日数
日数 = 日数 + 1
If 月 <> Month(Range("c3") + 日数) Then Exit For
Next

End Sub

です。これを、1ブックのシートが1~10ある中から、例えば「シート2,5,8」と言った具合に、
複数のシートで実施したいのです。
(選択するシートは固定ですが、今後のシートの追加は、可能であれば想定したいです。)

 なお、この記述も、前任者の記述であり、当方はまったくの未経験者とご認識ください。
従いまして、後学の為、1文ごとに簡単なコメントなどをいただけますと、本当にありがたく。
(さらに欲を申し上げますと、VBA初心者にお勧めの参考書やURLもご紹介いただけますと幸いです。)

 また、OKwaveのシステムも理解できておりませんので、お礼も言葉のみとなってしまいます。
その点も、ご理解いただけますと幸いです。

 ぜひとも「無知な人間に勉強する機会を」いただけましたらと思います。
有識者のみなさま、ご指導をよろしくお願いいたします。

A 回答 (4件)

NO2です。


一例です。
全シートを検索して対象のシート("Sheet2", "Sheet5", "Sheet8")に日付を展開します。

Sub カレンダー作成2()
Dim 日付, i As Integer
日付 = Application.InputBox _
("yyyy/m 形式の年月を半角で入力してください" & Chr(10) _
& " 例)2013年の1月 → 2013/1")
If 日付 = False Or IsDate(日付) = False Then Exit Sub
For i = 1 To Sheets.Count
With Sheets(i)
Select Case .Name
Case "Sheet2", "Sheet5", "Sheet8"
.Range("G5").Resize(, 31).ClearContents
.Range("C3,G5").Value = DateSerial(Year(日付), Month(日付), 1)
.Range("G5").AutoFill Destination:=.Range("G5"). _
Resize(, Day(DateSerial(Year(日付), Month(日付) + 1, 0)))
End Select
End With
Next
End Sub
    • good
    • 0
この回答へのお礼

ご連絡が遅くなってしまい、本当に申し訳ありません。
できました!感動です!すごいです!

 正直に申し上げて、内容理解にはまだ時間がかかりますが、
いずれにしましても、解決いたしました。

 本当にありがとうございます。数ある質問の中で、私が
掲載した質問に目を留めていただけた事に深く感謝いたします。

 今後も引き続き、色々と質問を掲載する機会があるとは
思いますが、ご縁がありましたらぜひまたお願いいたします。

お礼日時:2013/03/07 10:47

こんにちは!


すでにマクロがありますので、
>1つのマクロを複数のシートで実行したいのですが・・・

とありますが、別マクロを標準モジュールに作り、今のマクロを実行させる方法はどうでしょうか?

Alt+F11キー → すでにあるマクロの下に下のコードをコピー&ペーストして
追加した「複数Sheet操作」マクロを実行してみてください。


Sub 複数Sheet操作()
Dim k As Long, str As String, myArray
str = Application.InputBox("操作したいSheet番号を" & vbCrLf & _
"2,4,5のようにカンマ区切りで入力してください。")
'インプットボックスにカンマ入力があれば
If InStr(str, ",") > 0 Then
'カンマで入力値を区切って、格納する
myArray = Split(str, ",")
'カンマで区切った最初の文字~最後の文字まで
For k = 0 To UBound(myArray)
'k番目のSheetをactiveに
Worksheets(Val(myArray(k))).Activate
'マクロを実行
Call カレンダー作成G5
'次のSheetに!
Next k
'インプットボックスにカンマ入力がない場合(一つのSheetのみに場合)
Else
'アクティブなSheetにマクロを実行
Call カレンダー作成G5
End If
End Sub

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 0
この回答へのお礼

 ご連絡が遅くなってしまい、申し訳ありません。
また、非常に丁寧なコメントまで掲載していただき、
重ねて御礼申し上げます。

 「なるほど!」の一言に尽きます。感服いたしました。

 こういった方法もあるのですね。1つの目的に対して、
さまざまなアプローチの仕方があるのだと、今回お教え
いただいた内容を拝見し、思いました。

 まだまだVBAに対して、駆け出しどころか「準備運動」の
状態ですので、しっかりと勉強したいと思います。

 貴重なお時間をいただき、ご教授いただきまして、
本当にありがとうございました。今後もVBA関連で質問させて
いただくことがあると思います。この名前を見たときには、
ぜひまたよろしくお願いいたします。

お礼日時:2013/03/07 10:51

>1つのマクロを複数のシートで実行したい


 ⇒各シートで実行したいのなら、標準モジュールに登録して、対象シートをアクティブにして実行すればOKです。
  それとも1回の年月入力で複数の固定シートに同一カレンダを展開したいのでしょうか。
    • good
    • 0
この回答へのお礼

コメントいただきありがとうございます。
心よりお礼申し上げます。
その上で、お教えください。

>それとも1回の年月入力で複数の固定シートに同一カレンダを
>展開したいのでしょうか。
⇒ご推察の通りです。まさに仰っている形にしたいのですが、
 お恥ずかしい話なのですが、
 私の知識では到底できるはずがない状況でございます。

 もしも可能であれば、質問させていただいた記述に対して、
付記していただく形で、ご教授願えないでしょうか?
ご面倒をおかけすることを承知で、ご無理を申し上げております。
ぜひとも、よろしくお願いいたします。

お礼日時:2013/03/06 16:57

マクロは標準モジュールだとして、activesheet.nameにより実行を制御すればイイのでは??

    • good
    • 0
この回答へのお礼

コメントいただきありがとうございます。
心よりお礼申し上げます。

 その上で、さらにご教授いただきたく。

>マクロは標準モジュールだとして、activesheet.nameにより
>実行を制御すればイイのでは??
⇒ 仰るとおり、マクロは標準モジュールに設定されています。
 後半部の「activesheet.nameにより~」の部分が、
 申し訳ありません。よく・・・分かりません。

 大変お手数だとは思うのですが、私が記述いたしました
内容に「追記」していただく形で、ご教授願えないでしょうか?
ぜひとも、よろしくお願いいたします。

お礼日時:2013/03/06 16:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!