- ベストアンサー
シートの名前
エクセルで、O1の納入日がシート名になるように下記のように しています。 ActiveSheet.Name = Format(Range("O1"), "mm.dd") このままだと、同日に作成した2枚目以降のシート名が同じになりエラーがでます(;.;) Sheet1をコピーした時のSheet1(2)のように(2)、(3)とつけれないでしょうか。 お分かりになる方、初心者の質問で申し訳ないですが回答お願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
質問の内容をころころ変えてはいけませんよ。 最初の質問では、 >Sheet1をコピーした時のSheet1(2)のように(2)、(3)とつけれないでしょうか。 となってますね。これは 09.25、09.25(1)、09.25(2) と、一枚目には連番はなし、ということですよね。 ところが、回答2のお礼には >0612_1、0612_2、0613_1、0613_2、0613_3 と最初の1枚目から、連番が振られてます。 これコードが若干ですが違ってきます。 質問内容がぶれないようにしましょう。 と、ま、それは置いといて 方法はいつくかありますが、一案。 '--------------------------------------------- Sub test() Dim N As Integer On Error Resume Next ActiveSheet.Name = Format(Range("O1"), "mm.dd") If Err.Number > 0 Then Err.Clear For N = 2 To 333 ActiveSheet.Name = Format(Range("O1"), "mm.dd") & " (" & N & ")" If Err.Number = 0 Then Exit For Err.Clear Next N End If On Error GoTo 0 End Sub '-------------------------------------- 上記は最初の質問のように、1枚目には連番はつけません 09.25、09.25(1)、09.25(2) となります。 それから、非常に重要なことが提示されてません。 それはシート名を変更するタイミングです。 今日の分は、一気にやるのか、 それとも、シート1の処理が終ったら、シート1のシート名変更 シート2の処理が終ったら、シート2のシート名変更 とやるのか また、シート1のシート名を変更したあと、ブックを閉じて ランチでもとったあと、再度ブックを開いてシート2の処理をしてシート名を変更する場合があるのか 場合によっては、また、merlionXXさんに怒られてしまいますよ。(^^;;;
その他の回答 (4)
- merlionXX
- ベストアンサー率48% (1930/4007)
No2 merlionXXです。 > 説明不足ですみません。 > この場合違う日付でも通して番号が振られてしうみたいなので、 そういう条件は最初から書いてください。 Staticはやはり使えると思いますのでこういうのはどうですか? 日付により、連番を振ります。 Dim myAr Dim x As String, i As Integer, n As Integer Static st As String x = Format(Range("O1"), "mm.dd") st = st & x & "/" myAr = Split(st, "/") For i = LBound(myAr) To UBound(myAr) If myAr(i) = x Then n = n + 1 End If Next i ActiveSheet.Name = x & "_" & n
お礼
ありがとうございます!! 本当に説明不足ですみませんでした! ばっちりできました(^▽^*) みさなん、ご迷惑おかけしました。
- imogasi
- ベストアンサー率27% (4737/17069)
シート名の()内の数字が、決まる理屈がはっきりしているので出来ます。しかしコード作成技術的には、泥臭いかスマートか(結果としてコード行数の多少や判りやすさに)人により差が出るように思います。 やはり現存するシート名と総なめで、(先頭文字からで良い)同じ文字列のシート名が有るかを聞く(For Each Next)。 あれば()内の数字の最大値を求める。 それに+1した数字を()内に入れ、それをシート名にする。 ーー 特別にシートを決めてそこに現存するシート名を記録したりしない限り、プログラムの中でシート名を総なめ法で全部終わりまで読まないと、結果が出せないものと思う。エクセルの関数のMax関数的な思考が使えないと思う。 ーー Sub test01() kakm = 0 'カッコ内の数の最大を記録する変数 sn = InputBox("シート名") For Each sh In Worksheets MsgBox sh.Name If sn = Left(sh.Name, Len(sn)) Then '先頭から同じ名か MsgBox "同名あり" a = Split(sh.Name, "(") '(で文字列を分割 MsgBox UBound(a) If UBound(a) = 0 Then '()が無ければkakmは0のまま Else a(1) = Replace(a(1), ")", "") ')を省く MsgBox a(1) If kakm < a(1) Then kakm = a(1) '過去のkakmより大きいか End If End If Next MsgBox kakm '最大の()内数決定 nsn = sn & "(" & kakm + 1 & ")" MsgBox nsn Sheets.Add.Name = nsn End Sub ーー 確認用に入れたが、しつこければMsgboxの行は抹消のこと。 私の例ではSheet1からSheet4までシートがいま有る。 InputBoxの要求に対し「Sheet3」と答える。 Sheet3(1)が増える。 再度実行して、Sheet3と答える。 Sheet3(2)が増える。 以下続けて()内が増えることを確認した。 ーー 他にも方法はあると思うが、しかしこういうロジックやコードは、初心者には難しいのではないか。
お礼
回答ありがとうございます。 初心者では難しいみたいですね(^^;) コピペして使わせていただきます。
- merlionXX
- ベストアンサー率48% (1930/4007)
Static変数を使ってみたらいかがでしょう? プロシージャレベルの変数でも、Staticで定義するとプロシージャ終了時に消去されず、次にプロシージャを実行したときに前の値が残っていますので連番が振られますから便利」です。 Static st As Integer st = st + 1 ActiveSheet.Name = Format(Range("O1"), "mm.dd") & "_" & st
補足
回答ありがとうございます。 勉強になります。 説明不足ですみません。 この場合違う日付でも通して番号が振られてしうみたいなので、 これを、0612_1、0612_2、0613_1、0613_2、0613_3 といったように日付ごとの連番はできないでしょうか。 たびたび申し訳ないです。お願いします。
「"mm.dd"」の部分を、「"mm.dd hh:mm")」とでもしたらどうでしょう。
お礼
回答ありがとうございます。 それも考えたんですが、できるだけこの日の2枚目。 という感じでシンプルにできないかなと思いまして(^^;
お礼
回答ありがとうございます。 merlionXXさんの回答をもとに、こうできないかなとおもって(^^; ほんとに説明不足で申し訳ないです。 最初に思ってたとおりにばっちりできました!! ほんとにありがとうございました。