- ベストアンサー
VBAでワークシートの操作を制御する
- VBAを使ってワークシートの操作を制御したい初心者です。具体的には、従業員出勤表を1シートにまとめて管理する方法について教えてください。
- 出勤表を作成後、フォームボタンを使って以下の機能を実現したいです:(1) 出勤表の年と月を取得し、重複するシート名がないか確認する (2) 重複するシート名がある場合は保存を中止する (3) 重複するシート名がない場合は出勤表の雛形をコピーし、新しいシートを作成して保存する (4) 出勤表の内容が変更された場合に再保存する
- 上記の要件に基づいてVBAコードを書いたのですが、(4)の部分がうまくいきません。どのように修正すればいいでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
何が問題なのか書いていませんが、(4)の上書き保存しようとすると(1)の条件で撥ねられることが問題なのでしょうか。そうだとすると、 >For Each ws In Worksheets の前に以下のコードが必要かと。 If ActiveSheet.Name = Range("A1").Value & Range("A3").Value Then ThisWorkbook.Save Exit Sub End If
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
>制御する 初心者にしては、大げさな表現だが、もう少し具体的な内容の表題にしては。 ーー 私の例で、既に関数bというシートがあり Sub test04() Worksheets.Add.Name = "関数b" End Sub を実行すると、エラーになります。 同一ブックでは同名のシートはそもそも許されないのでは。 存在を前提にしてチェックする ボタン保存_Clickはなに? 作る前のチェック?別にシートが出来て、そこのA1,A3の値が無いのは どういうこと、あとから付け加える?==>わかりました。雛形に年月を入れてコピーするのですね。空白雛形をコピーしコピー後の名前を変えるほうが自然では。 Sub Sample05() On Error GoTo err1 Worksheets("Sheet2").Copy After:=Worksheets(Sheets.Count) ActiveSheet.Name = "aaaa" '作りたいシート名を別途セット End err1: MsgBox "重複" ActiveSheet.Delete End Sub 作りたいシート名はInputBoxででも入れさせたら。 OKならその名をA1,A3にセットする。 (4)など、実際にやってみて、マクロの記録を採って見れば判るのでは。
お礼
迅速なご回答ありがとうございます。 表題、本文共に分かり難い表現に加え、説明も不足しておりました。 申し訳ございません。 この度の出勤表は‥ 雛形シートに年(A1セル)月(A3セル)を入れて、 その年月をシート名とした時に、重複シートが無いか確認する⇒ 重複無ければ、雛形シートをコピー⇒ コピーシートは、入力した年月で改め名前を付ける⇒ 雛形シートに戻り、入力範囲のセルをクリアして、次回ファイルを開いた時に、空の雛形シートから新規作成を始めるようにする。⇒ また、作成したシートを後から編集し保存した場合はファイルを上書きする。⇒ ‥といった流れで作ろうと考えていました。 しかし、imogasi様のご指摘通り、 空白雛形をコピーして、コピー後の名前を変えるのが自然だと気付きました。 今後の為にも、ご指摘頂いた所とVBAについての基礎を勉強して行きます。
お礼
早々のご回答ありがとうございます。 何が問題なのか、説明が不足しておりました。 大変、申し訳ございません。 この度の問題は、cistronezk様がおっしゃる通りです。 (4)の上書保存がしたかったのですが、(1)の段階で撥ねられておりました。 しかし、cistronezk様にお教え頂いた通り構文を訂正した所、当初の理想通りに動きました! 説明不足にも関わらず、ご回答頂けた事に感謝致します。 今後は基礎の勉強をすると共に、分からない事を教えて頂く時の聞き方にも注意を致します。