• ベストアンサー

Excel2000 VBAで新規シート名を他のシート名と重ならないようにつけるには?

始めまして。早速ですが、今頭を抱え込んでいる私の悩みを聞いて下さい。 シート名を追加するプログラムで、「シートを追加」というボタンを押すと、 Inputboxを表示し、そこに任意の番号("見積書1"や"請求書1"の数字部分)を入力して、その番号をシート名として取得すると同時に、シートを追加するようにしたいのです。 その過程で、新しいシートの名前をつける際に、同じブック内に既に存在する複数 のシート名と照らし合わせて、もし、既存の番号と同じ番号をInputBoxに入れたときには、「他の番号を入力してください」と再度InputBoxを表示させたいのです。 そして、シート名がブック内に同じものがない場合にのみ、シートを追加するというものです。 VBAを使うより、手動ですれば?という考えももちろん解決方法の一つかとは思いますが、何分Excelを始めて使う年老いた父のために、少しでも簡単に操作できるようにという思いから質問させて頂いております。 どうぞよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.3

シートの番号のみを入力します。 そのために、番号を除いた部分を登録しておきます。下では wsPattName = "見積書" です。 また、番号入力すると、1→2→4と入力するかもしれません。 番号入力しないで、既存番号+1を自動で付けるのが一番『親切』? SheetNameChange2 でそれを行っています。 標準モジュールに貼り付けます。 Sub SheetNameChange()   Dim inputCheck As Boolean '入力は正しいか   Dim wsNo As Variant 'ワークシート番号   Dim ws As Worksheet 'ワークシート   Dim wsPattName As String 'ワークシートに共通な名前部分   Dim myMsg As String 'メッセージ   wsPattName = "見積書" '*** 事前に登録しておきます! ***   Const myMsg0 = "ワークシートの番号を入力して下さい": myMsg = myMsg0   Do     wsNo = InputBox(myMsg)     If wsNo = "" Then Exit Sub 'キャンセル     '重複をチェック     inputCheck = True     For Each ws In Worksheets       If ws.Name = wsPattName & wsNo Then         inputCheck = False       End If     Next     myMsg = "番号が重複しました。" & vbCrLf & myMsg0   Loop Until inputCheck = True   'シートを追加   Dim actSht As String '今アクティブなシート名   actSht = ActiveSheet.Name   Worksheets.Add.Move AFTER:=Worksheets(Worksheets.Count)   ActiveSheet.Name = wsPattName & wsNo   Worksheets(actSht).Activate End Sub '<参考> Sub SheetNameChange2()   Dim wsNo As Variant 'ワークシート番号   Dim wsNoMax As Integer '最大のワークシート番号   Dim ws As Worksheet 'ワークシート   Dim wsPattName As String 'ワークシートに共通な名前部分   wsPattName = "見積書" '*** 事前に登録しておきます! ***   For Each ws In Worksheets     If IsNumeric(Application.Substitute(ws.Name, wsPattName, "")) Then       wsNo = Val(Application.Substitute(ws.Name, wsPattName, ""))     End If     If wsNoMax < wsNo Then wsNoMax = wsNo   Next   'シートを追加   Dim actSht As String '今アクティブなシート名   actSht = ActiveSheet.Name   Worksheets.Add.Move AFTER:=Worksheets(Worksheets.Count)   ActiveSheet.Name = wsPattName & (wsNoMax + 1)   Worksheets(actSht).Activate End Sub

tonarinoshima
質問者

お礼

nishi6さん、サンプルを2通り作成下さいましてどうも有難うございます。 早速、両方のプログラムを試してみました。 nishi6さんのおっしゃるように、SheetNameChange2だと、びっくりするほど 簡単にシートを追加することができ、かつ合理的だと思いました。 また、『親切』という思いやりの気持ちまでプログラムに組み込まれているような気さえしました! 今後は、その気持ちを忘れずにプログラムを書いてみたいと思います。

その他の回答 (2)

回答No.2

初めまして。サンプルマクロを作ってみました。参考にしてみて下さい。 Sub Test() Dim myIpb As Variant Dim myWsn As Worksheet myIpb = Application.InputBox("シート名を入力して下さい。", "シート名入力") If myIpb = False Then Exit Sub If myIpb = "" Then Do myIpb = Application.InputBox("シート名を入力して下さい。", "シート名入力") If myIpb = False Then Exit Sub Loop While myIpb = "" End If For Each myWsn In Worksheets If myWsn.Name = myIpb Then myIpb = Application.InputBox("指定したシート名は、入力済みです。変更して下さい。", "シート名入力") If myIpb = False Then Exit Sub If myIpb = "" Then Do myIpb = Application.InputBox("シート名を入力して下さい。", "シート名入力") If myIpb = False Then Exit Sub Loop While myIpb = "" End If End If Next myWsn Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name = myIpb End Sub もし、操作しなかったり不都合・ご不明な点がありましたらご遠慮なくお知らせ下さい。私でよろしければ、あなた様のおやりになりたいことが実現するまでご一緒に考えていきたいと思います。

tonarinoshima
質問者

お礼

わざわざ、サンプルまで作成下り有難うございます。 プログラムというのは、同じ動作でも、いろいろな書き方ができるんですね。 私には思いもつきませんでした。VBAに対してますます興味を持ちました。 このプログラムでスマートに実現することができました。 今後はプログラムの書き方を工夫するようにしたいと思いました。

  • Te-Sho
  • ベストアンサー率52% (247/472)
回答No.1

For Eachを使ってworksheetsコレクション内をループさせることが出来ます。 その時に取得したworksheetオブジェクトのnameプロパティを参照すれば名前のチェックは出来るはずです。 たとえば Dim chk_sheet as worksheet For Each chk_sheet In worksheets If chk_sheet.name = strInputName then msgbox "同名ファイルが存在します" exit For end if Next ですね。 詳しくはhelpで"for each","worksheetsコレクション","nameプロパティ"を参照してみてください。

tonarinoshima
質問者

お礼

早速の回答下さり有難うございます。 Te-Shoさんのおっしゃるとおり、for eachでW各Worksheets名を参照させる方法で 試行錯誤していたところでした。自信がなかったので、その旨書きませんでした。 教えていただきました方法で実現することができました。

関連するQ&A

  • Excel VBA 特定の文字を含むシートを移動

    VBA初心者です。 2つのブック(ブック1、ブック2)があり、ブック2でシート名に”●●支店”という文字を含むシートをすべてブック1にコピーしたいです。 支店名はいろいろあるのでinputboxで検索したいです。 VBAを最近実践し始めたところなので、いろいろ調べたものの全く応用がききません。 どなたか教えて頂ける方、よろしくお願いいたします。

  • エクセルVBAでシート追加

    初めて質問します。 VBAで新しいシートを追加する時 同名のシート等があるとエラーになります。 追加するときシート名をチェックしたいのですが どの様にすれば良いでしょうか? また、シートは一番最後に追加したいです。 よろしくお願いします。 Sub Macro1() x = InputBox("シート名") Worksheets.Add.Name = x End Sub

  • VBA(Excel):他のブックからシートごと取込みたい

    他のブックからシートを取込む(シート名を変更して)VBAがわからないのですが、どなたか詳しい方がいましたら、ご教授下さいませ。 以下を例として、ご回答いただけると幸いです。 よろしくお願いします。 ---------------------------------- 次の3つのブックが存在するとします。 a.xls b.xls c.xls a.xlsにはシートが1つだけあり、シート名は"sheet1"です。 b.xlsにはシートが1つだけあり、シート名は"sheet1"です。 c.xlsにはシートが3つあり、シート名は"sheet1"、"sheet2"、"sheet3"です。 a.xlsにVBAマクロを作り、a.xls上で実行させて、 a.xlsの"sheet1"は残したまま、 b.xlsの"sheet1"のシート名を"sheet1-b"に変更して、 a.xlsのシートとして取込み、 同様に今度は、 a.xlsの"sheet1"、"sheet1-b"は残したまま、 c.xlsの"sheet1"のシート名を"sheet1-c"に変更し、 c.xlsの"sheet2"のシート名を"sheet2-c"に変更し、 c.xlsの"sheet3"のシート名を"sheet3-c"に変更し、 a.xlsのシートとして取込み、 最終的に、a.xlsには、 "sheet1"、"sheet1-b"、"sheet1-c"、"sheet2-c"、"sheet3-c" の、5つのシートが存在するようにしたいのです。 (各シート上のデータは、a.xlsの各シートとしてすべて移行されている) ----------------------------------

  • InputBoxに入力した言葉をシート名にしたい!

    エクセルでInputBoxに入力した言葉をシート名に反映させるVBAを教えてください。 また、入力したくない場合はESCを押すとその作業を飛ばすというものも組み込んでいただくとありがたいです。 よろしくお願いします。

  • vba ワークシートを変数を用いて開くには

    初歩的な質問ですが、 ワークシートの書式が新しくなったことで、書き換えをすることになりました。 現在のエクセルファイルから、新しいエクセルファイルへ、セルの値を参照しながら VBAにて作業をしたいのですが、 Sub changesheet() Dim iname As String Dim wbname As String iname = InputBox("ブック名を入力", "対象ブックを入力") wbname = "シート2012(" & iname & ").xls" ActiveSheet.Range("P4").Value = Workbooks(wbname).Worksheets("Sheet1").Range("P4").Value End Sub この記載で実行すると、インデックスが有効範囲にありません とエラーになってしまいます。 変数(inputbox)を用いたセルの参照はどのように記述すればよろしいでしょうか? よろしくお願いします。

  • 【エクセル】他のBookの、シート名を抽出したい

    ブックA,Bがあって、 ブックAのSheet1に「商品名、シリアル番号、商品サイズ・・・」とい ったような項目の表があります。また、Sheet1の表を基にして、数値の 違う表がSheet30まであります。 ブックBのSheet1のA列にはブックAのデータに対応するシリアル番号が ずらっと並べてあります(抜けてたり、多かったりするかもしれません)。 そこで、隣のB列に、A列に書いてあるシリアル番号をブックAから参照 (検索?)して、同じシリアル番号が入力されたセルのあるシートの、 シート名を表示したいです。おねがいします。 VLOOKUPで対応するシリアル番号のセルを探し出して、そのシートを表 示させるようなことを考えていたのだけど、参照するデータの列が左端 ではないし、検索するシートがたくさんあるし、ぜんぜんわかりませ ん。マクロを使用すれば出来るのでしょうか? エクセル2003を使用しています。 長文になってしまい、わかりにくいかと思いますが回答お願いします。

  • vba ブック間でシート名のコピーをするには

    始めまして、よろしくお願いします。 excel vba 初心者のものです。 2つのブックがあり同時に開いている状態です。1つのブックはデータがあります。 もう1つは空のブックです。 データのあるブックのシートには、 シート1のシート名は「8月1日」 シート2のシート名は「8月2日」 シート3のシート名は「8月4日」 シート4のシート名は「8月5日」 シート5のシート名は「Sheet1」 やりたいこと データ、シート名があるブックから、 空ブックのシートにシート名をコピーしてきてセルに貼り付けたいです。 シートに名前を付けてるシート数は不規則なので「Sheet1」まで来たら終了したいです。 どうぞご教授の程よろしくお願い申し上げます。

  • excel vba シートの追加

    excel vba にてシートを以下の条件で追加したいのですが、 両方を同時に行うことができません。ご教授下さい。 ・ シート名を、”新シート”にしたい。 ・ 既存シートAAA.sheetの後ろに、追加したい。 以上、宜しくお願い致します。

  • VBA Excel 特定の記号を含んだ行

    Excel VBAにて、質問します。お手数ですが宜しくお願いします。 画像の様に、E列に特定の記号"●"や"▲"含んだ行以外、抽出し 印刷のシート名に貼り付けしたいと思います。 ですが、条件がありまして、その条件とは、InputBoxを使って 抽出したい日付を入力し、入力した日付、時刻までの記号"●"や"▲"以外 を抽出できる様にしたいです。 例えば実行時の日付が8/21日ならば InputBoxに、8/28 20:00と入力したら、入力した日付、時刻までの 記号"●"や"▲"以外を抽出となります。 画像の様に、1行目の見出し名も貼り付けできる様に、VBAを使って できませんでしょうか? ※ 画像ではSheet1のみ載せましたが、 Sheet2とSheet3とSheet4とSheet5とSheet6まで似た内容のデータがあるので シート名を指定して動作できると良いです。 Array("Sheet1","Sheet2","Sheet3","Sheet4","Sheet5","Sheet6")見たいな 感じでできますでしょうか? 御面倒お掛けしますが宜しくお願いします。

  • VBA Excel 特定の記号を含む行で

    Excel VBAにて、質問します。お手数ですが宜しくお願いします。 画像の様に、E列に特定の記号"●"や"▲"含んだ行以外、抽出し 印刷のシート名に貼り付けしたいと思います。 ですが、条件がありまして、その条件とは、InputBoxを使って 抽出したい日付を入力し、入力した日付、時刻までの記号"●"や"▲"以外 を抽出できる様にしたいです。 例えば実行時の日付が8/21日ならば InputBoxに、8/28 20:00と入力したら、入力した日付、時刻までの 記号"●"や"▲"以外を抽出となります。 画像の様に、1行目の見出し名も貼り付けできる様に、VBAを使って できませんでしょうか? ※ 画像ではSheet1のみ載せましたが、 Sheet2とSheet3とSheet4とSheet5とSheet6まで似た内容のデータがあるので シート名を指定して動作できると良いです。 Array("Sheet1","Sheet2","Sheet3","Sheet4","Sheet5","Sheet6")見たいな 感じでできますでしょうか? どの様なコードを書けば良いでしょうか? 御面倒お掛けしますが宜しくお願いします。

専門家に質問してみよう