• ベストアンサー

エクセルマクロを教えてください

エクセル2003を使用しています。ブックに1シートあります。シート名は「C3」セルに入力してある日付にしますが、シート上の表示形式は「平成20年1月」となっているところをシート名は「08-01」にします。その後シートを11枚コピーし、それぞれのシートの「C3」セルに年月を入力し、シート名を「08-02」「08-03」・・・「08-12」としたいのですが、うまくいきません。 マクロに詳しい方のご指導をお願いいたします。

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

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.4

#01です。 >1枚目シートのC8セルに日付を入れると12枚のシート名が一括で変更できるようにする それではSheetモジュールに直下のマクロを貼り付けます。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$C$8" Then If IsDate(Target.Value) Then Call Macro1 End If End If End Sub そして標準モジュールシートに以下のマクロを貼り付けます。 Sub Macro1() Dim sh As Worksheet On Error Resume Next For Each sh In Worksheets If IsDate(sh.Range("C8").Value) Then sh.Name = Format(sh.Range("C8").Value, "YY-MM") End If Next sh End Sub 最初のシートのC8セルに日付が入力されたら、「全シートの名前変更」を行うMacro1をコールするようにしました。(#01のMacro1には誤りがあったので、今回の回答を貼り付けてください)

oto21
質問者

お礼

zap35さん、再度の回答ありがとうございました。なんとかなりそうです。お礼が遅れましたことをお詫び申し上げます。

その他の回答 (3)

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

> For~Next処理などを組込んで、1枚目シートのC8セルに日付を入れると12枚のシート名が一括で変更できるようにすることはできますでしょうか?  シートの「C3」セルですよね? こんな感じでしょうか。 Sheet1のシートモジュールをこう変えてみてください。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Integer If Target.Address = "$C$3" Then If IsDate(Target.Value) Then For Each st In Worksheets st.Name = "@" & i i = i + 1 Next For Each st In Worksheets st.Name = Format(st.Range("C3").Value, "yy-mm") Next End If End If End Sub For Nextを二度やってるのは同名のシート名のエラーを防止するためです。

oto21
質問者

お礼

merlionXXさん、ご回答ありがとうございました。VBA初心者のため、コードの組み立てがいまいちつかめませんでした。回答が遅れましたことをお詫びします。

noname#77517
noname#77517
回答No.2

どういうマクロで、どのようにうまくいかないのかを書いて いただかないと、アドバイスも難しいと思いますよ。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

元になるシートの「シート名タブ右クリック」→「コードの表示」で開く画面に以下のマクロを貼り付けます。 シート画面に戻ってC8セルに日付を入力してみてください Private Sub Worksheet_Change(ByVal Target As Range)  If Target.Address = "$C$8" Then   If IsDate(Target.Value) Then    ActiveSheet.Name = Format(Target.Value, "YY-MM")   End If  End If End Sub もし日付を入力したタイミングでシート名を変更するのではなく、後から全シート一括で変更するなら以下のマクロをALT+F11でVBE画面を開き、左上のVBA Projectでシート名を右クリックし「挿入」→「標準モジュール」で表示される画面に貼り付けて下さい。マクロの実行はワークシート画面に戻ってALT+F8でマクロ一覧を開き、マクロ名を選択して「実行」ボタンです。 Sub Macro1() Dim sh As Worksheet  On Error Resume Next  For Each sh In Worksheets   If IsDate(sh.Range("C8").Value) Then    ActiveSheet.Name = Format(sh.Range("C8").Value, "YY-MM")   End If  Next sh End Sub 複数のシートに同じ年月が入力されている場合は、シート名が重複するので最初のシートにのみ変更する仕様です。

oto21
質問者

補足

 早々にご回答をいただきましてありがとうございます。最初に記述されたコードをSheet1に貼付けて日付を入力したところ、シート名の希望型式での変更ができました。  2枚目以降のシートの同セル(C8)には数式で「=EDATE('08-01'!C8,1)」・・・「=EDATE('08-01'!C8,11)」を入れてあるので、見出しの月日表示も一括で変更となるのですが、2枚目以降のシート名は変更されません。  For~Next処理などを組込んで、1枚目シートのC8セルに日付を入れると12枚のシート名が一括で変更できるようにすることはできますでしょうか? 追加の質問で申訳ありません。

関連するQ&A