[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『セルの内容をシートタグに反映させるには』(bun565)
[シート内セルの内容をシートタグに反映させるには]
すみません。何方か教えてください。
以前シートタグの内容をシート内セルに反映させる方法を教えていただきましたが)シート内セルの内容をシートタグに反映させる方法を教えてください。
一般的に言ってセルの中身を変更するとシート名が変わるというのは、 どうも納得できないですね。
(kazu)
なにもしてないから駄目な時もあるよ。 シートの見出しを右くりっく コードを表示させてそこに貼り付けます。 v(=∩_∩=)v (SoulMan) Private Sub Worksheet_Change(ByVal Target As Range) Me.Name = Target.Value End Sub
SoulManさんのコードをほんの少し改良
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 And Target.Row = 1 Then Me.Name = Target.Value End If End Sub
A1セルに入力したものがシート名になります。但し、クリアしたり/を使ったりするとエラーに。(純丸)
シート名がすでに存在したらエラーとかしないと 危なくって、使えないっす。 (kazu)
おっしゃる通りですね。エラー処理がたくさん必要そう。結局、シートのデータからシート名を 変化させるのは実用的ではないのかも。(純丸)
>エラー処理がたくさん on error resume next だけで対応できると思います。
(INA)
> on error resume ... だけで対応できると思います。 このエラーはこうですときちんとユーザーに示さないと、 次は[エクセル質問ボード]で
「変わるはずのシート名がかわらないんです」
とか聞かれるかも知れないですね。 (kazu)
ちょっと軽率にコードを書いてしまったので↓でどうでしょう? でも、あまり賛成はできませんがぁ、、(^^;; ヒヤアセ v(=∩_∩=)v (SoulMan) Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub On Error GoTo ErrorHandler: Me.Name = Target.Value Exit Sub ErrorHandler: MsgBox "予測出来ないエラーが発生しました。" & Chr(13) & Chr(13) & _ "Error Number=" & Err.Number & Chr(13) & _ "Error Message=" & Err.Description, vbCritical End Sub
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 And Target.Row = 1 Then Me.Name = Target.Value on error resume next End If End Sub (bun565)
↑ この書き方では、on error resume next の意味がありませんよ。
(INA)
はい、衝突しました。INAさんと同じ指摘ですが…
シート名変更の是非云々はともかく… > on error resume next は、 > Me.Name = Target.Value よりも前に記述しないと、これではエラー発生時に普通にとまってしまいます。 「エラーが発生したらこういう風に動きなさい」という命令を「エラー発生後」に指示しても、時すでに遅しって事です。 エラーが発生した時にマクロの実行をとめたいなら、 元々 On Error Resume Next を記述すべきではありません。 VBAのエラーメッセージ見れば原因も解るっちゃ解るし。少々乱暴だけど。 Resume NextするくらいならSoulManさんの示したコードの方がまだ良いとは思う。 (ご近所PG)
> このエラーはこうですときちんとユーザーに示さないと、 >次は[エクセル質問ボード]で >「変わるはずのシート名がかわらないんです」 >とか聞かれるかも知れないですね。
行数の短いコードのときは GoTo も便利ですが、 行数の長いコードのときは、可読性や処理の分岐を考慮すると Resume Next を用いて、エラーナンバーを判定するのが良いかと思います。
自分でちょっと使うだけなら大げさですが・・
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) <> "A1" Then Exit Sub If Range("A1").Value = "" Then Exit Sub
On Error Resume Next Me.Name = Range("A1").Value
If Err.Number <> 0 Then '=1004 Err.Clear
Application.EnableEvents = False Range("A1").ClearContents Application.EnableEvents = True
MsgBox "シート名が不正です。", vbExclamation, "エラー" End If
On Error GoTo 0 Range("A1").Activate End Sub
(INA)
INAさんの上↑のコードで私の心配の半分は解決していますが。 [bun565]さんがなぜ シート名を変えたい と考えるのか知りたいですネ。 (kazu)
〜個人的にはこんな場面〜 月報等を1シート単位で管理している。 とあるセルにはタイトルとして「2004年10月」と言った値を入れている。 シート名も同様だ。 月が変わった場合はシートコピーして新しい月のシートとしている。 「タイトルセルとシート名の両方を変更するのめんどいなぁ… シート名がそのセルの値と同じに勝手に連動して変わると便利カモ」 なんて。 「シート名が変わった時イベント」があればそっちのが適してそうだけど。 >[bun565]さんがなぜ シート名を変えたい と考えるのか知りたいですネ。 確かにちょっと興味ありますネ。 (ご近所PG)
シート複製マクロを作った方が良かったのか・・・(--;)
(INA)
セルフ突っ込み >「タイトルセルとシート名の両方を変更するのめんどいなぁ… > シート名がそのセルの値と同じに勝手に連動して変わると便利カモ」 シート名を取得してセルに表示する関数を書けば良いじゃん。 自己解決&私頭鈍い。 (ご近所PG)
> あるフォーマットのシートを複製していき、 > フォーマット内の製品名と日付をシートタグに反映したい... うーむ、やはり多量コピーしたあとにシート名変更が大変なのですね、
だったら、
[INA] > シート複製マクロを作った方が良かった... で一括の方がもっともっと便利になる可能性があります。
そういう意味で なんで? という疑問を持つことが大事だと思います。
(kazu)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.