[[20111010214641]] 『セルの内容をシート名にしたい』(始める一歩) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『セルの内容をシート名にしたい』(始める一歩)
 Excel2003  WindowsXPを使用しています。 
 シート名をセルに表示する方法は以前こちらで教えて
 頂きわかりました。
 今回は、特定のセルの内容をシート名に設定したいと思いますが
 どうすればいいでしょうか。
 よろしくお願いします。

 ------------------------
 始める一歩です。
 全文検索をもう少しして
 [[20040930180016]]の
 INAさんの
 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
 のコードで解決しました。
 失礼しました。
 ------------------------
 上記に関して教えて下さい。
 A1セルが対象の場合はうまくいきましたが、対象のセルの位置を
 変更するとうまくいきません。
 例えば、対象のセルをA2にする場合はTarget.Address(0, 0)のなか
 をどのようにすればいいでしょうか
 よろしくお願いします。始める一歩

 


 Address(0, 0) の部分にカーソルを持っていき [F1]を押すと
 ヘルプが立ち上がります。

 候補の中に
Range.Address プロパティ
Hyperlink.Address プロパティ
 の二つが有りますが、今回は Target.Address となっていて
 Target はセルの事なので、Range.Address の方が該当します。
  ・・・というか、Hyperlinkでは無いですよね。。。

 Range.Address プロパティ の方を開くと
式.Address(RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo)
    RowAbsolute オプション バリアント型 (Variant) 
        行部分の参照を絶対参照として返すには、True を指定します。既定値は True です。 
    ColumnAbsolute オプション バリアント型 (Variant) 
        列部分の参照を絶対参照として返すには、True を指定します。既定値は True です。 
 なんて書いてあります。

 0 → False の事なので、
   RowAbsolute → False → 相対参照
   ColumnAbsolute → False → 相対参照
 の意味です。

 変化が有ったセル(Targetセル)のセル番地を
 A1 の様に相対参照で表すのか、既定値がTrueなので指定しない場合$A$1の様に絶対参照にするのか
 或いは行方向だけ絶対参照にするとか、列方向だけ絶対参照にするとか。。。
 とにかく、今回の変更点で変更する必要は無い場所です。

 変化が有ったセルのセル番地が A2以外だったらマクロ終了 に変更。
  現在のコードは、変化が有ったセルのセル番地が A1以外だったらマクロ終了。
 その後も含め、A1と成っている所がA2に変わります。

 たとえば
 >If Range("A1").Value = "" Then Exit Sub
 は、A1セルの値が""だったらマクロ終了 ですから
     A2セルの値が""だったらマクロ終了 に変更が必要です。

 (HANA)

 HANAさん。
 ありがとうございます。
 とりあえず、教えて頂いた方法で A3セルの場合、下記で出来ました。

 Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(0, 0) <> "A3" Then Exit Sub
    If Range("A3").Value = "" Then Exit Sub

    On Error Resume Next
    Me.Name = Range("A3").Value

    If Err.Number <> 0 Then '=1004
        Err.Clear

        Application.EnableEvents = False
            Range("A3").ClearContents
        Application.EnableEvents = True

        MsgBox "シート名が不正です。", vbExclamation, "エラー"
    End If

    On Error GoTo 0
    Range("A3").Activate
 End Sub

 >If Target.Address(0, 0) <> "A1" Then Exit Subは
 ターゲットとしている行が0列が0がA1セル以外ならマクロ終了だと
 かってに思ってやっていました。
 ありがとうございました。

 詳しく教えて頂いた、他の部分、確認してみます。始める一歩


 すみません。再度の質問です。
 上記でA3セルの場合はうまくいったのですがH14の場合は
 シート名が変更されません。
 Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(0, 0) <> "h14" Then Exit Sub
    If Range("h14").Value = "" Then Exit Sub

    On Error Resume Next
    Me.Name = Range("h14").Value

    If Err.Number <> 0 Then '=1004
        Err.Clear

        Application.EnableEvents = False
            Range("h14").ClearContents
        Application.EnableEvents = True

        MsgBox "シート名が不正です。", vbExclamation, "エラー"
    End If

    On Error GoTo 0
    Range("h14").Activate
 End Sub

 A3をH14に変更しただけなのですが、他に変更する箇所があるでしょうか 
 よろしくお願いします。始める一歩


 >If Target.Address(0, 0) <> "h14" Then Exit Sub
 の上に
 MsgBox Target.Address(0, 0)
 を入れて、Target.Address(0, 0)がどの様な値を返しているか確認してください。

 H14を変更した時にメッセージボックスで表示される文字と
 一致する様に指定する必要が有ります。

 (HANA)

 HANAさん。再度のご支援有難うございます。
 へエ〜! の内容でした。小文字の表現と大文字の表現では違うものなの
 ですね。
 あと、うまくいかない場合は処理の途中でMSGBOXで確認する方法が
 あるのですね。大変参考になりました。今後はコード上のセル番号の表現は
 大文字に統一します。
 ありがとうございました。
 これで、詳しく教えて頂いた、他の部分の確認にすすめます。
 明日仕事なので、明日確認してみます。始める一歩


 うまくいかない時に、問題を探す方法はいくつかあります。
 私は良くメッセージボックスを使いますが
 それでは確認し辛い事もありますし、いちいち面倒な事もあると思います。

 コードを書く部分は白い部分で、その左側に灰色の部分が有ると思います。
 >If Target.Address(0, 0) <> "h14" Then Exit Sub
 と書いてある行の、その灰色の部分をクリックすると 茶色い● がつきます。

 セルの値を変更してコードが実行されたら、●の部分で一旦止まります。
 その時に、「Target.Address(0, 0)」にポインタを持っていくと
 黄色いポップアップでそれが何なのか表示されます。

 その後 [F8] で一行ずつ実行出来たりします。

 色々なデバッグ方法は、だんだん身につけて行かれると良いと思います。
 「VBA デバッグ方法」等のワードで Web検索してみて下さい。

 (HANA)

 HANAさん。ありがとうございます。
 上記での説明、やってみました。 
 ●の部分でマクロを止めて、この時点でのTarget.Address(0, 0)の内容
 確認できました。今内容が変化してセルの番号が表示されました。
 >0 → False の事なので、
 >  RowAbsolute → False → 相対参照
 >  ColumnAbsolute → False → 相対参照
 >の意味です。
 最初のほうで説明して頂いた内容は難しくてよくわかりませんでしたが
 ROWは行のことColumnは列のことかなと思いました。
  最初の0はROWのことをいい、次の0は行のことをいっているのかなあ
 行位置番号も列位置番号も相対参照で表現・・・ あまりよくわかりませんが

 とりあえず、公式的に
 If Target.Address(0, 0) <> "H14" Then Exit Sub は
 内容が変化したセル(ターゲットのセル)がH14以外だったら処理をおわると覚えます。
 ありがとうございました。始める一歩


 >ROWは行のことColumnは列のことかなと思いました。
 この認識は、今後色々な所で使えると思います。

 >行位置番号も列位置番号も相対参照で表現・・・ あまりよくわかりませんが
        MsgBox "Target.Address(0, 0)の結果 " & Target.Address(0, 0)
        MsgBox "Target.Address(0)の結果 " & Target.Address(0)
        MsgBox "Target.Address(, 0)の結果 " & Target.Address(, 0)
        MsgBox "Target.Addressの結果 " & Target.Address
 こんなメッセージボックスで戻り値を確認してみると
 違いが分かるかもしれません。

 今は 公式としてでも何でも良いので、是非覚えておいて下さい。
 今後出てきた時に、違いを蓄積して行けると 使いどころも分かってくるともいます。

 (HANA)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.