![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?a65a0e2)
今日からVBAを勉強し始めました初心者です。会社である作業をしており、VBAでの作業がうまくいかなくて困っております。
「実績」というシートを11/5に作ったとします。
このシートを、11/9にマクロを実行した時に、
・11/5のシートをコピーし複製を作る(この時点ではシート名は「実績(2)」)
・この時、シート名は「11-05」となるように設定済み
(実績シートの「G1」セルから、日付を取得しファイル名とする) としています。
この時、まれに同じ日に間違ってマクロを動かす為、同じシート名となりエラーが出てしまいます。
利用者が不慣れなため、エラーの対処方法を教えることでは対処が難しい状態で、できればマクロで対応しようと思っています。
以下、シート名が重複しない場合のみ利用可能なデータです。
'前回作成した「実績」のコピー&リネーム
Dim mySheet As Worksheet
Set mySheet = ActiveWorkbook.Worksheets("実績")
mySheet.Copy after:=Worksheets("実績")
'実績sheetの後ろにコピー
ActiveSheet.Name = Format(Range("G1").Value, "m-dd")
' シート名を変更する
他の質問を検索しましたが、コピーしたファイルをリネームし、
そのリネーム結果が重複している場合の記述方法がよくかわりませんでした。
重複している場合は、できればメッセージボックスで「yesno」の選択で上書きの選択ができればと思っています。
(VBAでは一度削除してから新規に作るようですが、上の重複のからみで、よくわからなくなっています)
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
こんばんは。
>ActiveSheet.Name = Format(Range("G1").Value, "m-dd")
意味は分かるのですが、こういうコードは、確かにこれで通るのですが、かなり乱暴なやり方です。Range("G1").Value ではなくて、「実績」の方のG1 の値のはずです。
なお、当たり前ですが、「標準モジュール」に登録してください。
Sub Test1()
Dim mDate As String
Dim Ret As Variant
With Worksheets("実績")
mDate = Format(.Range("G1").Value, "m-dd")
Ret = Evaluate("='" & mDate & "'!A1")
If Not IsError(Ret) Then
If MsgBox("既に、" & mDate & " シートはあります。" & vbCrLf & _
"上書きしますか?", vbQuestion + vbOKCancel) = vbCancel Then
Exit Sub
Else
.Cells.Copy Worksheets(mDate).Range("A1")
End If
Else
.Copy After:=Worksheets("実績")
ActiveSheet.Name = mDate
End If
End With
End Sub
早いアドバイスありがとうございました。
無事、完成させることができました。
ありがとうございました。
一点、
>ActiveSheet.Name = Format(Range("G1").Value, "m-dd")
>意味は分かるのですが、こういうコードは、確かにこれで通るのですが、かなり乱暴なやり方です。Range("G1").Value ではなくて、「実績」の方のG1 の値のはずです。
というのが、乱暴な理由がよくわかりませんでした。
なにか決まり事や、常識のようなものがあるのでしょうか?
すいません。
No.4
- 回答日時:
こんばんは。
>>ActiveSheet.Name = Format(Range("G1").Value, "m-dd")
ActiveSheet.Name
と
Format(Range("G1").Value, "m-dd")
Range("G1").Value の親オブジェクトは、ActiveSheet ですが、もともと、そのシート名を起こすための「日付」は、元になったシートのはずです。コピーしているから同じことですが。VBAでは、省略したときに、その親オブジェクトがどうなっているのか、常に頭に入れておかなくてはなりません。一見は、正しいように見えても、それを曖昧にしていると、エラーや、まったく違った値になることがあります。
With Worksheets("実績")
mDate = Format(.Range("G1").Value, "m-dd")
Range の前に、「.(点)」が入っているのは、その為です。この辺りは、VBAを1年ぐらい経ってから、良く失敗する部分です。
なるほど、大変よくわかりました。
今はまだかなりの初心者なので、こういうところは
曖昧にせず記述しておいたほうが頭がすっきりしそうですね。
ありがとうございました。
No.2
- 回答日時:
一例です。
最初のMacro1は存在するシートの名前を調べて、同名のシートがあれば確認メッセージを出すものです。Macro2ははじめにシート名の変更を行ってみて、エラーが発生したら(=同名のシートがあり)警告メッセージを出すものです。どちらかというとMacro1の方がBetterでしょう。なお同名のシートがあって、上書きをしない場合は「11-9-2345」のように時刻をシート名に入れるようにしています
Sub Macro1()
Dim mySheet, sh As Worksheet
Dim res As Integer
Dim str As String
Dim psw As Boolean
Set mySheet = ActiveWorkbook.Worksheets("実績")
mySheet.Copy after:=Worksheets("実績")
'実績sheetの後ろにコピー
str = Format(Range("G1").Value, "m-dd")
For Each sh In Worksheets
If sh.Name = str Then
psw = True
End If
Next sh
If psw Then
res = MsgBox("同名のシートが既に存在しますが上書きしますか?", vbOKCancel)
If res = 1 Then
Application.DisplayAlerts = False
Worksheets(str).Delete
ActiveSheet.Name = str
Application.DisplayAlerts = True
Else
ActiveSheet.Name = str & Format(Time, "-hhmm")
End If
Else
ActiveSheet.Name = str
End If
End Sub
Sub Macro2()
Dim mySheet As Worksheet
Dim res As Integer
Dim str As String
Set mySheet = ActiveWorkbook.Worksheets("実績")
mySheet.Copy after:=Worksheets("実績")
'実績sheetの後ろにコピー
On Error GoTo err1
str = Format(Range("G1").Value, "m-dd")
ActiveSheet.Name = str
Exit Sub
err1:
res = MsgBox("シート名が重複しますが上書きしますか?", vbOKCancel)
If res = 1 Then
Application.DisplayAlerts = False
Worksheets(str).Delete
ActiveSheet.Name = str
Application.DisplayAlerts = True
Else
ActiveSheet.Name = str & Format(Time, "-hhmm")
End If
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/05/24 08:33
- Visual Basic(VBA) VBAマクロでシートコピーした新シートにコピー元シートとの計算式の入れ方を教えて下さい。 5 2022/11/20 09:48
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 3 2023/02/28 01:13
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) 特定の文字を含むシートだけマクロ処理をしたい 1 2023/05/22 01:43
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/03 12:30
- Excel(エクセル) シート名を簡単に書く方法があれば教えてください。 4 2023/08/24 12:40
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/26 13:19
- Visual Basic(VBA) VBAマクロ 決まっていない行を選択して別シートへ貼付け 4 2023/02/16 16:08
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 1 2023/02/27 22:21
このQ&Aを見た人はこんなQ&Aも見ています
-
見学に行くとしたら【天国】と【地獄】どっち?
みなさんは、一度だけ見学に行けるとしたら【天国】と【地獄】どちらに行きたいですか? 理由も聞きたいです。
-
いちばん失敗した人決定戦
あなたの「告白」での大失敗を教えてください。
-
モテ期を経験した方いらっしゃいますか?
一生に一度はモテ期があるといいますが、みなさんどうですか? いまがそう! という方も、「思い返せばこの頃だったなぁ」という方も、よかったら教えて下さい。
-
あなたなりのストレス発散方法を教えてください!
自分なりのストレス発散方法はありますか?
-
思い出すきっかけは 音楽?におい?景色?
記憶をふと思い出すきっかけは 音楽、におい、景色 どれですか?
-
エクセルのシート名変更で重複した時のvbaの処理
Visual Basic(VBA)
-
Excel VBA シート名変更時、重複していたら連番を付けたい
その他(Microsoft Office)
-
VBAで同じシート名のコピー時は処理中止したいのですが・・・
Visual Basic(VBA)
-
-
4
VBAでシートコピー後、シート名が重複している時の処理
Excel(エクセル)
-
5
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
6
VBA シートをコピーする際に Copyメソッドは失敗しましたのエラーが出てしまいます
Visual Basic(VBA)
-
7
エクセルVBAでセルに入力したパスでブックを開く
Excel(エクセル)
-
8
Excelシート名が重複してらシート名に連番を付加させる方法
Excel(エクセル)
-
9
VBA シート名重複した場合削除する
Access(アクセス)
-
10
エクセルVBA 同じ名前のシートがすでにあるとエラートラップに飛ばしたいのですがうまくいきません こ
Visual Basic(VBA)
-
11
別ブックをダイアログボックスで指定してそこにあるシートをコピーしたい
Excel(エクセル)
-
12
InputBoxに入力した言葉をシート名にしたい!
Excel(エクセル)
-
13
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
14
「選択範囲を解除してアクティブセルを選択」をマクロで行うにはどうすればよいでしょうか
Excel(エクセル)
-
15
UserForm1.Showでエラーになります。
工学
-
16
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
-
17
エクセルVBA Ifでシート名が合致したら別ファイルから転記する場合のElse IfとForの書き方
Visual Basic(VBA)
-
18
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
19
VBAでセルに入っている日付をシート名にする
Excel(エクセル)
-
20
VBA セルの値と同じ名前のシートにデータを貼り付けするやり方を教えてください
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの複数シートの保護を...
-
別シート参照のセルをシート毎...
-
エクセルVBAでパスの¥マークに...
-
特定のシートの削除を禁止した...
-
シート番号からシート名を取得する
-
EXCEL:同じセルへどんどん足し...
-
シートの保護のあとセルの列、...
-
Excelで金銭出納帳。繰越残高を...
-
エクセルでファイルを開いたと...
-
複数シートの色付きセルがある...
-
エクセル 計算式も入っていない...
-
前の(左隣の)シートを連続参...
-
エクセルで前シートを参照して...
-
エクセルで前のシートを連続参...
-
エクセルのシート名をリスト化...
-
VBAでシートコピー後、シート名...
-
シートを追加・名前を次月に変...
-
エクセルで毎回1枚目のシートを...
-
エクセルVBA 串刺し計算の際、...
-
シート名ではなく、相対位置で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルの複数シートの保護を...
-
Excelで金銭出納帳。繰越残高を...
-
別シート参照のセルをシート毎...
-
前の(左隣の)シートを連続参...
-
エクセルで前シートを参照して...
-
エクセルでファイルを開いたと...
-
エクセル 計算式も入っていない...
-
エクセルで前のシートを連続参...
-
Accessのスプレッドシートエク...
-
特定のシートの削除を禁止した...
-
EXCEL:同じセルへどんどん足し...
-
エクセルVBAでパスの¥マークに...
-
シートの保護のあとセルの列、...
-
Excel、同じフォルダ内のExcel...
-
エクセルのシート名をリスト化...
-
シート番号からシート名を取得する
-
Excelのシートを、まとめて表示...
-
EXCELで1ヶ月分の連続した日付...
-
excelでシート毎の最終更新日を...
-
エクセルで毎回1枚目のシートを...
おすすめ情報