• 締切済み

EXCEL:セルに表示されているテキストをシート名にしたい

仕事で請求書関係のEXCELを作っています。 会社情報というシートの会社名(A3セルからA16セルまで)が変更されると、 会社別にある請求書など(各社3シートあります)の会社名が変わるようにしてあります。 下記のコードを使って、各シートの会社名が変わるとシート名も変わるというようにしようと思いましたが、 表面上はテキストでも関数セルのため、セルに直接入力をすれば変わりますが、このままではシート名が自動で変わらないですよね。 ちなみに変更したいシート名は、 シート名        内容 ○○会社       ⇒日報データ ○○会社請求     ⇒請求書 ○○会社請求(鏡)  ⇒請求合計 となり、これが各社分(現在は20社分)あります。 毎月5社ぐらい会社名が変動しますが、 データを入力する事務員さんはEXCEL初心者なので、 毎回シート名を変更することが難しく、作業を自動で行いたいのです。 私自身も、現在VBAを勉強中のため自分の能力ではこれが精一杯で、 困ってしまいました。 どのようなコードを追加したらいいのか、どなたか教えていただけませんでしょうか? どうかよろしくお願いします! Private Sub Worksheet_Change(ByVal Target As Range) With Target If .Count > 1 Then Exit Sub If .Value = "" Then Exit Sub If .Address(0, 0) = "A1" Then On Error GoTo ELine ActiveSheet.Name = .Value On Error GoTo 0 End If End With Exit Sub ELine: MsgBox "その名称はシート名になりません", 16 End Sub

みんなの回答

  • pc_knight
  • ベストアンサー率66% (52/78)
回答No.3

会社情報シートのA3~A16セルに登録の会社名の順番どおりにその会社の「○会社、○会社請求、○会社請求(鏡))」という3シートを順次14(社)分=42シート分命名するのであれば、次のコードでいかがでしょう。 但し会社情報シートは一番左のシートとします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim syamei As Variant '必要シート数を追加 If Worksheets.Count < 43 Then ActiveWorkbook.Sheets.Add after:=Worksheets(Worksheets.Count), Count:=43 - Worksheets.Count End If 'シート名仮設定 For s = 2 To 43 Worksheets(s).Name = s Next s For r = 3 To 16 'シート名変更 Worksheets(r * 3 - 7).Name = Worksheets("会社情報").Cells(r, 1) Worksheets(r * 3 - 6).Name = Worksheets("会社情報").Cells(r, 1) & "請求" Worksheets(r * 3 - 5).Name = Worksheets("会社情報").Cells(r, 1) & "請求(鏡)" Next r End Sub (注)各シートのセルA1にシート名を表示させるにはWorksheets(r * 3 - 7).Range(“A1”).value = Worksheets(r * 3 - 7).NameなどがNext rの前に必要です。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

>各シートのA1セルで、○○会社、○○会社請求、○○会社請求(鏡)と、表示されるようにしてあります の意味が「会社情報シート」のA3セルにある「○○会社」を「○×会社」に変更したら、関数やセル参照によって自動的にシートのA1セルの値も「○×会社」に変わるというなら会社IDは不要です。 以下のマクロは「会社情報シート」のA3:A16の値が変化したら、各シートのA1に変化後の値(文字列)を含んでいるシートを探して、シート名をA1の値に置き換えるマクロです Private Sub Worksheet_Change(ByVal Target As Range) Dim ws As Worksheet  If Not Application.Intersect(Target, Range("A3:A16")) Is Nothing Then   For Each ws In Worksheets    If InStr(ws.Range("A1").Value, Target.Value) > 0 Then     ws.Name = ws.Range("A1").Value    End If   Next ws  End If End Sub 冒頭の意味が「自動的に変わるのではなく、前の会社名を入力してある」という意味なら、やはり会社IDのような一意にシートを識別できるものが必要になります

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

こういうことでしょうか。 1)「会社情報シート」の(例えば)A3セルにある「○○会社」を「○×会社」に変更したら、 2)同じブック内にある「○○会社」「○○会社請求」「○○会社請求(鏡)」という3枚のシートの名称を 3)「○×会社」「○×会社請求」「○×会社請求(鏡)」に変更する 単純にはできませんよ。それはWorksheet_Changeイベントでは変更後のTergetの値しか取得できないからです。そのため「どのシートの名前を変更するのか」が分からないのです でもシートを工夫すればできないことはありません。例えば 「会社情報シート」に「会社ID」を設けて、この会社IDは社名を変更しても変えないようにする。そして各社のシートのどこかのセルに、この「会社ID」を入力しておく。 のような方法が考えられます。こうすればどの会社名のシートを変更すれば良いか分かります。 また別の方法として、会社名が変更されたら「新しく3枚のシートを作成する」方法も考えられますね。いずれにせよ、方法を考え直して再度質問されたらいかがでしょうか

mmmamam
質問者

補足

早速ありがとうございます! 説明が下手ですみません。ちょっと補足を追加させて頂きますね。 会社情報シートの会社名は、○○会社、○○会社請求、○○会社請求(鏡) の各シートのA1セルで、○○会社、○○会社請求、○○会社請求(鏡)と、 表示されるようにしてあります。 再度教えていただきたいのですが、 この場合も会社IDを設定したほうがいいのでしょうか? もう一つの方法「会社名が変更されたら新しく3枚のシートを作成する」ですが、 テンプレート的なものを用意して、その書式と同じフォーマットのシートの作成はできるのでしょうか? お時間があるときでかまいませんので、良ければまた教えていただけませんでしょうか? よろしくお願いします。

関連するQ&A

  • セルの値をワークシート名にする(エクセル2013)

    インストラクターのネタ帳さんより http://www.relief.jp/itnote/archives/003382.php 下記「セルの値をワークシート名にする?Worksheet_Change」 を拝借し利用させていただこうと思いましたが ---------------------- Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ERR_HANDLER If Target.Address(False, False) = "H1" Then ActiveSheet.Name = Range("H1").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のH1セルの値はシート名にできません。" End Sub ---------------------- はそのまま出来るのですが、 H1セルにデータの入力規則:リストを指定しますと エラーとなりシート名が変わりません sheet1のリストA1:A50をsheet2のH1セルにリスト表示させ その表示名をそのままシート名に出来ませんでしょうか? ---------------------- Sub copy Range("H1").Copy Range("P1") End Sub ---------------------- Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ERR_HANDLER If Target.Address(False, False) = "P1" Then ActiveSheet.Name = Range("P1").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のP41セルの値はシート名にできません。" End Sub ---------------------- としてH1のセルをP1にコピーしたものを指定して試しましたがやはりエラーとなり うまくいきませんでした。 全くの素人で恐縮ですがよろしくお願いいたします

  • Excel2010 イベントプロシージャが動かない

    VBAはほとんどいじったことのない初心者です。 イベントプロシージャをインターネットから探してきて、コピペして使おうとしてます。 Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ERR_HANDLER If Target.Address(False, False) = "E2" Then ActiveSheet.Name = Range("E2").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のE2セルの値はシート名にできません。" End Sub やりたいのは、セルE2の値に変更があったら、そのセルの値をシート名にしたいということです。 初心者には難しいでしょうか? ご教示いただけると幸いです。 よろしくお願いします。

  • 自動で複数セルの内容をシート名にする

    今エクセル2013で、B5セルに「8」を入力して、C5セルには「月実績」と入力してあります。 B5セルはシートをコピーして月ごとに変更していきます。C5セルのほうも例えば「月生産数」等に変更して使用します。(つまり、B5もC5も両方内容を変更していきます。) このB5とC5のセルの内容をシート名に自動で変更したいのですが、どうすればよいでしょうか? たとえば上記の例だと、シート名が「8月生産数」になってくれればよい。 今とりあえずWorksheetに下記コードを記述していますが、これだとシート名が「8$C$5」となってしまい、C5を文字で認識してしまい、セルの内容がシート名になりませんでした。 どうすればよいでしょうか? また、記述場所は使っているシートのWorksheetにかきこめばよいでしょうか?(シート名を右クリックしてコードの表示ででてくる所に記述しています) VBAの事、あまり分からないままやっていますが、お願いいたします。 Private Sub Worksheet_Change(ByVal Target As Excel.Range) On Error GoTo ERR: If Target.Cells(1, 1).Address = "$B$5" Then Me.Name = Target.Cells(1, 1) & "$C$5" End If Target.Cells(1, 1).Select Exit Sub ERR: MsgBox "その名前には変更出来ません。", vbCritical + vbOKOnly, "ERROR" Resume Next End Sub

  • セルの値をシート名にするエクセルVBA

    件名のVBAを以下のように書きました B列の4からずっと下までのセルの値を次々とシート「ひな型」をコピーし増やしていくものです。 Sub テスト() ' ' Macro ' ' Dim target As Range Dim h As Range '見えてるセルを取得する。「全部隠れていた」場合も考える。 On Error Resume Next Set target = Worksheets("Sheet1").Range("B4:B" & Worksheets("Sheet1").Range("B65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible) If target Is Nothing Then Exit Sub 'シートを増やしていく For Each h In target On Error GoTo errhandle Worksheets(CStr(h.Value)).Select On Error GoTo 0 Next Sheets("Sheet1").Select Exit Sub errhandle: Worksheets("ひな型").Copy after:=Worksheets(Worksheets.Count) ActiveSheet.Name = h.Value Resume End Sub これだと、一応思った通りにはなるのですが B列のセルに複数同じ名前があった時に、既に作ったシートの名前がある場合 それは無視するという風に実行したいです お知恵をお貸しくださいませ

  • セルの値をファイル名にするには

    現在下記のマクロを入力しています。 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$C$10" Then Target.Offset(-6, 2).Value = Date End If End Sub この時 ファイル名を SHEET1のA1 セルの値を利用してファイル名にするために下記の内容を入れてブックを保存したいと考えています。 上記のマクロが入っていないときは上手く行くのですが下記を追加するにはどうすればいいかご指導いただけませんでしょうか。 宜しく御願いします。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = 1 And Target.Column = 1 Then ActiveSheet.Name = Target.Value ThisWorkbook.SaveAs ThisWorkbook.Path & "\" & Target.Value End If End Sub

  • VBA シート名とファイル名とフォルダ名を一度に変更したい

    こんばんは。 現在のアクティブセルに入力された文字列「(例)0001」を入力するとシート名、ファイル名、フォルダ名が変更するVBAを作成しています。 シート名の変更は出来たのですが、ファイル名とフォルダ名の変更が上手くいきません。 大変恐れ入りますが、伝授いただけないでしょうか。 よろしくお願い致します。 Sub シート名変更() Dim シート名 As String シート名 = ActiveCell.Value If シート名 = "" Then MsgBox "文字列を含むセルを選択してください。" Exit Sub End If ActiveSheet.Name = シート名 End Sub

  • セルの内容をテキストボックスに表示する

    こんにちは。今月からVBAを少しずつ勉強し始めている初心者です。 VBAでA列のセルをダブルクリックすると、そのセルにチェックが入り、 ユーザーフォームを起動させる。といったコードを記述しました。 チェックが入る→フォームが起動までは良いのですが、入力済みのセルをWクリックした時にフォームのテキストボックスににセルの内容を表示させようとしているのですがうまくいきません。不具合の内容は、フォームに表示されるデータが、前回Wクリックした行のデータが表示されます。例えば、 1回目 ID50を選択→表示されない。 2回目 ID70を選択→ID50が表示される。 3回目 ID90を選択→ID70が表示される。といった具合です。 コードは下記です。Targetが前回を参照しているのだと思って調べてみたのですがよく分かりません。すみませんがご教示お願いします。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim lngTop As Long, lngLeft As Long, strTitle As String Const RangeName As String = "領収書" If Not Intersect(Range(RangeName), Target) Is Nothing Then Cancel = True If Target = "レ" Then Target = "" Target.Offset(0, 9).ClearContents Else Target = "レ" End If End If If Target.Count <> 1 Then Exit Sub  If Target.Column <> 1 Then Exit Sub   If Target <> "レ" Then Exit Sub 入力F.Show With Worksheets("送付名簿") 入力F.TextBox1.Value = Target.Offset(0, 1).Value 入力F.TextBox3.Value = Target.Offset(0, 2).Value 入力F.TextBox4.Value = Target.Offset(0, 3).Value 入力F.TextBox5.Value = Target.Offset(0, 5).Value 入力F.TextBox6.Value = Target.Offset(0, 4).Value 入力F.TextBox7.Value = Target.Offset(0, 6).Value 入力F.TextBox10.Value = Target.Offset(0, 7).Value 入力F.TextBox9.Value = Target.Offset(0, 8).Value End With End Sub

  • シート名を変更すると、そのシートのデータがリストボックスに表示されない

    Vista SP1 ExcelXPでマクロ作成中の超初心者です。 シートA会社のセルを、右クリックすると、ユーザーフォームが現れ、その中のリストボックスにsheet1の データが表示されます。sheet2 sheet3 も同様に、正常にリストボックスが表示できています。 ところが、シートの名前 「sheet1」を、「関係データ1」に変更すると フォームにリストボックスが表示されますが、中身は表示されません。 シート名を変更しても、右クリックでリストが正常に表示できるようにするにはどうすればよろしいでしょうか。             1)ブックには,13枚のシートがあります。  1)シート名が  A会社からJ会社           sheet1 sheet2 sheet3 2)会社シートにはそれぞれ以下のコードを記入してあります。  Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Cancel = True 'プロシージャ終了後に表示されるショートカットメニューの非表示 If Target.Row > 14 And Target.Row < 45 And Target.Column > 13 And Target.Column < 15 Then UserForm1.Show End If If Target.Row > 14 And Target.Row < 45 And Target.Column > 19 And Target.Column < 21 Then UserForm2.Show End If ユーザーフォームには、次のコードがあります。 Option Explicit Private Sub CommandButton1_Click() 'With ListBox1 'If .ListIndex = -1 Then 'MsgBox "項目を選択してくだい" 'Else ActiveCell.Value = ListBox1.list(ListBox1.ListIndex) End If End With Unload UserForm1 End Sub ------------------------------------------ Private Sub CommandButton2_Click() Unload UserForm1 End Sub 'Private Sub UserForm_Initialize() 'Me.StartUpPosition = 0 ' Me.Left = 200 ' Me.Top = 100 ' Me.Height = 400 ' Me.Width = 230 'End Sub Private Sub 閉じる_Click() Unload UserForm1 End Sub Private Sub ListBox1_Click() With ListBox1 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ActiveCell.Value = ListBox1.list(ListBox1.ListIndex) ActiveCell.Offset(0, 7).Value = ListBox1.list(ListBox1.ListIndex, 1) Selection.Offset(0, 7).Select End If End With Unload UserForm1 End Sub -------------------------------------------

  • エクセルのコード表示についてですが。。

    Private Sub Worksheet_Change(ByVal Target As Range) (1)If Target.Column <> 4 Then Exit Sub Target.Offset(0, -3) = Now()   ⇒特定のセルに日時自動表示 (2)If Target.Column <> 4 Then Exit Sub  Target.Offset(0, 1) = "DUMMY"  ⇒特定のセルにDUMMYと自動表示 (3)If Target.Column = 4 Then  Target.Offset(0, -2) = "1"  Else             ⇒特定のセルに1と自動表示   (4)If Target.Column = 35 Then  Target.Offset(0, -2) = "2"  ⇒特定のセルに2と自動表示  End If  End If (5)If Target.Value = "T" Or Target.Value = "t" Then  Target.Value = "田中"    ⇒Tと入力すると田中と変換して表示  ElseIf Target.Value = "H" Or Target.Value = "h" Then  Target.Value = "林"     ⇒hと入力すると林と変換して表示  End If  End Sub 上のようなコードを入力すると(3)と(5)が機能しません。。なぜでしょうか??コードの表示がまずいのでしょうか??

  • VBAでエラートラップがうまくいきません。

    VBAで次のようなプロシージャを実行してみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   If Target.Value = " " Then          ~コード~   END IF END SUB すると複数のセルが選択されるとエラーがでます。そこで次のようにしてみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   On Error GoTo エラー処理   If Target.Value = " " Then     On Error GoTo 0           ~コード~   END IF   EXIT SUB エラー処理:   EXIT SUB END SUB ところがこれでもやっぱりIF文のところでエラーがでます。 当方初心者でなぜエラーがでるのかわかりません。 わかりやすくご教授ください。 よろしくお願いします。

専門家に質問してみよう