Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 7 Professional : Excel 2010)
複数シートのシート名の一部を一括で変更したい
投稿日時: 19/09/06 15:35:41
投稿者: ゆきうさぎ

VBA初心者です。
毎月決まったExcelファイルをコピーして使用するのですが、
シート名をそれぞれ変更しなくてはいけません。
 
たとえば
4月分のファイルをコピーして5月分を作成する場合
シート名が ”エリア名”+4月分+”請求書” となっているところを
 
コピーした新しいファイルでは
シート名が ”エリア名”+5月分+”請求書” と変更する必要があります
 
シートは複数あり、エリア名は其々のシート固定です。
下記のように。
1つのシート名を変える方法は分るのですが。。。
 
Sub Sampleシート名()
    ActiveSheet.Name = "エリア"
End Sub
 
まだまだ、勉強中ではありますが
業務で早急に対応が必要となりました
アドバイスをお願いいたします。
 
 
 

回答
投稿日時: 19/09/06 16:34:32
投稿者: mattuwan44

>業務で早急に対応が必要となりました
そんなことを言われても、あなたのお仕事を代行する義務は回答者にありませんし、
代わりにコードを書いてあげたところで、ゆきうさぎの為にならないと思いますが、
こちらに時間がないので、こちらが勉強して書いたコードを載せておきます。
 
一行一行しっかり読んで理解されることを望みます。
 

Option Explicit

Sub test()
    Dim ws As Worksheet
    Dim sName As String
    Dim i As Long

    With Worksheets
        Set ws = .Item(.Count)
    End With
    ws.Copy after:=ws
    sName = ws.Name
    i = GetNum(sName)
    ws.Next.Name = Replace(sName, i, i + 1)
End Sub

Function GetNum(ByVal s As String) As String
    Dim i As Long
    
    For i = 1 To Len(s)
        If Mid(s, i, 1) Like "[0-9]" Then
            GetNum = Val(Mid(s, i))
            Exit For
        End If
    Next
End Function

 
上手く動かなかったらごめんなさいです。

回答
投稿日時: 19/09/06 17:03:13
投稿者: WinArrow
投稿者のウェブサイトに移動

シート名の構成が
>”エリア名”+5月分+”請求書”
ということですが、
実際の例をセル名した方がよいではないかと思います。
エリア名は、桁数が固定なんですか?
固定だと簡単ですが、エリア名の中に数字があると厄介です。
「月」の位置を探して、1桁or2桁を左の文字を取得すればよいですが、
数字によっては、判断が難しいかも・・・
 
12月の次は、1月にするんでsか?
 
このコードは何時実行するんですか?
ブックの複写後と思いますが、ブック名との関連はどのようになっていますか?

回答
投稿日時: 19/09/06 17:40:50
投稿者: simple

既にコメントをいただいて、混乱させることになるかもしれませんが、敢えて。
 
・コードの一部(4月とか5月とか)はその都度、変更する
・コピーしたブックがアクティブになっている
という前提で、

Sub test()
    Dim ws As Worksheet
    
    For Each ws In Worksheets
        ws.Name = Replace(ws.Name, "4月", "5月")
    Next
End Sub
としてみては?
必要なら、変更後の月をInputBoxで入力させる方式にするとか、
色々工夫はあると思いますが、これが骨格になるのではないですか?

回答
投稿日時: 19/09/06 20:01:25
投稿者: 半平太

目的のファイルは開かれており、アクティブの場合

Sub changeShName()
    Dim ws As Worksheet
    Dim nms
    Dim keta As Long
    Dim nextMon As String
    
    For Each ws In ActiveWorkbook.Sheets
        If ws.Name Like "*月*" Then
            nms = Split(ws.Name, "月請求書")
            keta = IIf(IsNumeric(Right(nms(0), 2)), 2, 1)
            nextMon = StrConv(Right(nms(0), keta) Mod 12 + 1, vbWide)
            ws.Name = Left(nms(0), Len(nms(0)) - keta) & nextMon & "月請求書"
        End If
    Next
End Sub

回答
投稿日時: 19/09/06 21:04:20
投稿者: WinArrow
投稿者のウェブサイトに移動

simple さんの
Replace案に一票
 
但し、変換後の文字列をInputBoxで受けとったら、
変換前の文字列を作成したほうがよいです。
 
エリア名が、例えば、AB0011だとすると
AB00111月請求書
というシート名の場合、
11月なのか、1月なのか判断できない
ということになりませんか?

トピックに返信