[[20110517161003]] 『ハイパーリンク自動更新マクロでの問題』(エクする?) ページの最後に飛ぶ

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

 

 『ハイパーリンク自動更新マクロでの問題』(エクする?)

 [[20110502105241]] にて質問させてもらった件の続編です。

 いろいろとアドバイスいただき、結局は下記のコードをIndexシートに
 入れました

 ==============================================================
 Private Sub Worksheet_Activate()
    Dim sh As Worksheet
    Dim i As Long
    Dim myRange As Range
    Dim st1, st2 As String

    i = 0
    Set myRange = ActiveCell
    st1 = "Index"
    st2 = "Cover"

    Application.ScreenUpdating = False

    With Sheets("Index")
    .Cells.Clear
        For Each sh In Worksheets
            If Not sh Is Sheets(st1) And Not sh Is Sheets(st2) Then
                i = i + 1
                .Hyperlinks.Add Anchor:=Range("A" & i), Address:="", SubAddress:= _
                    sh.Name & "!A1", TextToDisplay:=sh.Name
            End If
        Next
    End With

    Columns("A:A").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
        :=xlPinYin, DataOption1:=xlSortNormal

    myRange.Select
 End Sub
 ==============================================================

 で、概ねうまくいっていたように見えましたが、問題が発覚しました。

 問題@シート名に半角スペースを含むシートにリンクが飛ばない

 例えばシートを挿入して"test 1"という名前に変更してから
 Indexシートを選択します。するとIndexシートのリストには
 test 1へのハイパーリンクができますが、そこでクリックすると
 「参照が正しくありません」のエラーになります。

 いろいろ試したところ、下記の変更を加えることでリンクが
 正常に機能するようになりました。

                 .Hyperlinks.Add Anchor:=Range("A" & i), Address:="", SubAddress:= _
                    "'" & sh.Name & "'!A1", TextToDisplay:=sh.Name
                    ^^^^^            ^

 が、なぜ最初のコードがいけなかったのか? またこの修正方法が
 本当に正しいのか? という疑問が残っています。

 問題AIndexシートの左隣のシートを削除するとExcelが固まる

 Indexシートを選択した状態で右クリックから新規シートを挿入すると、
 すぐ左隣にシートができますね。で、今度はその新規シートを削除します。
 すると自動的にIndexシートが表示されますね。そのままExcelが固まり、
 何分待っても操作がききません。強制終了するしかないです。

     Application.ScreenUpdating = False

 の一文を削る、または最後に Application.ScreenUpdating = True を
 を入れる、とやるとフリーズ事象は消えます。

 が、これも理由がわからず、です。

 いずれも、事象について納得のいく理由と正しい解決法を知りたいと
 思います。そもそものコードの作りにに問題があるのかもしれないの
 ですが、自分ではわからないので、お力を貸していただけるでしょうか。

 Windows XP & Excel2002
 Windows2000 & Excel2003


 取り合えず下記コードが何をやっているかをヘルプでご確認ください。
 質問する前にこれをやった方が良かったですね。
 BJ

 Application.ScreenUpdating = False
 Application.ScreenUpdating = True


 ScreenUpdatingプロパティの意味そのものについては一応は
 わかっているつもりです(理解が足りないかもしれないですが)。
 プロシージャが終わると元のTrueに戻ると認識していました。
 しかし、今回調べた中で、Trueを明示的に設定したほうがよいと
 ありました。
http://officetanaka.net/excel/vba/speed/s1.htm

 それにしたところで、問題Aのフリーズ事象とどう関係するのかが
 わからないです。

 (エクする?)


 あー、単に更新されていないのをフリーズと勘違いしているのかと思った。
 しかし、原因が解っているのなら、

 >     Application.ScreenUpdating = False
 >の一文を削る、または最後に Application.ScreenUpdating = True を
 >を入れる、とやるとフリーズ事象は消えます。

 とすればいいとも思いますけど・・・。
 取り合えず、Doeventsでもかませてみたら。

 改めて読むと
 >事象について納得のいく理由
 すごいですね。
 全ての意味不明エラーや落ちる現象を説明できる人はいないと思う。
 MSの開発者ならわかるだろうけど。
 エラーになる物はなるし、落ちるものは落ちるから交わすかごまかすしかないと思いますよ。
 BJ

 >しかし、原因が解っているのなら、

 ん?いや、実効上の解消法がわかっただけで、原因はよく理解して
 いないんですよ(自慢じゃないけど)。

 表面的には解消していても、かえってなにか他の不具合の原因に
 なってたりしたら意味がないので。そもそもの原因を理解しないと
 そこの判断ができないと思うのです。

 >全ての意味不明エラーや落ちる現象を説明できる人はいないと思う。

 もちろん「意味不明のエラー」と決まれば、それはそれでいい
 んですけどね。現状は「意味不明のエラー」なのかどうかも
 自分でわからない状態なので、後学のためにも説明のつく事象で
 あれば理解しておきたい、という程度です。

 取り敢えず Doevents を試してみます。

 (エクする?)

 まず、フリーズなのか、画面が更新されていないだけなのか
 という所ではないでしょうか?

 ScreenUpdatingをFalseにしたままですと画面が更新されませんから
 フリーズしたようにも見えますよね。

 で、それをWorksheetのActivateイベントで制御しているのですから
 1つ左のシートを消した時にも該当シートがActiveになるので
 イベントが起動してまたScreenUpdatingがFalseになる。

 という事ではないんですか?
 (momo)

 (momo)さん

 >まず、フリーズなのか、画面が更新されていないだけなのか
 >という所ではないでしょうか?

 1つ左のシートを削除した時には、実際にすべての操作ができなくなります。
 Indexシート上でのマウス操作、キーボード操作すべて無効で、 そこから
 別シートを選択しようとしてもできません。メニューバーでの操作も不可。
 唯一有効なのが、ウィンドウ右上のxマーク、またはウィンドウ左上の
 Excelマークからの強制終了だけのように見えます。

 一方、それ以外のシートを削除した場合や、別シートからIndexシートを
 選択してきた場合には、上記のような事象は起きません。

 なお、この事象は複数のPCで再現しています。

 (エクする?)


 >ウィンドウ右上のxマーク、またはウィンドウ左上の
 >Excelマークからの強制終了だけのように見えます

 それは強制じゃなくて正常な終了ですからフリーズしていないですよね?
 同様の現象は私のほうでも確認していますが、画面更新が停止しているだけに見えます。

 ScreenUpdating = True じゃなくても
 イミディエイトウインドウなどで
 ?activesheet.range("A1").value
 とでもしただけでも解除されますし、値も返ってきますよね?

 繰り返しますが、画面更新されてないだけではないですか?
 (momo)


 (momo)さん、ありがとうございます。

 なるほど確かに・・・。つまりはフリーズの範疇ではないですね。
 失礼しました。

 ひとつ解せないのは、1つ左を削除した場合と、それ以外のシートを
 削除した場合や別シートからIndexシートを選択してきた場合とで、
 振る舞いが異なることです。

 あ、あと問題@も・・・。

 (エクする?) 


 問題1は普通にセルから参照する場合でも同じですよね?
 シート名に数値が入っていたりする場合は「’」を付けないとリンクされません。
 付けていれば問題無いので常に付けておけば良いかと思います。

 振る舞いが異なるというより、基本的に
 単体でボタンなどで起動するプロシージャならまだしも
 イベントドブリンで動かすような不特定に起動するプロシージャで
 アプリケーションの動作に影響を与えるようなプロパティを弄ってるわけですから
 元の状態に確実に戻すのがセオリーです。

 それを停止しっぱなしにしている訳なので
 どちらかと言うと「イレギュラーな事をしてるから何が起きても不思議じゃない」
 という感じがします。

 原因が何と言われれば、キッチリ戻すべきものを戻していない
 のが原因で、バグかどうかの前の話かと思います。

 少し言葉がきついかもしれませんが、大切な事なので
 手癖になるくらいに、元に戻すコードを書いてください。
 (momo)

 (momo)さん、ご説明&アドバイスありがとうございます。
 自分の中で消化し納得できました。

 (エクする?)

コメント返信:

[ 一覧(最新更新順) ]


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