• ベストアンサー

エクセルVBAでシート追加

Wendy02の回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんばんは。#6 のWendy02です。 >個別にチェックするのは無駄なことなのでしょうか? その必要性があるかどうかです。しょせん、エラーはエラーで、そのエラーは、ユーザー本位の問題であって、それをマクロに依存するということは、無駄が多いと思います。以下で関数を作ってみましたので、ごらんください。ユーザー側の認識度だと思うのです。 >>それに、シートを追加するというユーザーの意思決定が、Excel側が、 >>名前が通らないので、取りやめるというロジックもヘンです。 >と書かれていますが、どうしてなのでしょうか? この手のマクロというのは、必ず正しいシート名のシートを作らせるために作るのではないでしょうか? 本来のマクロの目的は、何かということですね。シート名を判断させるためのものか、それとも、シートを加えるためのものか、ということです。楽にシートを加えるために作るのではないのですか?エラーが出たら、本来は、そのままシートを加えて、手で直させるとか、その程度で良いと思います。 実務的には、あまり、複雑なことをさせても、結果がシート1枚ですから、VBAのロジックとして、もう少し単純に考えたほうが、楽だと思います。ご自身のマクロの勉強というなら、ぜひ、がんばってみるのもよいかとは思いますが、盛りだくさんに考えても、回答者にとっても、ご自身にとっても限界があると思うのです。 そう言った手前、一応、おっしゃっていることをVBAで表現してみました。たぶん、このような感じになるのではないかと私は思います。さらに、エラーレベル(ErrorLevel) を、細かく分類することも可能ですし、まだ、細かい点が抜けているかもしれません。そういう不安さが残る内容です。 '----------------------------------------------------- Sub AddSheetMacro()   Dim ShName As Variant   Dim chk As Integer   Dim msg As String   'エラーメッセージ   Const MSG1 As String = "同名シートがあります" & vbCrLf   Const MSG2 As String = "シート名がないか,半角空白か,シート名が長すぎます" & vbCrLf   Const MSG3 As String = "シートでは使っていけない文字があります" & vbCrLf & _         "( : ),(\),(/), (?),(*), ([),(])" & vbCrLf       ThisWorkbook.Activate   ShName = Application.InputBox("シート名を入れてください", Type:=2)   If ShName = "" Or VarType(ShName) = vbBoolean Then Exit Sub   chk = ShNameCheck(ShName)   If chk = 0 Then     Worksheets.Add After:=Sheets(Sheets.Count)   Else     If chk = 1 Then      msg = MSG1     ElseIf chk = 2 Then      msg = MSG2     ElseIf chk = 3 Then      msg = MSG3     Else      msg = "複合的なエラーです"     End If   End If   If Len(msg) > 0 Then     MsgBox msg, vbInformation   End If End Sub '標準モジュールに必ず置いてください Function ShNameCheck(ShName As Variant, Optional wb As Workbook) As Integer   Dim flg As Boolean   Dim ErrorLvl As Integer   Dim dummy As Variant   If wb Is Nothing Then Set wb = ActiveWorkbook   On Error Resume Next   dummy = wb.Worksheets(ShName).Range("A1").Value   If Err.Number = 0 Then     ErrorLvl = 1   End If   On Error GoTo 0   If Len(ShName) < 1 Or Len(ShName) > 31 Or StrComp(ShName, " ", 0) = 0 Then ErrorLvl = 2   If ShName Like "*[:\?*/]*" Then ErrorLvl = 3   If (InStr(ShName, "[") Or InStr(ShName, "]")) > 0 Then ErrorLvl = 3   ShNameCheck = ErrorLvl End Function

noname#31512
質問者

お礼

Wendy02さん たびたびありがとうございます。 勉強になりました。 エラーについての認識を考えてみます。 これに懲りず機会があればアドバイスよろしくお願いします。

関連するQ&A

  • シート番号追加VBA

    watabe007さま 大変お世話になりました 前にシートのセルにページ番号を追加するVBAをこちらで教えて頂きまして、本当に有難うございます 前回に下記の内容を教えて頂き、大変有難く使わせていただいております Sub pageA()   Dim i As Long   For i = 1 To Worksheets.Count      If Worksheets(i).Name = "Sheet3" Then       Worksheets(i).Range("G2") = "'" & i & "/" & Worksheets.Count     ElseIf Worksheets(i).Name = "Sheet4" Then       Worksheets(i).Range("G3") = "'" & i & "/" & Worksheets.Count     Else       Worksheets(i).Range("G1") = "'" & i & "/" & Worksheets.Count     End If   Next End Sub それで、今回はどのシート名にも属さないシートはページカウントとしてカウントしない、という方法がありましたらお教え頂きたいのですが、方法はありますでしょうか? お忙しいかと思いますが、アドバイス頂けますますと嬉しいです

  • エクセルVBAでSheet1.ActivateとSheet(n).Activate

    エクセル2000です。 VBAでの疑問点を教えてください。 Sub test1() Sheet1.Activate MsgBox ActiveSheet.Name End Sub これは問題なく作動します。 Sub test2() x = ThisWorkbook.Worksheets.Count For n = 1 To x Sheet(n).Activate MsgBox ActiveSheet.Name Next End Sub これは「SubまたはFunctionがていぎされていません」というエラーになります。 もちろん、 Sub test3() x = ThisWorkbook.Worksheets.Count For n = 1 To x Sheets(n).Activate MsgBox ActiveSheet.Name Next End Sub のように書けばOKなのは存じておりますが、これではSheet名に係らず、左から順番となってしまいます。 Sub test4() x = ThisWorkbook.Worksheets.Count For n = 1 To x Sheets("Sheet" & n).Activate MsgBox ActiveSheet.Name Next End Sub のように明確にシート名として記述すればOKなのですが、それでは、Test1のSheet1.Activate が通って、Sheet(n).Activate が通らないのはなぜでしょう? しょうもない質問でごめんさない。

  • Excel VBAである特定文字列を含むシート名例えば「りんご(1)」

    Excel VBAである特定文字列を含むシート名例えば「りんご(1)」「みかん(1)」「みかん(2)」「いちご(1)」のシート名があるファイルに対して「みかん*」で検索を行い、一致したシート(複数Sheet)=「みかん(1)」「みかん(2)」に対して処理を行う方法はありますでしょうか。 宜しくお願いいたします。 完全一致するファイルは下記のようなのですが、Scheck = 0の部分が理解でいません。 型は何にすればよいのでしょうか。 Sub Sheet_Add5() Scheck = 0 For Each sheet_name In Worksheets If sheet_name.Name = ("検索シート名") Then Scheck = 1 Exit For End If Next If Scheck = 0 Then Sheets.Add.Name = "検索シート名" End If End Sub

  • VBAで初歩的な質問ですシートのコピーについて

    Sub SheetCopy() For i=1 to 31 WorkSheets.Add.Move after:=WorkSheets(workSheets.Count) シート名=i ActiveSheet.Name=シート名 Next End Sub と、シートをコピーするプロシージャを作りました。本当は、シート名を7月1日から、7月31日の31枚を作りたいのですが、どのように書けばよいのでしょうか? よろしくお願いします。

  • excel  vba  シートの取り扱い

    Sub   aaa() Worksheets.Add ActiveSheet.Name = "Namefile" ((質問)ここへ適当なコードを追加することによって 以下のThisWorkbook.Sheets(1)というのを、上で追加した Namefileシートを処理することとしたい。 つまり  Namefileシート=ThisWorkbook.Sheets(1) どうすればいいか。よろしくお願いします。) ThisWorkbook.Sheets(1).UsedRange ThisWorkbook.Sheets(1).UsedRange.Delete ThisWorkbook.Sheets(1).Range("B2") = "ファイル名" ThisWorkbook.Sheets(1).Range("C2") = "最終更新日" End Sub

  • vba エクセルシートの追加、名前の変更について

    エクセルvbaについて教えてください 新しいシートを一番右に作成し、その新規作成したシートの名前を変えたいです Sub Sample() Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name = "結果1" End Sub と作成しました マクロを実行したら、「結果1」という名のシートが一番右に作成されます その後、実行をしたら「結果2」、さらに実行したら「結果3」といった感じにどんどん「結果+数字」のシートを作成したのですが、今のままでは「結果1」というシートしか作成されません 「結果2」、「結果3」、・・・・エンドレスに作成するようにするにはどうしたらよいのでしょうか ―――――――――――――――――――――――――――――――――――― なぜこのようなことをしているかといいますと、AdvancedFilterでxlFilterCopyを利用し、抽出した結果を新しいシートに作成するようにするのが最終目標です それで、まずAdvancedFilterでデータを反映させる新しいシートを作成することに取り組んでいるところです もし分かる方がいましたら、AdvancedFilterでxlFilterCopyする際、上で説明しました新しいシートが作成できた場合、CopyToRangeをどのように記載すればいいのか分かればそれも教えていただけると助かります よろしくお願いします

  • VBA シート名重複した場合削除する

    教えてください。 VBAに関しての質問です。 全くの知識がないので教えていただきたいです。 エクセルワークシートに以下の機能を追加している状態です。 For Each ws In Worksheets If ws.Name = "データ" Then wsChkflg = True End If Next If wsChkflg = True Then ThisWorkbook.Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "データ" Else ThisWorkbook.Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "データ" End If Set wsNew = ThisWorkbook.Worksheets("データ") 「データ」というシートが作成、追加されるのですが、同じシート名で新規作成した時に エラーが出てしまいます。そのエラーを出さないようにすため、ダイアログ等も出さずに既存のシートを強制的に削除する機能を追加したいのです。 VBAの知識がなくて困っています。 何か良い方法がわかる方いらっしゃいましたらお力を貸してください。 よろしくお願いいたします。

  • エクセルVBA シート名の部分一致検索について エクセル2007

    VBAでエクセルの全シート名を部分一致で検索したいと考えています。 そこで以下のコードを書いたのですが、 インプットボックスにどんな文字列を入力しても全てのシート名を 取得してしまって途方にくれています。 どなたかお助けください。 Sub test01() Dim name As String Dim ws As Worksheet shn = InputBox("検索文字列を入力") For Each ws In ThisWorkbook.Worksheets If ws.Name Like " * " & name & " * " Then ws.Activate MsgBox ws.Name End If Next ws End Sub

  • Excel VBAシートの同一番地のセルのリスト化

    別々のシートの同一番地のセルの値をリスト化するのにこのようなVBAを見つけました。 シートは追加せず、既存のシートを指定したくて、色々と書き換えをチャレンジしましたがうまくいきません。 既存のシートを指定し、この作業を行うにはどうしたらよいのでしょうか? ご教示いただけますと幸甚です。 Sub Test1() Dim TmpSheet As Worksheet, i As Integer i = Worksheets.Count Set TmpSheet = Worksheets.Add(After:=Sheets(Sheets.Count)) With TmpSheet For i = 1 To i .Cells(i, 1).Value = Worksheets(i).Name .Cells(i, 2).Value = Worksheets(i).Range("E5").Value Next End With End Sub

  • EXCEL VBAにてのワークシート作成

    エクセルのVBAにてワークシートを作成することで困っています。 自分で書き込んだのは Private Sub CommandButton1_Click() Worksheets("原紙").Copy ActiveSheet.Name = TextBox1 Worksheets.Add After:=Worksheets(2) End Sub Private Sub UserForm_Initialize() TextBox1 = Format(Date, "yy.mm.dd") End Sub 実行したいことはCommandButton1クリック時に 左から2番目にあるワークシート 原紙を テキストボックス1に入力されている(日付) 名前を付けて左から3番目に新規で作成したいのですが 思うように動かずエラーが出てしまいます。 どの様に修正すれば宜しいでしょうか? またクリック時にすでにテキストボックス1と同じ 名前のワークシートが存在した場合はそのワークシートを Activeにしたいのですがどの様に書き込めば宜しいでしょうか? 重ね重ねですが宜しくお願いいたします。