[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『シート名をコピペするマクロが作りたい』(みこ)
カレンダーを作りたいです。
作成ボタンを押すと、
原本シートがコピぺされて、
シート名が自動変更になる
ように作りたいです。
シート名ですが、
『R○.○』
にしたいです。
セルをコピペ、もしくは
原本シートの特定のセルを指定して反映
をしたいのですが…
お恥ずかしながら不勉強でうまくいきません。
どなたかご教授いただけないでしょうか。
< 使用 Excel:Excel2019、使用 OS:Windows10 >
現状でどこまでできているのですか?完成してなくてもよいので、現状のコードを示したうえで↓のように説明できませんか?
【エラーが出る場合】 ××の部分で、エラー番号〇〇、エラーメッセージ〇〇が表示されてしまいます。
【エラーは出ないが思った結果にならない場合】 ××になることを想定しているのに、〇〇となってしまう
【コンパイルエラー、構文エラー】になる場合 ××の部分がハイライトされます。
(もこな2) 2023/01/13(金) 13:13:28
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
↑この部分で、実行時エラー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
教示していただいた、
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
仰る通りで、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
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
↑のように仰ってますが、ちょっと勘違いされているとおもいます。
今回のポイントは「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.