[[20230113122200]] 『シート名をコピペするマクロが作りたい』(みこ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『シート名をコピペするマクロが作りたい』(みこ)

カレンダーを作りたいです。

作成ボタンを押すと、
原本シートがコピぺされて、
シート名が自動変更になる
ように作りたいです。

シート名ですが、
『R○.○』
にしたいです。

セルをコピペ、もしくは
原本シートの特定のセルを指定して反映
をしたいのですが…

お恥ずかしながら不勉強でうまくいきません。
どなたかご教授いただけないでしょうか。

< 使用 Excel:Excel2019、使用 OS:Windows10 >


>うまくいきません。

現状でどこまでできているのですか?完成してなくてもよいので、現状のコードを示したうえで↓のように説明できませんか?

 【エラーが出る場合】
××の部分で、エラー番号〇〇、エラーメッセージ〇〇が表示されてしまいます。

 【エラーは出ないが思った結果にならない場合】
××になることを想定しているのに、〇〇となってしまう

 【コンパイルエラー、構文エラー】になる場合
××の部分がハイライトされます。

(もこな2) 2023/01/13(金) 13:13:28


もこな2さま

Sub シートをコピーする()

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("原本")

Dim wsName As String
wsName = ws.Cells(1, 10).Value

If nameCheckFlag(wsName) = True Then

    MsgBox "同名のシートが存在するため、シートを作成できません。"

Else

Worksheets("原本").Copy Before:=Worksheets(1)

ActiveSheet.Name = wsName    ←この部分で、実行時エラー1004を吐いてしまいます

End If

End Sub

―――――――――――――――――――――

Function nameCheckFlag(wsName As String) As Boolean

    Dim ws As Worksheet

    For Each ws In Worksheets
        If wsName = ws.Name Then
            nameCheckFlag = True
            Exit For
        Else
            nameCheckFlag = False
        End If
    Next ws

End Function

いかがでしょうか…。
(みこ) 2023/01/13(金) 13:29:26


 つけたいシート名はJ1セルに入力されているだろうか?
 またシート名に使えない文字が入ってはいないだろうか?
(ねむねむ) 2023/01/13(金) 13:35:25

ねむねむさん

J1に入力されており、使えない文字は特に入ってません。
どうしたらいいでしょう。
(みこ) 2023/01/13(金) 13:58:13


 シートの名前チェックの部分、せっかく関数かするなら空白や使えない文字のチェックもしたらいかがでしょう?
 これに差し替えてダメだった場合、また考えません?
    Function nameCheckFlag(wsName As String) As Boolean
        Dim ws As Worksheet
        Dim moji As Variant
        nameCheckFlag = True

        If wsName = "" Then Exit Function

        For Each moji In Array("\", "/", "?", ":", "[", "]", "*")
            If InStr(wsName, moji) > 0 Then
                Exit Function
            End If
        Next moji

        For Each ws In Worksheets
            If wsName = ws.Name Then
                Exit Function
            End If
        Next ws
        nameCheckFlag = False
    End Function

(稲葉) 2023/01/13(金) 14:04:29


稲葉さま

ありがとうございます!

まるまるコピペで差し替えてみましたところ、
同名のシートが存在するため、シートを作成できません
と、自分で設定したエラーメッセージを吐いてしまうようになりました…
(みこ) 2023/01/13(金) 14:11:33


皆さんと被る部分もありますが何点か。

■1
なんというエラーメッセージになってますか?
シート名に使えない文字が使われている場合は、そのエラーメッセージが答えだと思いますが・・・・

■2
原本シートのJ1セルに何らかの入力があり、シートに使えない文字も含まれていないことが前提ですが↓のようにしてみてはどうですか?

    Sub てすと()
        Dim tmpSH As Worksheet

        With Worksheets("原本")
            On Error Resume Next
            Set tmpSH = Worksheets(.Range("J1").Text)
            On Error GoTo 0

            If tmpSH Is Nothing Then
                .Copy Before:=Worksheets(1)
                Worksheets(1).Name = .Range("J1").Text
            Else
                MsgBox "既に「" & .Range("J1").Text & "」シートが存在します"
            End If
        End With
    End Sub

(もこな2) 2023/01/13(金) 14:14:52


初めは
ActiveSheet.Name = wsName

↑この部分で、実行時エラー1004を吐いてしまっていました。

現在は、↓下記に書き換えたところ、

Sub シートをコピーする()

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("原本")

Dim wsName As String
wsName = ws.Cells(1, 10).Value

If nameCheckFlag(wsName) = True Then

    MsgBox "同名のシートが存在するため、シートを作成できません。"

Else

Worksheets("原本").Copy Before:=Worksheets(1)

       ActiveSheet.Name = wsName

End If

End Sub

――――――――――――――――――――――
Function nameCheckFlag(wsName As String) As Boolean

        Dim ws As Worksheet
        Dim moji As Variant
        nameCheckFlag = True
        If wsName = "" Then Exit Function
        For Each moji In Array("\", "/", "?", ":", "[", "]", "*")
            If InStr(wsName, moji) > 0 Then
                Exit Function
            End If
        Next moji
        For Each ws In Worksheets
            If wsName = ws.Name Then
                Exit Function
            End If
        Next ws
        nameCheckFlag = False
    End Function

同名のシートが存在するため、シートを作成できません
と言われてしまっています。
(みこ) 2023/01/13(金) 14:21:56


もこな2さま

教示していただいた、

  Sub てすと()に書き換えたら、
うまく行きました!!!

ありがとうございます。
本当に助かりました。
(みこ) 2023/01/13(金) 14:24:19


ちょっと補足。

>シートに使えない文字も含まれていないことが前提
「シート名ですが、『R○.○』にしたいです。」とのことですが、たとえばJ1セルに実際に入っている値は日付であって、表示形式で「R5.1」のようにしている場合、Valueプロパティを使って取得し、String型の変数に入れると↓のようになります。

    Sub 実験()
        Dim MySTR As String

        With Worksheets("原本").Range("J1")
            MySTR = .Value
            Debug.Print "Valueプロパティ " & MySTR

            MySTR = .Text
            Debug.Print "Texttプロパティ " & MySTR
        End With
    End Sub

なので、提示されたコードの場合↓で「wsName」に何が格納されたのかを確認したほうが良いと思います。

 wsName = ws.Cells(1, 10).Value

(もこな2) 2023/01/13(金) 14:37:00


もこな2さま

仰る通りで、R5.1.1と入力してあるセル(A1)を、
よそのセルでは、令和5年1月カレンダー(=A1)
J1では、 R5.1(=A1)
と表示させておりました。

ので、実際は =A1が入力されていました。

大変申し訳ないことですが、String型の変数がわかりません。
すべてコピペさせていただいて実行してみたところ、
とくにエラーなどは吐きませんでした。
どのように、なにが格納されたかを確認すればよいのでしょうか…?
(みこ) 2023/01/13(金) 16:42:41


 VBエディタを開いた状態でメニューの表示-イミディエイトウィンドウとしてくれ。
 Debug.Print
 はイミディエイトウィンドウに情報を表示させる命令。

(ねむねむ) 2023/01/13(金) 17:00:10


■3
>大変申し訳ないことですが、String型の変数がわかりません。
ご自身で書いたコードをちゃんと見てみましょう。
 Dim wsName As String
               ~~↑~~
               ここに注目

■4
>どのように、なにが格納されたかを確認すればよいのでしょうか…?
まずは↓を読んで、ステップ実行で1行ずつ実行してみて、どの変数にどのタイミングで何が入っているのか、ローカルウィンドウで確認してみてはどうでしょうか。

 【ステップ実行】
https://www.239-programing.com/excel-vba/basic/basic023.html
http://plus1excel.web.fc2.com/learning/l301/t405.html

 【ブレークポイント】
https://www.239-programing.com/excel-vba/basic/basic022.html
https://www.tipsfound.com/vba/01010

 【イミディエイトウィンドウ】
https://www.239-programing.com/excel-vba/basic/basic024.html
https://excel-ubara.com/excelvba1/EXCELVBA486.html

 【ローカルウィンドウ】
https://excel-ubara.com/excelvba4/EXCEL266.html
http://excelvba.pc-users.net/fol8/8_2.html

(もこな2) 2023/01/13(金) 17:11:30


>なにが格納されたかを確認すればよいのでしょうか…?
被りましたが
F8キーを押してステップ実行しその変数にマウスを持っていくと確認できますよ。
(ななし) 2023/01/13(金) 17:17:51

補足の補足。
>仰る通りで、R5.1.1と入力してあるセル(A1)を、
>よそのセルでは、令和5年1月カレンダー(=A1)
>J1では、 R5.1(=A1)
>と表示させておりました。

↑のように仰ってますが、ちょっと勘違いされているとおもいます。
今回のポイントは「J1セルに実際に入っている【値】が何か」ということです。
A1セルを参照する【数式】が入っているならば、【値】は(参照した)A1セルの【値】が入っているということになります。

そして「R5.1.1と入力してあるセル(A1)」とのことですが、実際にA1セルにカーソルをあわせて数式バーを確認してみてください。おそらく「2023/1/1」となっていると思います。

となると、J1セルの【値】は、A1セルを参照して「2023/1/1」という【日付型データ】になっているということです。
(細かい話をするとエクセルの世界では、日付型データは【シリアル値】というもので管理されており、実際のJ1セルの値としては、「2023/1/1」のシリアル値である「44927」になっているとも言えます。)
また、「J1では、R5.1と表示させておりました」ですから、【表示形式】は「ge.m」となっているはずです。

このように【日付型データ】が入っているセルに対してValueプロパティを使うと「2023/1/1」という日付が返ってくることになります。
したがって、【日付型データ】を【表示形式】のとおり取り出したいのであれば、Textプロパティを使う必要があります。

 【参考リンク】
https://excel-ubara.com/excelvba4/EXCEL230.html
https://ameblo.jp/xx-airion-xx/entry-11851142666.html
https://vbabeginner.net/differences-between-cell-value-value2-text-formula-and-formula2/

ただ、便利なようにも思えるTextプロパティですが、セルの幅によっては「###」みたいに表示されていることがあります。
そうすると、「###」のまま取り出されることになるのでその点には注意が必要です。
また、相手が日付型であることが決まっていて、Valueプロパティで日付が取り出されることが理解できていれば↓のようなことも可能です。

    Sub 実験()
        Worksheets.Add
        Range("A1") = Date
        Range("A1").NumberFormatLocal = "ge.m"
        Columns(1).ColumnWidth = 2.5

        MsgBox Prompt:=Range("A1").Text, Title:="表示されているものをそのまま出力"
        MsgBox Prompt:=Format(Range("A1").Value, Range("A1").NumberFormatLocal), Title:="Valueプロパティで取り出してからFormat関数で加工"
    End Sub

(もこな2) 2023/01/14(土) 10:54:27


 >Dim wsName As String 
 >wsName = ws.Cells(1, 10).Value
 >ActiveSheet.Name = wsName    ←この部分で、実行時エラー1004を吐いてしまいます
 >お恥ずかしながら不勉強でうまくいきません。 
 >どなたかご教授いただけないでしょうか。

 既に指摘がありますが、この時点で
 実際にwsNameに入っている文字だか何だか知らない文字を
 アクティブシート名に変えてみるとかなぜしないのでしょうか?
 まず手動にて実際に出来るのかどうか自分で確認する事を
 優先した方がいいのでは。

 どんどんコード作成を進めるのではなく、迷ったり
 エラーが出たら、部分的に自分で試すことをする。
 自分で考えるの面倒だから、教えたもらおうとか
 手抜きで楽をしようと甘えてるからだと思います。
(無気力) 2023/01/14(土) 11:14:44

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.