VBAで大量のシートを追加する方法とセルからの名前変更について

このQ&Aのポイント
  • ExcelのVBAを使用して大量のシートを追加し、セルからの名前変更を行う方法について解説します。
  • VBAを使うことで、Excelで手動で一つずつシートを追加する手間を省くことができます。
  • また、セルに入力された名前を元にシートの名前を一括変更する方法もご紹介します。
回答を見る
  • ベストアンサー

VBA:シートの追加とセルからの名前変更

いつもお世話になっています。 ExcelのVBAで実装可能かと思うのですが、ご教授願いたく思います。 今回、大量のシートの追加(最後尾)とその追加したシートの名前を 変更するVBAを制作したいと思ったのですが シートの追加とシートの名前変更(ソースの直接記入)までは、 なんとか出来ましたが 名前を、とある範囲のセルにある文字列に変更するという事がしたいです。 例えばE1:E5までの範囲にある文字列 「あ」 「い」 「う」 「う」 「う」 とあったら、かぶっているものは除き、「あ」「い」「う」という名前のシートを3つ追加したいという事です。 上記、もし実装可能であればご教授お願いします。 また、可能だけどokwaveの入力欄では面倒だし説明しづらい、という回答でもokです。 その場合、参考サイトなど教えて頂けると幸いです。 何卒よろしくお願いいたします。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.4

>にすればいいのですよね…? えぇ,それでいいですよ。 と,正解だよと教えて貰ってからでないと,ご自分で試してみることもできないのですか? それとも実際に「ジツは『これこれ』のマクロでやってみたらこういう具合に上手く行かなかったので教えて欲しかった」んでしたら,そういう具体的な状況をキチンと添えて新しいご相談として投稿し直してください。 >不可視のセル ついでに聞いちゃえで付き合わされるほうがイイ迷惑ですので,一つのご相談が解決したら新しい質問は次のご相談で投稿し直してください。こういうのは,こちらのような質問相談掲示板ではごくアタリマエのマナーですので,憶えておいてください。 sub macro2() dim target as range dim h as range '見えてるセルを取得する。「全部隠れていた」場合も考える。 on error resume next set target = worksheets("リストのシート").range("E2:E5").specialcells(xlcelltypevisible) if target is nothing then exit sub ’以下同じ for each h in target on error goto errhandle worksheets(h.value).select on error goto 0 next exit sub errhandle: ’少し検査を厳しくしてみた例 if h <> "" then worksheets("ひながたシート").copy after:=worksheets(worksheets.count) activesheet.name = h.value end if resume end sub

kayomana
質問者

お礼

ご回答ありがとうございます。 そして、お手数、ご迷惑をおかけしまして申し訳ありませんでした。 以後、気を付けたいと思います。 そして、ご回答大変参考になりました! ありがとうございました!

その他の回答 (4)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

No.2です。 別質問で >E1~E3000などの広範囲のセル範囲の場合も >可能でしょうか・・・? に関しては、前回のコード内の >For i = 1 To 5 の行を変更すれば可能です。 例えば >For i = 1 To 3000 または >For i = 1 To ws.Cells(Rows.Count,5).End(xlUp).Row といった感じで! ※ ただし、上限Sheet数はメモリーに依存するみたいなので、あまりにSheet数が多すぎるとエラーになったり、PCが固まったりすると思います。 次に >もし、追加ではなく、あるシートをコピーして追加の場合・・・ に関しては Sub test2() Worksheets("Sheet名").Cells.Copy Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Paste End Sub とした方が良いと思います。 最後に >用意されたデータ範囲が非表示になってた場合 とは最初のE1以降のセルが非表示になっていた場合、非表示セルは含まない!と解釈すれば良いのですかね? もしそうであれば前回のコード内の > If WorksheetFunction.CountIf(Range(ws.Cells(1, 5), ws.Cells(i, 5)), ws.Cells(i, 5)) = 1 Then 部分を >If WorksheetFunction.CountIf(Range(ws.Cells(1, 5), ws.Cells(i, 5)), ws.Cells(i, 5)) = 1 _ And ws.Rows(i).Hidden = False Then のように変更してみてください。 この程度でよろしいでしょうか?m(_ _)m

kayomana
質問者

お礼

回答へのお礼にも関わらず、質問し それに対して、お答えくださって、本当にありがとうございます。 また、こちらの回答も大変参考になりました! 今後の糧とさせていただきます。 ありがとうございました!

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

繰り返しを「あいううう」の列のセルを主体に考えれば仕舞いで、質問になるのはなぜ。 この列をソートしておいて、上から順次見ていって、直前上行と同じ値なら、処理せず次の行に行く。 違う場合はそのセルの値でシートを追加 ーー Sheet1のA列(シート名群)でソート済みとする。 Sub test01() Dim sh1 Set sh1 = Worksheets("Sheet1") d = sh1.Range("A65536").End(xlUp).Row m = "" For i = 2 To d If sh1.Cells(i, "A") = m Then '上と同じ文字列なら Else Worksheets.Add(After:=Worksheets(Sheets.Count)).Name = sh1.Cells(i, "A") 'こういう書き方が出来た m = sh1.Cells(i, "A") End If Next i End Sub ーー A2:A6 aa bb cc cc dd で、aa、bb、cc、ddのシートが加わった。 ーー シート名をソートすることがダメな場合は、現在行までの行で、同じ文字列のカウントをして2以上ならダブリとして 処理を飛ばすロジックにするとか。

kayomana
質問者

お礼

ご回答ありがとうございます。 参考にさせて頂きました!! 今後ともよろしくお願いいたします。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! 当然のことながら同じBook内に同名のSheetは追加できませんので、E1~E5セルには現在あるSheet名以外の文字列だとします。 ↓のコードを標準モジュールにコピー&ペーストしてマクロを実行してみてください。 尚、Sheet1のE1~E5セルに入っているとしての一例です。 Sub test() Dim i As Long Dim ws As Worksheet Set ws = Worksheets("sheet1") For i = 1 To 5 If WorksheetFunction.CountIf(Range(ws.Cells(1, 5), ws.Cells(i, 5)), ws.Cells(i, 5)) = 1 Then Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name = ws.Cells(i, 5) End If Next i End Sub こんな感じではどうでしょうか?m(_ _)m

kayomana
質問者

お礼

ありがとうございます。 E1~E3000などの広範囲のセル範囲の場合も 可能でしょうか・・・? また、 もし、追加ではなく、あるシートをコピーして追加の場合 と、用意されたデータ範囲が非表示になってた場合 例えばフィルタなので隠れてたり、する場合は 含まないというやり方は、どうすればよいのでしょうか?

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

ふつーに「やるべきこと」を考えてみると 0.用意されたデータ範囲(「あいうううう」どこからどこまで何がある)の確認 1.かぶってない「あ」「い」「う」のリストを準備 2.準備したリストに従いシートの追加と名前の変更 という段取りで,淡々とマクロを書けばよいだけのお話です。 とってもムズカシそうないかにもマクロマクロしたマクロも書けますし,ごく簡単でシンプルな方法も,アイデア次第でいくらでもあります。 でもまぁ,ゴタクはいらないでしょうから作成例: sub macro1()  dim h as range  for each h in worksheets("元のリストのシート名").range("E1:E" & worksheets("元のリストのシート名").range("E65536").end(xlup).row)  on error goto errhandle  worksheets(h.value).select  on error goto 0  next exit sub errhandle:  worksheets.add after:=worksheets(worksheets.count)  activesheet.name = h.value  resume end sub

kayomana
質問者

お礼

ありがとうございます。 もし、追加ではなく、あるシートをコピーして追加の場合 worksheets.add after:=worksheets(worksheets.count) の部分を Worksheets("コピーしたいシート名").Copy after:=Worksheets(Worksheets.Count) にすればいいのですよね…? それと、用意されたデータ範囲が非表示になってた場合 例えばフィルタなので隠れてたり、する場合は 含まないというやり方は、どうすればよいのでしょうか?

関連するQ&A

  • 【Excel_VBA】セルに連動したシート削除

    ExcelのVBAで実装可能かと思うのですが、ご教授願いたく思います。 シートがかなりたくさんあるエクセルブックがあります。 各シートの指定のセルに文字列の有無を判断し 文字列が無い場合、そのシートを消す この作業を連続して多数の該当シートを一気に削除したいVBAは どのように記述すればよいでしょうか? また、4シートほど、表紙やリストなど上記、文字列の有無を判断せず そのまま残したいシートもあります。(このシート群は固定で増える事はありません) 上記、もし実装可能であればご教授お願いします。 また、可能だけどokwaveの入力欄では面倒だし説明しづらい、という回答でもokです。 その場合、参考サイトなど教えて頂けると幸いです。 (当方VBAには精通しておりませんが) 何卒よろしくお願いいたします。

  • シートの名前の変更について(VBA)

    いつもお世話になっております。 VBAでシートの名前の変更を行おうと考えています。エクセルのシートで手動でシートの名前変更を入力すると使用できない文字は、入力が出来ないようになっています。VBAでテキストボックスへの入力を同じように規制する場合、Change()を使って1文字づつチェックするルーチェンを組むしかないのでしょうか? 取って置きの手法がありそうな気がしますが、思いつきません。どなたか?助けて頂けないでしょうか?よろしくお願いいたします。

  • エクセルVBA シートの追加と名前の変更

    エクセルに「原本」シートがあり、マクロを実行すると原本シートを5シート(5日分)追加し、 (1)一つ目に追加したシートのB2のセルに「追加する日の日付け」を入力し、 シート名にその日付をyymmdd形式で名前を付け、 (2)二つ目に追加したシートのB2のセルに「追加する日の次の日の日付け」を入力し、 ・・・同様の処理・・・ (6)一つ目の追加したシートをアクティブシートにする。 というように、連続した5日分のシートを追加したいと考えています。 VBAの全くの初心者ですので教えていただけると大変助かります。 そんな素晴らしいことが短時間で教えていただけるものなのでしょうか。

  • 【VBA】シートをコピー→任意セル値をシート名に

    大変お世話になります。 【Excel VBA】は全くの初心者です。 付け焼刃な質問がよろしくないことは重々承知しております。 が、どうしても『今』必要なため、皆さまのお知恵をお借りしたく 質問させていただきます。 このような動作をさせたい場合の、具体的なコードをご教示いただけませんでしょうか。 ------------------------------  組みたいマクロ ------------------------------ (1)数式が入った【原紙】Sheetの[B2~AA40]を、    同一ブック内の新規Sheetへ形式ごとコピー。 (2)(1)の新規Sheetの名前を、同シート内[B5]の入力値に変更。  < 補 足 >  ◎(1)で新規Sheetへコピーする際、数式は不要です。  ◎(1)でコピーする新規Sheetは任意の複数枚で、   名前となる[B5]値は重複しない予定です。  ◎(1)でコピーされる位置は、【原紙】Sheetの前を想定していますが、   最後尾への追加に変更になった場合は、どこを変更したらよいかも   併せてご教示いただけますと大変ありがたいです。 質問の仕方も、このような感じで伝わるのか不安なまま記載しています。 情報として不足がありましたら、そちらもご教示いただけますと有難いです。 よろしくお願いいたします。

  • excel vba シートの追加

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

  • INDIRECTと名前の定義セル参照拡張範囲

    只今エクセル勉強中です。よろしくお願いします。 画像の貼り付けがよくわからなかったので シート画面のコピーを添付データにしています。 A列に分類(データA4:A5) B・C列に商品というデータがあるとします。 名前の定義 範囲から作成でA3:C5を上端行基準で 分類・パソコン・プリンタと名前をつけます。 E2セルにデータの入力規制で =分類 とします。 E2の入力値に対してF2の入力範囲を切替えたいと思います。 そこでF2の入力規則で =INDIRECT(E2) とします。 ここまではOKなのですが、分類・パソコン・プリンタの種類が増える事を 想定し名前範囲を拡張したいと思います。 そこで名前の定義で 分類の範囲を =OFFSET(Sheet1!$A$4,0,0,COUNTA(Sheet1!$A:$A)-1,1) に変更 パソコンの範囲を =OFFSET(Sheet1!$B$4,0,0,COUNTA(Sheet1!$B:$B)-1,1) プリンタ範囲も同様に変更しました。 そして6行目以降に項目を追加すると E2セルではプルダウンに追加したものが反映されます。 しかしF2ではプルダウン項目がなくなりました。 何が間違っているのでしょうか? Excel2007使用です。 よろしくお願いします。

  • エクセルVBAでセルの値を名前定義連続

    いつもお世話になってます。 エクセルVBA2013で質問です。 データ シートのC3から順次行方向にD3,E3と名前が入っています。 行方向に入る数は、下記のコードで取得できる数が上限になります。 i = Range("B4:B" & Cells(Rows.Count, "B").End(xlUp).Row).Count + 2 そのC3から順次行方向のセルの値を名VBAで名前を定義したいと思っています。 参照範囲は、C3ならC列全体、D3ならD列全体・・・としていきたいです。 各セルに入る値は変化することがあります。C3に「あいう」と入力したり「AAA」と入力したりと変化します。その度に名前の定義を変更したいです。(イベントでなく普通にボタンを押して変更する) 名前が変わるので、同じ範囲で名前が違うものがいくつもできないようにしたいです。 すいません、色々条件ありますがどうぞよろしくお願いいたします。

  • エクセルで検索・表示の方法を教えてください。追加

    追加の質問で恐縮ですが、教えてください。 VBAの記述が解らずお手数を掛けします。 Sheet2のD、E…と項目を増やしていく時 Sheet1のD列に項目を入れて増やしE列に表示させるには VBA記述のどこをどう書き換えて又は、書きましていけばよろしいのでしょうか 再度ご教授ください。

  • 名前付きセルの利用方法 Excel2013 VBA

    ExcelでVBAで設定値を書いたシートを参照する際に、 Shell Worksheets("設定").Range("B1") と、書くのが見にくいので、名前付き参照で見やすくできないかと試してみたのですが うまくいきません。 ※名前付きセル範囲は手動で作って、"ブック"という範囲扱いになっているようです。 標準モジュールのテスト関数で Public Sub test() MsgBox Range("起動Path").Value End Sub とすると正しく文字列が表示できるのですが、 同じ事をSheet1モジュールのダブルクリックイベントに入れたらエラーとなります。 ※上記のMsgBox文をイベントの途中にコピペしてみました。 ちょっと理由がよくわからないので、どなたかお助けくださいませんでしょうか…

  • セルの項目をシート名にしたい

    はじめまして、vba初心者の者です。 セルB3から始まるB列にある、 項目を各シートの名前にしたいです。 セルB列のセルの中身がnullになれば終了という動作。 例えば。 セルB3に「山田」という文字列があれば、Sheet1は山田にする。 セルB4に「佐藤」という文字列があれば、Sheet2は佐藤にする。 よろしくお願い申し上げます。

専門家に質問してみよう