[[20090424142124]] 『ハイパーリンク制限について』(くみ) ページの最後に飛ぶ

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

 

『ハイパーリンク制限について』(くみ)

WinXP/EXCEL2000使用

セル:A1からA400までハイパーリンクが貼ってあり、クリックすると それぞれ別のPDFファイルが開きます。

クリックした時にパスワードを入力しないとPDFファイルが開かないように、全てのセルに設定したいのですが、できますか?


 ハイパーリンクが設定されているセルを選択したときに
 ハイパーリンク先が開くのを一端止めて
 制御をする方法は無い様ですので
 A1:A400に設定しているハイパーリンクは解除し
 VBAで、セルが選択されたときにパスワードを要求し
 一致した場合に、指定されているファイルを開く
 と言う方法をとることになりそうです。

 2002以上なら、シートの保護で
 ロックしたセルの選択を不許可に出来るので
 それが使えるかもしれませんが、
 残念ながら2000ではそこまで設定が出来ないみたいです。

 ハイパーリンク先を開ける人と開けない人と
 共有してそのファイルを使いたい って事ですよね?

 (HANA)

(HANA)様 コメントありがとうございます。

>ハイパーリンク先を開ける人と開けない人と
 共有してそのファイルを使いたい って事ですよね?

 はい。その通りです。

 アドバイスのVBAでチャレンジしてみたいのですが
 もしよろしければ、VBAのコードを教えていただけると
 大変助かります。

 VBA、マクロは全くの初心者で、勉強中ですが
 今回はちょっと時間がないので、お願いします。。

 (くみ)


 コードはこんなので出来るのではないかと思います。

 '------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim psw As String, fn As String
If Application.Intersect(Target, Range("A1:A400")) Is Nothing Then Exit Sub
psw = InputBox("パスワードを入力して下さい。")
    If psw = "123" Then         '★ パスワードの設定
        Select Case Target.Address(0, 0)
            '−−−−−−−−−−−−−
            '−−セル番地と対応する−−
            '−−ファイル名を指定−−−
            '−−−−−−−−−−−−−
                Case "A1"
                    fn = "AA"
                Case "A2"
                    fn = "BB"
            '−−−−−−−−−−−−−
            '−−ここ迄の間に追加−−−
            '−−−−−−−−−−−−−
        End Select
        CreateObject("Shell.Application").ShellExecute _
            "C:\" & fn & ".pdf"  '★ C:\ 部分は要変更
    ElseIf psw <> "" Then
        MsgBox "パスワードが違います。"
    End If
End Sub
 '------

 A1:A400のハイパーリンクは解除して下さい。

 セル番地と対応するファイル名をコード内に書いて下さい。
  サンプルコードでは A1セルを選択したら、Cドライブ直下に有る AA.pdf
  A2セルでは Cドライブ直下に有る BB.pdf が開きます。

 シートタブを右クリック→コードの表示
 で出てくる所へ貼り付けて下さい。

 (HANA)

 老婆心ながら。
 SelectionChangeの場合、複数セル選択を考慮しなくてはいけません。
 BeforeDoubleClickの方が良いかもしれませんね。
 (ROUGE)

 そうでした。久しぶりに書いたので忘れてました。。。
 ROUGEさん、ご指摘有り難う御座います。

 こんな感じに変更してみました。

 '------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim psw As String, fn As String
If Application.Intersect(ActiveCell, Range("A1:A400")) Is Nothing Then Exit Sub
psw = InputBox("パスワードを入力して下さい。")
    If psw = "123" Then         '★ パスワードの設定
        Select Case ActiveCell.Address(0, 0)
            '−−−−−−−−−−−−−
            '−−セル番地と対応する−−
            '−−ファイル名を指定−−−
            '−−−−−−−−−−−−−
                Case "A1"
                    fn = "AA"
                Case "A2"
                    fn = "BB"
            '−−−−−−−−−−−−−
            '−−ここ迄の間に追加−−−
            '−−−−−−−−−−−−−
        End Select
        If fn = "" Then
            MsgBox "ファイル名が有りません。"
        Else
            CreateObject("Shell.Application").ShellExecute _
                "C:\" & fn & ".pdf"  '★ C:\ 部分は要変更
        End If
    ElseIf psw <> "" Then
        MsgBox "パスワードが違います。"
    End If
End Sub
 '------

 (HANA)

 Intersect(Target, Range("A1:A400")).Cells(1).Address(0, 0)
 なんてのも有効かも。
 (ROUGE)

 よく考えると、丁度400個なんて
 そう都合良くファイル数が有るとは思えませんので
 この範囲に満たないセルは入力が無い状態に
 してあるかもしれません。

 その場合は
psw = InputBox("パスワードを入力して下さい。")
 の上に
If ActiveCell.Value = "" Then Exit Sub
 を追加しておくのが良いかもしれません。

 (HANA)


 一例ですが、ハイパーリンクとしては、そのセル自体をリンク設定しておいて、
 FollowHyperlinkイベント内でパスワードの入力チェックを行い、正しく入力されたら、別にあるデータから
 本来のリンクを行う という方法です。

 新規ブック(Sheet1、Sheet2というシート名がある)にて試してください。

 まず、標準モジュールにデータ設定を行うプロシジャー

 '================================================================================
 Sub set_hyperlink_sample()
    With Worksheets("sheet1")
       With .Hyperlinks.Add(Anchor:=.Range("a1"), Address:="", SubAddress:= _
                     "Sheet1!A1", TextToDisplay:="Exceの学校")
          .ScreenTip = "Exceの学校"
       End With
       With .Hyperlinks.Add(Anchor:=.Range("a2"), Address:="", SubAddress:= _
                     "Sheet1!A2", TextToDisplay:="ヤフー")
          .ScreenTip = "ヤフー"
       End With
    End With
    With Worksheets("sheet2")
       .Range("a1").Value = "http://www.excel.studio-kazu.jp/cgi-bin/kazuwiki2r.cgi?mycmd=recent"
       .Range("a2").Value = "http://www.yahoo.co.jp/"
       .Visible = False
    End With
 End Sub

 上記のset_hyperlink_sampleを実行してみてください。

 Sheet1のA1,A2に見かけだけハイパーリンクを設定しました。試しにクリックしてみてください。

 このままでは、A1.A2を実行しても、リンクはそれぞれのセルになっていますから、変化はありません。

 次にSheet1のモジュールに

 '================================================================================
 Option Explicit
 Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
    Dim ans As Variant
    Const pw = "aaaa"
    ans = Application.InputBox("input password")
    If TypeName(ans) <> "Boolean" Then
       If ans = pw Then
          CreateObject("wscript.shell").Run """" & Worksheets(2).Range(Target.Range.Address).Text & """"
       End If
    End If
 End Sub

 として再度、Sheet1のA1.A2をクリックしてみてください。

 パスワード入力を要求されたら、"aaaa"(両端の"は除く)と指定して下さい。

 A1なら、Excelの学校、A2なら、Yahooにリンクされるはずです。

 実際のリンク先の情報は、Sheet2に配置して、Sheet2を非表示にしています。

 例題ですので、実際にこのリンク先情報をどこに配置するかは、一考が必要です。
 実際には、PDFファイルのようですが、同じ要領で可能だと思います。
 試してみてください。

 ichinose


(くみ)です。
 皆さん、コメントありがとうござます。
 HANAさん+ROUGEさん(HANAさん修正版)のコードと
 ichinoseさんのコード、両方試してみました。
 教えていただいた通りにやったので、ちゃんとパスワード入力で
 リンク先ファイルが開くようにできました! ありがとうございます。

 HANAさんの仰る通り、丁度400個のファイルがあるわけではないんです。

 仕事で、書類の発行管理台帳をEXCELで作っていまして
 書類1件発行につきEXCELで1行データ入力があるわけです。
 台帳の"A"列に管理番号を入力するので、そのセルをクリックすると
 書類のPDFファイルが開くようにしたかったわけです。

 今期の台帳は教えていただいたVBAで、今後作っていけそうです。

 しかし、問題は過去の分。
 期ごとにEXCEL1ファイルが台帳として残っているのですが
 既に400行前後のデータが入力されていて、それぞれのPDFファイルが400個前後あります。
 ハイパーリンクを設定するのはVBAで一気にできますが、それを開くのにパスワードとなると
 VBAの中に400個のファイル名を入れていくしかないようですね。

 素人考えなのですが、ichinoseさんの方法で、sheet2にあらかじめハイパーリンク先を
 入力しておき、sheet1のA1をクリックするとパスワードを求める、パスワードが一致すれば
 sheet2のA1に入力されたハイパーリンク先ファイルが開く・・・なんてことはできないですかね?
 それでも、やっぱりVBAで400個の命令文を書くことになるんでしょうか?

 これまでEXCELを使ってはいましたが、関数・マクロに興味を持ち始めたのが
 つい最近のことなので、面倒な質問をしてスミマセン。

 もし宜しければ教えてください。よろしくお願いします。

 (くみ)
  

新規ブック(Sheet1、Sheet2というシート名がある)にて試してください。

 まず、標準モジュールに現状に類似したデータ設定を行うプロシジャー

 '================================================================================
 Sub 現状再現()

    With Worksheets("sheet1")
       .Hyperlinks.Add Anchor:=.Range("a1"), _
                  Address:="http://www.excel.studio-kazu.jp/cgi-bin/kazuwiki2r.cgi?mycmd=recent", _
                  TextToDisplay:="Exceの学校"
       .Hyperlinks.Add Anchor:=.Range("a2"), _
                  Address:="http://www.yahoo.co.jp/", _
                  TextToDisplay:="ヤフー"
    End With
 End Sub

 上記を実行すると、Sheet1のA1.A2をExcelの学校、ヤフーにハイパーリンク設定します。
 クリックすれば、普通に開きますよね?

 リンク先がPDFではなくWebサイトだし、データ数も二つと少ないですが、おおよそこのような
 データがあるということでよいですか?

 これを私が前回投稿したデータ配置に変換するには、標準モジュールに

 Sub データコンバージョン()
    Dim sht2 As Worksheet
    Dim sht1 As Worksheet
    Set sht1 = Worksheets("sheet1")
    Set sht2 = Worksheets("sheet2")
    Dim rng As Range
    Dim crng As Range
    With sht1
        Set rng = .Range("a1", .Cells(.Rows.Count, "a").End(xlUp))
        If rng.Row > 1 Or rng.Cells(1).Value <> "" Then
           For Each crng In rng
              With crng.Hyperlinks(1)
                 sht2.Range(crng.Address).Value = .Address
                 .Address = ""
                 .SubAddress = sht1.Name & "!" & crng.Address
                 .TextToDisplay = crng.Value
              End With
           Next
        End If
    End With
 End Sub

 上記のコードを実行してください。

 最後にSheet1のモジュールに前回投稿した

 '===============================================================
 Option Explicit
 Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
    Dim ans As Variant
    Const pw = "aaaa"
    ans = Application.InputBox("input password")
    If TypeName(ans) <> "Boolean" Then
       If ans = pw Then
          CreateObject("wscript.shell").Run """" & Worksheets(2).Range(Target.Range.Address).Text & """"
       End If
    End If
 End Sub

 を追加すれば、パスワード入力要求の仕様になります。

 こういうことですか?

 ichinose


ichinose様
 詳しくアドバイスいただき、感謝×2です。
 正直、なにがどうなっているのかよく理解できていないのですが
 これから仕事で活用することを考え、やってみたことは
 Sheet1のA1〜A3にそれぞれ任意の文字や数字を入力し、それぞれ任意のハイパーリンク先を設定。
 標準モジュールに教えていただいた「データコンバージョン」のコードをコピペ。実行。
 Sheet1モジュールに「Worksheet_FollowHyperlink(ByVal Target As Hyperlink)」をコピペ。
 そして、A1から順にクリックすると、まさに思い描いていた通りの動作となりました。

 「データコンバージョン」では、Sheet1のA列にあるリンク先アドレスをSheet2のA列にコピーする。
 「Worksheet…」では、ハイパーリンクをクリックした時にパスワードを要求。一致すれば
 Sheet2のA列(Sheet1でクリックしたセルと同行)にあるリンク先を開く。
 ということになっていると理解していいのでしょうか?

 何はともあれ、すごいです。
 VBAってホントに何でも出来ちゃうんですね。
 これから、まずはコードの内容をきちんと理解することから始め
 自分でコードを書けるように勉強します。

 ichinoseさんはじめ皆さん。
 本当にありがとうございました。
 また困った時には伺います。
 どうぞよろしくお願いいたします。

 くみ


 >「データコンバージョン」では、Sheet1のA列にあるリンク先アドレスをSheet2のA列にコピーする。
 >「Worksheet…」では、ハイパーリンクをクリックした時にパスワードを要求。一致すれば
 >Sheet2のA列(Sheet1でクリックしたセルと同行)にあるリンク先を開く。
 >ということになっていると理解していいのでしょうか?

 概ね良いです。

 提示したコードは、細かいエラー処理などはしていませんから、よく内容を吟味してください。

 それと根本的なことを・・・・。
 リンク先アドレスなどに代表される将来的にデータの変更が予想されるようなデータを
 コードとして記述するようなプログラムは書かない ということを覚えて置いてください。

 プログラムを変更するのは、仕様の変更時であって、データの変更時ではありませんので。
 こういう観点から考えると、パスワードもコード内に記述するべきではありません。
 簡単な例のつもりだったのでパスワードの内容をコードに記述していますが、
 本来はこのパスワードだって、変更したいと思いますよね?
 その度にVBAコードを変更しなければならないようなプログラムはあまり出来のよいコードとは言えません。

 ですから、このパスワードもコード内ではなく、別の場所にデータとして保持する方法を考えてください。

 ichinose@今日から私のGW-行って来ます


コメント返信:

[ 一覧(最新更新順) ]


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