[[20150206131724]] 『ハイパーリンクにユーザーフォルダを指定したい』(スフレ) >>BOT

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

 

『ハイパーリンクにユーザーフォルダを指定したい』(スフレ)

お世話になります。
VBAでセルに「開く」という文字を入力してハイパーリンクを設定しています。
ハイパーリンクにはフォルダを指定しているのでクリックするとフォルダがエクスプローラで開くようになっています。

このハイパーリンクでユーザーフォルダを指定するにはどのようにパスを記述したらよいのでしょうか?
私のpcのユーザーパスはc:\user\account1\だとしても他人のユーザーパスはc:\user\account2\のように違います。

%useraccount%のような特殊フォルダをハイパーリンクのパスに記述する方法はないでしょうか?

一度ハイパーリンクを仕込んだらそのエクセルファイルをどのPCで使ってもユーザーフォルダが開くようにしたいです。
どうぞよろしくお願いします。

< 使用 Excel:Excel2007、使用 OS:Windows8 >


 参考まで

 Sub Sample()
    Dim p As String

    p = Split(Environ(39), "=")(1) 'USERPROFILE

    MsgBox p

    p = CreateObject("WScript.Shell").SpecialFolders("desktop")
    MsgBox p

    'SpecialFoldersの引数は以下

    'AllUsersDesktop
    'AllUsersStartMenu
    'AllUsersPrograms
    'AllUsersStartup
    'Desktop
    'Favorites
    'Fonts
    'MyDocuments
    'NetHood
    'PrintHood
    'Programs
    'Recent
    'SendTo
    'StartMenu
    'Startup
    'Templates

    p = CreateObject("Scripting.FileSystemObject").GetSpecialFolder(0)
    MsgBox p

    'GetSpecialFolderの引数は以下。参照設定すれば定数名も使用可能(と思う)

    '0 (定数名は SystemFolder)
    '1 (定数名は WindowsFolder)
    '2 (定数名は TemporaryFolder)

    MsgBox Application.Path

' そのほかに
' Application.AltStartupPath
' Application.NetworkTemplatesPath
' Application.Path
' Application.StartupPath
' Application.TemplatesPath
' Application.UserLibraryPath
' Application.AltStartupPath
' Application.LibraryPath

 End Sub

(β) 2015/02/06(金) 13:42


 おまけです。

 Sub おまけ()

    MsgBox CreateObject("WScript.Network").UserName     'Windows Login User

 'おまけのおまけ

    MsgBox ThisWorkbook.UserStatus(1, 1)        'Office User

 End Sub

(β) 2015/02/06(金) 14:00


 ↑(β) 2015/02/06(金) 13:42 で記述ミスがあります(汗)

    '0 (定数名は SystemFolder)
    '1 (定数名は WindowsFolder)

 こう書きましたが正しくは

    '1 (定数名は SystemFolder)
    '0 (定数名は WindowsFolder)

(β) 2015/02/06(金) 14:17


βさんありがとうございます!
ユーザーアカウントの様々な情報が取れることはわかりました。
これに関しては感謝致します。

それで質問にも書いていますが、ハイパーリンクに%USERACCOUNT%のような環境変数のような
感じでユーザーフォルダを書き込むことはできないでしょうか?

私のPCでこのVBAを実行すると私のユーザーフォルダのパスがハイパーリンクに設定されてしまい、他のPCでxlsxを開いたときにリンクパスが合わなくなってしまいます。
どのPCで開いてもそれぞれのPCでロングインしたアカウントのユーザーフォルダが開くようにしたいのです。
PCにxlsxを移動した後にVBAを実行すればいいのですが、先方に渡すのはハイパーリンクが仕込まれたxlsxファイルのみなのです。

お手数ですがおわかりでしたらご回答頂けると助かりますm(_ _)m
どうぞよろしくお願い致します。
(スフレ) 2015/02/06(金) 14:19


 まず、p = Split(Environ(39), "=")(1) 'USERPROFILE と書きましたが
 p = Environ("USERPROFILE") でもOKです。  

 で、質問の件、現在のコードの中で、パスをハードコーディングしている場所がありますよね。
 そのハードコード部分をEnvironから取得した変数を文字連結させるコードにすればいいんですが?
 (それが、まさしく、環境変数ですから)

 コードがアップされていないので、具体的に、このコードのここを、このように記述 というアドバイスができません。

(β) 2015/02/06(金) 14:37


 「先方に渡すのはハイパーリンクが仕込まれたxlsxファイルのみなのです」

 ここを読み飛ばしていました。
 なるほど・・・・・

 ちょっと調べてみます。どなたか、識者さんから先に回答があればいいですね。

(β) 2015/02/06(金) 14:41


 とりあえず、シートのどこかに =CELL("filename",A1) と打ち込みますと c:\user\account1\・・・・ と、ブックフルパスが取得できますね。
 あとは識者さんにバトンタッチせざるを得ないんですが(当方、エクセル音痴故)このセルの値の先頭の
 c:\user\account1\ の部分を関数で取り出せば、お望みの環境変数ということになりますね。

(β) 2015/02/06(金) 14:51


 とりあえず、コテコテの数式ですが、上記のCELL関数があるセルが ●だとすれば
 =LEFT(●,FIND("\",●,FIND("\",●,FIND("\",●)+1)+1))
 これで、c:\user\account1\ が取り出せますね。

 なので、ハイパーリンクの、当該部分を、この数式にしておかれたらいけますよね。
 数式そのものをもっとスマートなものにするためには識者さんたちからの回答をお待ちください。

(β) 2015/02/06(金) 15:03


βさんいろいろありがとうございます。
先ほど返答を入力したのですがなぜか消えてしまいました・・・。

とりあえず、シートのどこかに =CELL("filename",A1) と打ち込みますと c:\user\account1\・・・・ と、ブックフルパスが取得できますね。

これはブックがc:\user\account1\以下にある場合ですよね。
ブックがどこにあるか関係なくユーザーフォルダを取得したいのですがどうもできないような気がしてきました・・・。

もし他の方でおわかりになられる方がいましたらどうぞよろしくお願い致します。
(スフレ) 2015/02/06(金) 15:15


関数でユーザを取得する
=LEFT(CELL("filename",A1),FIND(CHAR(9), SUBSTITUTE(CELL("filename",A1),"\",CHAR(9),3)))
(デイト) 2015/02/06(金) 15:18

 CELL関数だと、ネットワークドライブとかでは無理っすよね?

 ということは、送ったブックを決められたところに保存してもらわなくてはいけない
 なら相対リンクだから、開いてほしいフォルダの下の階層に入れてもらえばいいような??
 やったことないからわからないけど!

 興味本位ですが、何がしたいのですか?

(稲葉) 2015/02/06(金) 15:23


すいません答えβさんと同じでしたもう一度考えます
(デイト) 2015/02/06(金) 15:25

デイトさん

はい、CELL関数では取れませんでした・・・。

稲葉さん

「何がしたいのですか?」についてお答えします。

c:\Users\[アカウント名]

このフォルダの下にデータがあります。
私のPCにも、作業者Aさん、Bさんのアカウントフォルダ以下にもデータがあります。

そのデータにアクセスするためにハイパーリンクを使いたいのですが、当然ですが皆さんのアカウント名が違うのでどうすればいいのかお聞きしました。

※関係ないですがこのサイト、返答しても返答が消えるのですね・・・。4回返答していますが2回分消えています・・・。
(スフレ) 2015/02/06(金) 15:33


 消えたことないよ。
 プレビューだけ押して、投稿押し忘れてるとか?
 あと誰かが編集しているときにやると、競合が起きて投稿できなくなるから、入力したコメントを
 自分でコピペして残しておくくらい。
 いずれにしろ、それを確かめずにそういうのはどうかと思います。
 実際そういうことをしていないのに消えているのでしたら、別の問題ですので、ブラウザの種類とバージョン
 を記載してもらえば、校長先生が何んとかしてくれるかも!!

 本題ですが、
http://answers.microsoft.com/ja-jp/office/forum/office_2007-outlook/outlook%E3%81%A7%E7%92%B0%E5%A2%83%E5%A4%89/f44d5a04-1898-4851-a426-8909e7f397c7
 Outlookのやりとりですが、やはりハイパーリンク等での環境変数へのアクセスはセキュリティ上やっぱり
 よしたほうがいいみたいですね。

 コマンドプロンプトに/cオプションで・・・とも試しましたが、やっぱりだめでした。

 そこまでやるのに、どうしてマクロ有効ブックじゃダメなんでしょう?

(稲葉) 2015/02/06(金) 15:55


稲葉さん、ありがとうございます!
投稿押し忘れはないです。投稿後の確認をしたのですがトップページから再度リンクを辿ってみたら消えていました。
テキストエディタで記述してから投稿しているので残っているのですがあえて再投稿しなくてもいいかなと思って消えたままにしています。

で、本題の件は了解しました。
マクロブックでもいいんですが、取引先の人が素人さんで、渡したブックのシートの一部分だけを他のブックのシートにコピって使っているようなので新しいブックのほうにはVBAが適用されないので数式かエクセル関数だけでできないかなと思って質問しました。

とりあえず他の方法を考えます。
どうもありがとうございました。
(スフレ) 2015/02/06(金) 16:05


 >マクロブックでもいいんですが、

 でしたら、Openイベントで初回だけ走るようなプログラムにして、それで
 ハイパーリンクを書換→保存、してしまえばいいのではないですか(アイデアだけですけど、、、)

(半平太) 2015/02/06(金) 16:39


ハイパーリンクを使わずに、A1セルを右クリックすると目的のブックを開く、という案はいかがでしょう?
まぁ、VBAを使わないと駄目なのですが、シートモジュールに含めておけば、シートコピーしても引き継がれますよ。
(xlsm保存しないといけませんが)

 Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Dim cFile As String

    If Target.Address <> "$A$1" Then Exit Sub

    cFile = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\test.xlsx"
    If Dir(cFile) <> "" Then
        Workbooks.Open cFile
        Cancel = True
    End If
 End Sub
(???) 2015/02/06(金) 16:40

半平太さん、???さんアイデアありがとうございます!
いちおうVBAも使うという前提でやることにします。
エクセル関数ではできない、ということがわかっただけでもありがたいです!
(スフレ) 2015/02/06(金) 17:08

 マクロブックでいいなら、フォローハイパーリンクイベントで、表示文字が「開く」だけ
 エクスプローラー開くやりかたとかどうですか?

    Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
        If Target.Name = "開く" Then
            CreateObject("Shell.Application").explore Environ("USERPROFILE")
        End If
    End Sub

(稲葉) 2015/02/06(金) 17:11


 Function USER_NAME()
    USER_NAME = Environ("USERNAME")
 End Function

 というユーザー定義関数を作ってワークシート上に
 =HYPERLINK("C:\USERS\"&user_name())
 としてはどうだろうか?

(ねむねむ) 2015/02/06(金) 17:33


コメント返信:

[ 一覧(最新更新順) ]


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