プロが教えるわが家の防犯対策術!

エクセルvba2013です。

シート名が例えば,「1-10」、「11-20」、「21-30」・・・と続いていくブックがあります。
最後に「原紙」という名前のシートを設けて、vbaを実行すると、「原紙」シートの前に新しいシートを作成し、名前を新しく作成したシートの前の名前から続けて連番をつけて、「原紙」シートの一部をコピー貼り付けしたいと思っております。
うまくいかないのは、新しく挿入したシートに前シートから続く連番をの名前をつける部分です。例えば、名前をつけたいシートの前シートが「99-100」だとすると、「101-110」という名前にしたいのですがうまくいきません。

下記コードの newsheetname  という変数の内容をどうするか?、または、それが無理ならシート上にシート名を取得しておいて、シート名に反映させるなど根本的にやり方を変えるということになると思いますが、もしコードで実現できる方法があるならば、それでやりたいと思います。


Sub シートコピー()

Dim beforesheetname As String
Dim newsheetname As String

beforesheetname = Worksheets(Worksheets.Count - 1).Name ’新しく挿入するシートの一つ前のシート名取得
newsheetname = beforesheetname  ’←??????どうすればいいか不明

Worksheets.Add(before:=Worksheets("原紙")).Name = beforesheetname '原紙シートの前に新規シート追加して、名前を変更

ActiveWindow.DisplayGridlines = False ’枠線を非表示
Worksheets("原紙").Range("A:AF").Copy Worksheets(beforesheetname).Range("A:AF") '原紙シートのセル内容を新しいシートに貼り付け



End Sub

質問者からの補足コメント

  • すいません。ミスです。補足いたします。
    「原紙」は必ず最後にあります。
    で、肝心の「99-100」はミスです。「91-100」でした。1から始まり 10刻みで考えていましたが、今回の回答をみて、可能ならば、前のシートの終わりの番号の続きから、 10刻みにできればと思います。例えば、途中例外で、「91-101」というシート名に手動で変更したとすると、次はvbaで「102-111」という10の範囲のシート名ができれば完璧です。
    記載ミスや変更等、すいませんがもし可能ならばご教授ください。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/09/14 22:15

A 回答 (2件)

No.1 です。



一応動作するサンプルです。
前のシート名が「A-10」などでも動いてしまうのはご愛敬ということで。

Sub シートコピー_サンプル()

 Dim BeforeSheetName As String
 Dim NewSheetName As String
 Dim strLastNum As String
 Dim LastNum As Long
 Dim pos As Long

 If Sheets.Count > 1 Then
  On Error Resume Next
  BeforeSheetName = Worksheets(Worksheets.Count - 1).Name '新しく挿入するシートの一つ前のシート名取得
  pos = InStr(1, BeforeSheetName, "-")
  If pos > 1 Then
   strLastNum = Mid(BeforeSheetName, pos + 1)
   LastNum = CLng(strLastNum)
  End If
  If LastNum = 0 Then
   MsgBox "前のシート名が不正です。"
   Exit Sub
  End If
  On Error GoTo 0
 End If

 NewSheetName = (LastNum + 1) & "-" & (LastNum + 10)

 Worksheets.Add(before:=Worksheets("原紙")).Name = NewSheetName '原紙シートの前に新規シート追加して、名前を変更

 ActiveWindow.DisplayGridlines = False '枠線を非表示
 Worksheets("原紙").Range("A:AF").Copy Worksheets(NewSheetName).Range("A:AF") '原紙シートのセル内容を新しいシートに貼り付け

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

どうもありがとうございました。ばっちり動きました。
コードの内容も分かりやすく理解できました。InStrやMidを使って取得すればよかったのですね。CLngを使ってエラー処理にもつなげていくのですね。
「A-10」などで動くのもまったく問題ありません。もし問題がでても、ここで使っている同じやり方で頭の部分も処理すればシート名の不正で停止させることもできますね。
どうもありがとうございました。

お礼日時:2015/09/15 23:10

シート名の付け方の規則がイマイチはっきりしないので


回答が付きにくくなっているようです。

・「原紙」は必ず最後にある。
・必ず 1から始まり 10刻みである。
 ※だとすると↓の「99-100」はなぜ?
> 例えば、名前をつけたいシートの前シートが「99-100」だとすると、「101-110」という名前にしたいのですがうまくいきません。
・上記の例外もあるとすると、
 前のシートの終わりの番号から初めて 10刻み
 (前が 「103-111」で次は「112-121」になる?
 あるいは必ず 10 で割り切れる数値にする、
 等々。


不明の点があるとプログラムって作れないものなんですよ。
当てずっぽうで作ってやり直しになるのを嫌う回答者は多いと思われます。

解決したければ
すべての質問に明確にお答えください。
訊いていないことでも、必要と思われることは補足してください。
この回答への補足あり
    • good
    • 0

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