- ベストアンサー
VBAワーク シート名前を付けて作成
エクセルVBAにて 原紙とゆう名前のワークシートをコピー処理して 入力フォームにテキストボックス1と2があり コピーした原紙とゆうワークシート名から テキストボックス1と2に入力した項目が 合わさってワークシート名に変更する方法はあるのでしょうか? 例)テキストボックス1に 123 テキストボックス2に 456 コマンドボタン1をクリックすることによって ワークシート名が123456となるようにしたいのですが? 宜しくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 #2の回答者です。気に入るかどうか分かりませんが、 ひとつのアイデアなのです、単に、シート名に入れられない文字列ではじくよりも、今のコードのままで、その「/」を抜くという方法がありますね。 特に、日付という前提ではないのですが、11/09 などの日付の、「/」を取り去るシートエラーチェックはいかがでしょうか?ただし、今回は、「/(半角)」も「/(全角)」も同じに扱いますから、これらの文字がある限りは、取り去ってしまいます。 以下のコードを、そのまま置き換えてくださるか、 ByRef ShName As String の ByRef (参照渡し)を入れ、 For Each ~ Next v の間を入れ替えてくだされば可能です。 --------------------------------------------------------------- Private Function ShNameCheck(ByRef ShName As String) As Boolean 'シート名のエラーチェック Dim v As Variant Dim i As Integer Dim sh As Object If Len(ShName) > 30 Then ShNameCheck = False: Exit Function buf = ShName For Each v In Array(":", "\", "/", "?", "*", "(", ")", " ") buf = Replace(buf, v, "", , , vbTextCompare) '変更点 Next v ShName = buf For Each sh In ActiveWorkbook.Sheets If StrComp(sh.Name, ShName, vbTextCompare) = 0 Then ShNameCheck = False: Exit Function Next sh ShNameCheck = True End Function ---------------------------------------------------------------
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 エラーフリーになるように、作ってみましたが、他にも問題が出るかもしれません。 --------------------------------- UserForm1 TextBox1, TextBox2 CommandButton1 --------------------------------- 'ユーザーフォーム・モジュール Private Sub CommandButton1_Click() Dim ShName As String If TextBox1.Text <> "" Then '少なくとも片方のテキストボックスに入力 ShName = TextBox1.Text & TextBox2.Text If ShNameCheck(ShName) Then With ActiveWorkbook .Worksheets("原紙").Copy After:=.Worksheets(Worksheets.Count) ActiveSheet.Name = ShName End With Else MsgBox "その名前はふさわしくありません: " & ShName, 48 TextBox1.Text = "": TextBox2.Text = "" End If End If End Sub Private Function ShNameCheck(ShName As String) As Boolean 'シート名のエラーチェック Dim v As Variant Dim i As Integer Dim sh As Object If Len(ShName) > 30 Then ShNameCheck = False: Exit Function For Each v In Array(":", "\", "/", "?", "*", "(", ")", " ") i = InStr(1, ShName, v, vbBinaryCompare) If i > 0 Then ShNameCheck = False: Exit Function Next v For Each sh In ActiveWorkbook.Sheets If StrComp(sh.Name, ShName, vbTextCompare) = 0 Then ShNameCheck = False: Exit Function Next sh ShNameCheck = True End Function
補足
ありがとうございます。 エラーチェックまで考えていただき感謝です。 誠にすみません、もうひとつお願いがあります。 テキストボックス1に 11/09 などの日付を 入れる場合があるのですが、この場合 テキストボックス2に 1 を入れた場合 ワークシート名は 11091 にしたいのですが 出来ますでしょうか? すみません。
- marbin
- ベストアンサー率27% (636/2290)
シートをコピーし、シート名を変更する作業をマクロの自動記録 してみてください。 生成されたコードを若干改造すればお望みの形になると思います。
お礼
お手数をかけてすみません。 本当にありがとうございます。 思っていたとうりに動きます。 まだまだ、勉強不足で知らないことばかりですが 上記のわからない場所の意味を理解しておきます。