• 締切済み
  • 困ってます

EXCELのシート名自動入力

EXCELでシート名にセルA1の値を自動入力したいので、 下記のマクロを使いましたが、いちいちマクロを実行しないと自動入力できません。 Public Sub SheetName() ActiveSheet.Name = Range("A1").Value End Sub これを、マクロを実行しなくても、セルA1の値が変わった時点で 自動的にシート名も変わるようにできないでしょうか?

共感・応援の気持ちを伝えよう!

  • 回答数7
  • 閲覧数1168
  • ありがとう数2

みんなの回答

  • 回答No.7

 回答No.6の画像に一部間違いが御座いましたので、画像を貼り直させて頂きます。  尚、下記の添付画像は、各シートのシート名が最初、 別シート Sheet2 Sheet3 Sheet4 Sheet5 Sheet6 Sheet7 Sheet8 Sheet9 Sheet10 Sheet11 Sheet12 となっている状態になっていたところに、回答No.6のマクロによる処理を行ったものです。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • マクロの自動実行

    Private Sub Worksheet_Calculate() Range("b1").Value = Range("b1").Value + Range("a1").Value End Sub このマクロをA1セルの数値が変わるたびに自動で実行するには どうすればいいでしょうか?

  • Excelでの複数シートへの値の入力

    おはようございます。 Excel2000で複数のシートを選択した状態でセルに値を入力すると、他のシートの同じセルに内容が入力されますよね。 この機能の名称はわかりませんが・・・(^_^;) これをヒントに「フォーム内にあるTextBoxに入力された値を各シートのセルに入力しよう」というVBAのソースを作ってみましたが、 実行してみると選択されている1枚目のシートにしか値が入力されません。 汚いソースをみなさんに見せるのは恥ずかしいのですが、 是非実現したいので、どこが間違っているか指摘をいただけると幸いです。 やろうとしていること: フォームのテキストボックスに値を入力し、 コマンドボタンを押すとシートを複数枚選択し、 各シートのセル”A1”(AからDまでを結合)に値を入力する。 ******************************************* Private Sub CommandButton1_Click() 'テキストボックスの値取得と、店名の合成 Dim myTmei As String Dim myTmei2 As String myTmei = TextBox1.Text myTmei2 = "店名" & myTmei 'シートの選択 Sheets(Array(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46)).Select '値の入力 Range("A1").Select Range("A1").Value = myTmei2 End Sub ****************************************** 結果を見ると、シート自体は選択できているのですが、 その中でも「アクティブになっている(?)シート(1枚目)のセルだけに値を入力しなさいよ。」と書いてしまったようで、 「全てのシートのセル”A1”に入力しなさい。」という部分が書けていないのだと思うのです。 Selectだけじゃ、ダメなのかな・・・ どうかよろしくお願いします。

  • エクセル2002、OS=WinXPです。エクセルので、特定セルに入力さ

    エクセル2002、OS=WinXPです。エクセルので、特定セルに入力された文字列によってシート見出しの色を変えたいですが、VBA式がうまくいきません。 もし、セルB3の値がAAAの場合、シート見出しの色を緑(カラーNo=50)にする。 もし、セルB3の値がBBBの場合、シート見出しの色をピンク(カラーNo=7)にする。 もし、セルB3の値が上記以外の場合、シート見出しの色を白(カラーNo=2)にする。 というふうにしたいと考えています。マクロを用いていろ番号を調べたところ、上記Noでした。 Sub 会社名に合わせてシート見出し色を変更() ' ' ActiveSheet.Select If ActiveSheet.Range("B3").Value = AAA Then ActiveWorkbook.ActiveSheet.Tab.ColorIndex = 50 ElseIf ActiveSheet.Range("B3").Value = BBB Then ActiveWorkbook.ActiveSheet.Tab.ColorIndex = 7 Else: ActiveWorkbook.ActiveSheet.Tab.ColorIndex = 2 End If End Sub 上記式で実行をクリックしても実行されません。無反応です。調べて直してもだめでした。上記の式の間違いを教えていただけませんでしょうか??? さらに、このマクロを今開いているブック全体に反映するためには、ActiveSheet の文字を削除すればよいでしょうか??すみませんが、詳しい方、あわせてご回答いただけますでしょうか?    

  • 回答No.6

>別シートのB1を手入力した際に、該当シートのシート名を自動入力させたいというのが本音なのです。 >ならば、 Address = "$A$1"でなくAddress = "別シート!$B$1"のような指定と考えてしまいますが、シート毎にA1の参照元が別シートのB1、B2、B3、B4と変わっていくので、参照先のA1で統一したいのです。  それでしたら、各シートのA1セルへのシート名の反映は止めて次の様にされては如何でしょうか?  まず、下記の添付画像の上側の画像の様に、別シートのA列には「シート名を変更する予定のシートの現在のシート名」を入力しておき、B列は変更後のシート名の入力欄、C列は「シート名を正しく変更する事が出来たかどうかの結果」を表示するための欄として使用します。  その場合、下記のVBAのマクロを別シートのシートモジュール上に入力してから、B列に変更後のシート名を入力しますと、添付画像の下側の画像の様に、C列に「マクロによる処理を行った結果」が表示されるとともに、A列の値が新しいシート名に合わせて書き換えられます。  尚、処理の都合により、別シートの1行目は項目欄として使用しますので、シート名は入力しない様にして下さい。 Private Sub Worksheet_Change(ByVal Target As Range) Const ItemRow = 1, PreNameColumn = "A", PostNameColumn = "B", ResultColumn = "C" Dim myRange As Variant, LastRow As Long, c As Range, PreName As Variant With ActiveSheet LastRow = .Range(PreNameColumn & Rows.Count).End(xlUp).Row If LastRow <= ItemRow Then Exit Sub Set myRange = Intersect(Target, _ .Range(PostNameColumn & ItemRow + 1 & ":" & PostNameColumn & LastRow)) End With If myRange Is Nothing Then Exit Sub With Application .ScreenUpdating = False .Calculation = xlManual End With With ActiveSheet For Each c In myRange PreName = .Range(PreNameColumn & c.Row).Value If IsError(Evaluate("ROW('" & PreName & "'!A1)")) Then If PreName = "" And c.Value = "" Then .Range(ResultColumn & c.Row).Value = "" Else .Range(ResultColumn & c.Row).Value = "該当シート無し" End If ElseIf c.Value = "" Then .Range(ResultColumn & c.Row).Value = "シート名未入力" Else If Not IsError(Evaluate("ROW('" & c.Value & "'!A1)")) And c.Value <> PreName Then .Range(ResultColumn & c.Row).Value = "既に使用中のため使えない名称" Else On Error GoTo label1 Sheets(PreName).Name = c.Value On Error GoTo 0 .Range(PreNameColumn & c.Row).Value = c.Value .Range(ResultColumn & c.Row).Value = "シート名変更済み" label2: End If End If Next c GoTo labelE label1: .Range(ResultColumn & c.Row).Value = "シート名に使えない文字列" GoTo label2 End With labelE: With Application .CutCopyMode = False .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub

この投稿のマルチメディアは削除されているためご覧いただけません。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

再度のご回答有難うございます。 残念ながら添付ファイルが削除されているのと、 余りにも高度で複雑なマクロのため、理解できませんでした。 せっかく再回答いただいたのに、申し訳ございませんでした。

  • 回答No.5

別シートのシートモジュールに下記をコピー 別シートのB1~B4が変更された時に、各シートのA1の値と別シートの変更されたセルの値が一致しているシート名を変更するとすれば良いでしょう。 Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("B1:B4")) Is Nothing Then Exit Sub Dim WS As Worksheet For Each WS In Worksheets If WS.Range("A1").Value = Target.Value Then WS.Name = Target.Value Exit For End If Next End Sub 添付画像が上記コードでシート名を変更した結果です。

共感・感謝の気持ちを伝えよう!

質問者からの補足

再度のご回答有難うございます。 お陰様でご回答の内容で出来ました。 が、もうひとつだけ応用できれば、というのがあります。 シート名の参照条件等は変わらないのですが、 シート名を変更する契機(きっかけ)を 「別シートのB1~B4が変更された時」でなく、 「別シートのどこかのセルが変更された時」、 要するに「別シートの内容が少しでも変更になった時」に 変えられますでしょうか? 何度も追加リクエストで申し訳ございません。

  • 回答No.4

 A1セルに入力された値がシート名には使う事が出来ない文字列である場合も考えられますから、その様な場合にもエラーとならない様にするための工夫が必要です。  又、シート名を入力するセルをシートの中で左上の隅に位置するA1セルとしている場合であれば兎も角、もしA1セル以外のセルを、シート名を入力するセルとして使用する場合には次の様な問題が発生します。  例えば、B2セルを「シート名を入力するセル」にしている場合で、もし、2×2よりも大きなセル範囲をコピーしてA1セルに貼り付けた場合、B2セルの値も変更されますが、Targetとは値が変更された全てのセル範囲なのですから、Targetの行番号や列番号はTargetの左上の隅のセルであるA1セルの行番号や列番号になってしまいますので、マクロの実行をTargetの行番号や列番号を基準に判定したのでは、B2セルの値が変わっているにもかかわらず、シート名が変更しない場合もあり得ます。  ですから、次の様なマクロにされた方が良いと思います。  尚、下記のマクロの構文は標準モジュールではなく、This Workbookモジュール上に書き込む様にして下さい。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim c As Range, temp As Variant For Each c In Target If c.Address = "$A$1" Then On Error Resume Next c.Parent.Name = c.Value On Error GoTo 0 End If Next c End Sub  尚、上記のマクロは、そのExcel book内のどのシート(新規に作成したシートも含む)であってもA1セルに値を入力すると、その値が自動的にシート名に反映されます。  因みに、特定の1枚のシートでのみその様な処理が行われ、他のシートではA1セルに入力してもシート名は変わらない様にする場合には、上記のVBAの中の最初の行である Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) という箇所を、 Private Sub Worksheet_Change(ByVal Target As Range) に変更した構文を、This Workbookモジュールではなく、シート名が自動的に変わる様にしたいシートのシートモジュール上に書き込んで下さい。

共感・感謝の気持ちを伝えよう!

質問者からの補足

ご回答有難うございます。 ご回答いただいたやり方でできました。 ただ、A1セルを手入力する場合は出来ましたが、 A1セルの値を別シートからの項目参照としてしまうと 出来なくなってしまいます。 実はA1セルは「=別シート!B1」という項目参照にしたくて、 別シートのB1を手入力した際に、該当シートのシート名を自動入力させたいというのが本音なのです。 ならば、 Address = "$A$1"でなくAddress = "別シート!$B$1"のような指定と考えてしまいますが、シート毎にA1の参照元が別シートのB1、B2、B3、B4と変わっていくので、参照先のA1で統一したいのです。 最初の質問文にA1が項目参照と書けば良かったのですが・・・ 策はありますでしょうか?

  • 回答No.3

シートチェンジイベントのコードの記載方法は色々ありますけど、私なら下記のようにします。 ブックの全シートでa1の値が変更された場合に、シート名を変更する場合。 下記をworkbookモジュール(ThisWorkbook)にコピー Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub ActiveSheet.Name = Range("A1").Value End Sub 指定シートのみに実行する場合は該当シートモジュールに下記をコピー Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub ActiveSheet.Name = Range("A1").Value End Sub 指定シートが複数ある場合はbookモジュールで変更しないシートを指定する方法が簡単だと思います。それにはブックのシート数と変更しないシートの番号が必要です。

共感・感謝の気持ちを伝えよう!

質問者からの補足

ご回答有難うございます。 ご回答いただいたやり方でできました。 ただ、A1セルを手入力する場合は出来ましたが、 A1セルの値を別シートからの項目参照としてしまうと 出来なくなってしまいます。 実はA1セルは「=別シート!B1」という項目参照にしたくて、 別シートのB1を手入力した際に、該当シートのシート名を自動入力させたいというのが本音なのです。 ならば、 Range("A1")でなく Range("別シート!B1")と考えてしまいますが、シート毎にA1の参照元が別シートのB1、B2、B3、B4と変わっていくので、参照先のA1で統一したいのです。 最初の質問文にA1が項目参照と書けば良かったのですが・・・ 策はありますでしょうか?

  • 回答No.2

Alt+F11でVBEを表示。 左側、プロジェクトエクスプローラのウィンドウで対象のシートを右クリック-[コードの表示] Private Sub Worksheet_Change(ByVal Target As Range)  Call SheetName() End Sub を貼り付け。 では。 > これを、マクロを実行しなくても、セルA1の値が変わった時点で マクロを実行しないわけでなくて、シートの内容が変わったら常にマクロを実行するようにしてるわけですが。

共感・感謝の気持ちを伝えよう!

  • 回答No.1

イベントプロシージャを使うとできます。 イベントプロシージャの作り方はつぎ↓、 http://excelvba.pc-users.net/fol3/3_6.html コードの例: -------------------------------------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) RN = Target.Row CN = Target.Column If RN <> 1 Then GoTo EP If CN <> 1 Then GoTo EP ActiveSheet.Name = Range("A1").Value EP: End Sub ------------------------------------------------------------------------------------------------------- 試していませんが、これで動くと思います。 「A1の値が変化した時実行、A1以外の値が変化しても実行しない」ようにするため、つぎのコードを入れました。もっとスマートな方法があるかもしれませんので工夫してください。 RN = Target.Row CN = Target.Column If RN <> 1 Then GoTo EP If CN <> 1 Then GoTo EP

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • シート名を自動で

    久し振りにお世話になります。 よろしく御願いします。 windowsXP EXCELL2003 です。 下記を採用しました。 表題 「エクセルのセルに名前を入力するだけで自動的にそのシートタブもその名前に」 アドレス http://oshiete1.goo.ne.jp/qa5775792.html 内容 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Cells = Range("A1") And Range("A1") <> "" Then ActiveSheet.Name = Range("A1").Value End If End Sub でばっちりできました。 ただ 何かのミスで A1 の内容を変更した場合シート名が変わりません。 1 もし A1 が変更された時シート名も変更されることが可能でしょう  か。 2 大変厚かましいのですが追加の要望としてシートの色(コード20)  もつけられれば良いのですが。 もし可能ならば上記の「内容」をどう変更すればいいかご教授ご指導を仰ぎたいです。 よろしく御願いします。

  • マクロでシート名を変更を変更したい

    A1セルの値をシート名にするマクロは以下のとおりだと思います。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" Then Sh.Name = Target.Range("A1").Value End Sub では、E6セルの値をシート名にすることは可能でしょうか? よろしくお願いします。

  • excel|シートのリンク方法について

    いつもお世話になります。 エクセルは2010を利用しています。 現在、下記のコードで、文字揃えを制御しています。 A1&#65374;C1は、それぞれセルが結合されています。 ---------------------------------------------------------- Sub HorizontalAndVerticalAlignmentSamp1() If Range("B1").Value = "" Then With Range("C1") .HorizontalAlignment = xlHAlignRight End With Else With Range("C1") .HorizontalAlignment = xlHAlignLeft End With End If If Range("A1").Value = "" Then With Range("B1") .HorizontalAlignment = xlHAlignRight End With Else With Range("B1") .HorizontalAlignment = xlHAlignCenter End With End If End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Range("A1:C1") <> "" Then Call HorizontalAndVerticalAlignmentSamp1 End Sub ------------------------------------------------------------------------- シート2、シート3は、A1&#65374;C1のセルがシート1とおなじように結合されています。 シート1で、A1&#65374;C1に文字を入力したら、おなじ文字と文字揃えがシート2、シート3でも反映、シート1で、A1&#65374;C1に入力されていた文字を削除すると、シート2、シート3も消えているようにしたいです。 わたしの知っている限りの範囲でがんばってみたことは シート2、シート3のA1に「=Sheet1!A1」、B1に「=Sheet1!B1」、C1に「=Sheet1!C1」と入力して シート2、シート3にも上記とおなじマクロを記述してみました。 けれど、シート1で入力しても、シート2、シート3を選択して、どこかのセルを1回選択しないと、文字揃えが反映されませんでした。 そこで、 シート1の上記マクロに Sheet2.select Sheet3.select Sheet1.select を追加してみました。 けれど、あたりまえといえばあたりまえなのですが、シート1でどこかのセルを選択するごとにシート2、シート3、シート1と画面が切り替わるようになり、画面が切り替わったあとにシート2、シート3を見てみても、文字揃えはどこかのセルを選択しないかぎりおなじく反映されませんでした。 どのようにしたらいいのかが分からず、質問いたしました。 みなさまのお知恵を借していただけますと幸いです。 どうかよろしくお願いいたします。

  • エクセル マクロについて

    エクセルでネットの情報(為替の値動き)を自動更新で取得しています。自動更新前の情報を同一シート(同一シートが無理な場合は別シートでもいいのですが…)にコピペし一覧にするマクロはありますか? Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then         'A1のセルの値が変化したら・・・ n = Cells(Rows.Count, "B").End(xlUp).Row + 1  ’B列の最終行を探しその次の行に・・・ Range("B" & n).Value = Range("A1").Value    ’A1の値を貼り付けていく End If End Sub これだと手動セルを上書きした時しか動いてくれませんでした。検索もしたのですが見当たらなくて困っています。お力を貸してください。

  • VBAでシートが追加されたタイミングで動かしたい

    いつもお世話になっております。 掲題の通り、マクロが動くタイミングを、 そのファイルにシートが追加されたときに自動で動くように したいのですが、どのようにしたらいいでしょうか。 具体的に言うと、シートを追加すると、そのシート名を自動で セルの値から取得し、変更してほしいのですが…。 今は以下のように作っています。 Sub シート名変更() Range("N3") = "=VLOOKUP($I$9,Sheet1!$V$2:$W$22,2,0)" ActiveSheet.Name = ActiveSheet.Range("N3") End Sub 申し訳ありませんがご教授いただけたら幸いです。 宜しくお願い致します。

  • エクセルのマクロで数式を入力したい

    エクセルのマクロで数式を入力したい エクセルのマクロでシート1のA1に シート2のA1の値を表示させる数式を入力したいと思って Sub tamesi() Sheet1.Activate Range("a1") = "=sheet2!a1" End Sub と書くと動作します ここにIF文をいれてシート2のA1に値がないときは シート1のA1には空白で返したいと思い Sub tameshi2() Sheet1.Activate Range("a1") = "=if(sheet2!a1= 0,"",sheet2!a1)" End Sub と打つと動作しませんでした アプリケーションの定義またはオブジェクトの定義のエラーです と返ってきます。 いろいろやってみたのですが、なにせ勉強し始めで よくわかりませんでした。 教えてください よろしくお願いします

  • エクセルのシート名更新のマクロについて

    エクセルのシート名更新のマクロについて B1の値を元に、シート名を更新するマクロでつまづいています。 (1)B1セルに9/1と入力したら、2010年9月と表示されるように 「セルの書式設定」で調整しています。 (2)「(1)」で表示された年と月の情報をシート名に反映させたいと 思っています。 そこで、次のコードを記入しました。 --------------------------------------------------- Sub 更新作業() 'ひと月更新する。 Worksheets(1).Activate Range("B1").Select For Each r In Selection r.Value = DateSerial(Year(r.Value), Month(r.Value) + 1, Day(r.Value)) Next r 'シート名を変更する。 Worksheets(1).Activate ActiveSheet.Name = Format(Range("b1"), "yyyy年m月") ' 数量を削除する。 Range("C4:D9").Select Selection.ClearContents Range("C4").Select End Sub --------------------------------------------------- この場合「ActiveSheet.Name = Format(Range("b1"), "yyyy年m月")」で エラーが出てしまいます。 なぜ問題が出るのか、 また、解決策があれば、教えていただけないでしょうか。

  • エクセルでセルに文字が入力されたらマクロを実行

    前回どなたかが質問されて回答を見せてもらったら私のやりたいことと同じだったので実行してみましたが出来なかったのでもう一度質問をさせてください。 1.実行したのですが、なにも実行されません。 2.実行したらメッセジBOXだけは実行するのですが、後のコマンドが実行されずにエラーになります。 もう一度詳しく教えてください。 マクロ初心者ですよろしくお願いします。 1.【シートモジュールで条件判定し、マクロを起動する】 通常はこちらの方法が使われます。 Private Sub Worksheet_Change(ByVal Target As Range)   '変化のあったセルがA1セルか?   If Target.Address = "$A$1" Then      '条件判定:A1セルの値は 1 か?     If Target.Value = 1 Then       MsgBox "A1セルは条件を満たしました"     End If   End If End Sub 2.【ワークシート上で条件判定し、マクロを起動する】 処理内容にもよっては不向きな場合もありますが、こんな方法も あります。 マクロを Sub ではなく、Function 、、つまり関数にしてしまいます。 Function TestMacro() '<-- Sub を Function に替える   MsgBox "A1セルは条件を満たしました"   TestMacro = "" '戻り値はなし End Function そして、ワークシートの B1 セルに次の式を入力します。()は必須 です。  =IF(A1=1,TestMacro(),"")

  • 数値を入力、ボタンをクリックして行を挿入

    下記はA1に「5」を入力し、マクロを実行すると、A10行より5行分挿入するといったコードですが、シート1のA1に「5」を入力し、マクロを実行するとシート2のA10行より5行分挿入するといったコードを教えてくれませんか? 宜しくお願いします。 Sub Test() Range("A10").Resize(Range("A1").Value).EntireRow.Insert End Sub

  • 日付を自動入力する方法

    入力フォームと言うシートの日付列A8からA22(A8からD8まで結合して、このパターンでA22まであります)まで日付を入れるようにしています。右隣の列E8からE22は商品名が入る列です。 今は、下記のVBAで日付のセルを選択して、日付が自動で入るボタンを押して、本日の日付を入力しています。K28には=today()の関数が入っています。 Sub 日付入力()  ActiveSheet.Unprotect  Range("K28").Copy  ActiveSheet.Paste  Application.CutCopyMode = False  ActiveSheet.Protect End Sub これを日付のマクロボタンを押す毎に、A8からA22まで順番に入力できるようにするにはどうすればよいでしょうか? 尚、入力フォームの作成・保存が終わるとA8からA22まですべて、セルの値を消去するマクロボタンを作っています。