[[20140724134708]] 『ユーザーフォームにハイパーリンクをつけた時のhi』(にも) ページの最後に飛ぶ

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

 

『ユーザーフォームにハイパーリンクをつけた時のhideメソッド』(にも)

1-15まであるユーザーフォームでアンケートを作成してます。
まず、それぞれのユーザフォームのラベルに、ハイパーリンクを設定しています。

Range("I9").Select

    With ActiveSheet
        .Hyperlinks.Add Anchor:=Selection, Address:="http://www.yahoo.co.jp/"
          On Error Resume Next
        .Hyperlinks(1).Follow NewWindow:=True
    End With
    Range("I9").ClearContents

これ自体はうまくいくのですが、sheet1のI15のセルにフォーム名をリスト選択で選ぶと、指定したユーザーフォームを呼び出せるようにしてあります(アンケートが長いので、中断・途中から始められるように、です)

Private Sub Worksheet_Change(ByVal Target As Range)

myForm = Sheets("Sheet1").Range("I15")

If Cells(15, 9) = myForm Then

  show                              '起動するマクロ名

    End If

ところが、これで途中から呼び出しをかけると、上記のハイパーリンク機能がうまくいきません。1クリックではなく2クリックでようやく開き、アンケート終了後にMe.hideでフォームを閉じようとしても閉じられません。何か問題があるのでしょうか?

End Sub

< 使用 Excel:Excel2003、使用 OS:WindowsXP >


[[20140723103552]]
[[20140723152337]]

 これの続きですね!! 深く関わりのある内容を新規スレッドにする場合は、
 リンクを貼ってください。でないと、全体が把握できないですよね!!

 まず、

 >それぞれのユーザフォームのラベルに、ハイパーリンクを設定しています。 

 これは、

    Range("I9").Select 
    With ActiveSheet
        .Hyperlinks.Add Anchor:=Selection, Address:="http://www.yahoo.co.jp/"
          On Error Resume Next
        .Hyperlinks(1).Follow NewWindow:=True
    End With
    Range("I9").ClearContents

 これは、どのモジュールにどのようなプロシジャー名で実行しているのか明白になっていません。

 同じステートメントでもコードを置くモジュールによって、動作しない場合があります。
 こういう情報をはっきり記述してください。

 >show                              '起動するマクロ名
 あいまいな記述なので何をやっているのかわかりません。

 >アンケート終了後にMe.hideでフォームを閉じようとしても閉じられません。
[[20140723152337]]

 でMe.Hideに変更してください と記述しましたが、このハイパーリンクと絡ませなければ
 正常にユーザーフォームが非表示になるのでしょうか?

 そうではなく、代えてもエラーになるという事でしょうか?
 そうだとしたら、これもどのモジュールのどのようなプロシジャーに記述しているのか
 はっきり記述してください。

 全体的にコードが断片的に記述されているだけなので 再現手順があいまいになっています。

 どのモジュールに(標準モジュールとかシートモジュールとか ユーザーフォームのモジュールとか)どのようなプロシジャーを記述する という事前設定する内容をはっきり記述してください。
 本来は、ユーザーフォームのコントロールの種類や配置だってきっちり記述しなければなりません。

 これらの事前に設定する内容をはっきり記述した上で 閲覧者が不具合に遭遇できる操作手順を
 箇条書きに記述する。

 にもさんの 記述どおりに操作すれば、「ほら、こういう現象になるでしょ」というような再現手順書を記述してください。

 幸運にも遭遇できたエラーです。再現手順書がしっかりしていれば、沢山な方に
 再現してもらえますよね?

(ichinose) 2014/07/25(金) 06:16


ichinose様

ありがとうございます!
そうですよね。大変失礼致しました。ご助言のとおり、一度全体を整理してみます。

条件1
ユーザーフォームを使って15個のアンケートを作成。ユーザーフォームのオブジェクト・構成は全て一緒。ラベルに書き込んである質問内容が違うだけ。シート1にユーザーフォーム呼び出しボタンを設置し、シート2に結果を記述。また、アンケート自体が長いので、途中で中座したときのために、アンケートを途中から呼び出すためのマクロも設置。シート1のI15にアンケート名(ユーザーフォーム名)を入力すると、そのフォームを呼び出せる、という設定になっております。

シート1上に設定されたコード

1、アンケート開始用の呼び出しボタンに登録したコード

Private Sub アンケート開始_Click()
アンケート1.show
End Sub

2、アンケート続きから用に、シート上に直接書いたコード

Private Sub Worksheet_Change(ByVal Target As Range)

myForm = Sheets("Sheet1").Range("I15")

If Cells(15, 9) = myForm Then
 show '起動するマクロ名

  End If

 End Sub

↑ここで記載されているshowコードは標準モジュール1に以下のとおりに設定してあります。

Sub show()

Dim myForm As String

myForm = Sheets("Sheet1").Range("I15")

     On Error Resume Next

    UserForms.Add(myForm).show

End Sub


フォームはチェックボックスと書き込み形式で作成。フォーム上に、参考資料へと飛ぶリンクと、
『登録』『クリア』『終了』『次頁へ』のコマンドボタンを作成。中に記載されているコードは、アンケート15個分すべて一緒。以下の5種類です。

*******************************************************************

リンクコード

Range("I9").Select

    With ActiveSheet
        .Hyperlinks.Add Anchor:=Selection, Address:="http://www.yahoo.co.jp/"
          On Error Resume Next
        .Hyperlinks(1).Follow NewWindow:=True
    End With
    Range("I9").ClearContents

登録コード

Private Sub 登録_Click()

Dim Rw As Long
With Sheets("Sheet2")

    .Cells(1, 3).Value = yes1.Value
    .Cells(2, 3).Value = no1.Value
    .Cells(3, 3).Value = yes2.Value
    .Cells(4, 3).Value = no2.Value
    .Cells(5, 2).Value = toi3.Value
    .Cells(6, 3).Value = yes4.Value
    .Cells(7, 3).Value = no4.Value
    .Cells(8, 2).Value = toi5.Value

    End With

End Sub

クリアコード

  
Private Sub 削除_Click()

    yes1.Value = False
    no1.Value = False
    yes2.Value = False
    no2.Value = False
    toi3.Value = ClearContents
    yes4.Value = False
    no4.Value = False
    toi5.Value = ClearContents

End Sub

終了コード

Private Sub 終了_Click()
Me.Hide
End Sub

次頁へ

Private Sub 次ページへ_Click()
Dim rc As Integer

    rc = MsgBox("登録ボタンを押しましたか?", vbYesNo + vbQuestion, "確認")
    If rc = vbYes Then
    Dim Rw As Long
With Sheets("Sheet2")

    .Cells(1, 3).Value = yes1.Value
    .Cells(2, 3).Value = no1.Value
    .Cells(3, 3).Value = yes2.Value
    .Cells(4, 3).Value = no2.Value
    .Cells(5, 2).Value = toi3.Value
    .Cells(6, 3).Value = yes4.Value
    .Cells(7, 3).Value = no4.Value
    .Cells(8, 2).Value = toi5.Value

    End With

        MsgBox "次のアンケートに進みます"
     If rc = vbYes Then
           GSSC発信の各種発信文書.show
       Me.Hide
    Else
        MsgBox "登録ボタンを押してください"
    End If
     End If
End Sub

*****************************************************

現状起こっている問題点

シート1のボタンに書き込んだ
Private Sub アンケート開始_Click()
アンケート1.show
End Sub

にてアンケートを開始―終了まで続けて行う場合は何も問題ございません。正常に機動・終了します。リンクも正常に動作します。

ですが、

たとえばアンケート7で終了し、途中呼び出し用に下記のコードを使って、アンケート途中から開始した場合、以下の問題が発生してしまいます。

1、呼び出したユーザーフォームがなぜか4つ機動する。
2、リンクをクリックすると、通常は画面一番前に出てくるリンクの窓が
  開くと同時に最小化されてしまう。(ゆえに開いたことに気づけない)
3、『次頁』ボタンで次のアンケートに進み、新しく機動したユーザーフォームでリンクを開こうと
  すると、なぜか一つ前のフォームでリンクを開いてしまう。

現時点では、おかしな機動をしているものの、明確なエラーメッセージが出ているわけでもなく
原因・対処に検討がつきません。

どのあたりに問題があるか、ご指摘願えませんでしょうか?
(にも) 2014/07/25(金) 10:14


 再現が出来ません。が、気になったことがいくつか・・・。

 1 >中に記載されているコードは、アンケート15個分すべて一緒

 とあります。つまり、全く同じユーザーフォームを15個も用意しているという事ですか?
 どうしてですか? 全く同じなら一つでいいじゃない と単純に思います。

 2 リンクコード なるコードのSubステートメントがありませんが、これで作動しますか?

     因みに指定URLを開きたいだけなら、

 Private Sub Label1_Click()
    CreateObject("wscript.shell").Run "http://www.yahoo.co.jp/"
 End Sub

 これでも行けると思います。

 3 どうしてHideメソッドでユーザーフォームを閉じているのですか?
   unload me  だと問題があるのですか?

     UserForms.Add(myForm).show このコードでユーザーフォームを表示しているなら、
     Hideメソッドを使う意味がわかりません。
     というより、どんどんユーザーフォームのインスタンスが増えていくだけです。

 以上、疑問点です。

(ichinose) 2014/07/26(土) 09:27


ichinose様

ありがとうございます。返信が遅れまして申し訳ございません。

 1 >中に記載されているコードは、アンケート15個分すべて一緒

>書き方が中途半端で申し訳ございませんでした。これは、使用しているコード・設問に使ったオブジェクト数などが同じ、という意味で、アンケート上に書いてある質問内容はもちろん違います。ですので、フォームを分けております。

2、SUB書き忘れです。本体には書いてあります。すみません。

3、ええと、特に意味はありません。参考にしたマクロがHideメソッドで閉じていたので、それをそのまま引用しました。unloadに書き換えてきます・・・
(にも) 2014/07/28(月) 14:17


コメント返信:

[ 一覧(最新更新順) ]


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