こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

フォルダー内のファイルとリンクするマクロVBA

エクセルのマクロ機能を使い、エクセルのセルに管理番号入力し選択してマクロ実行すると、
自動でセルに入力した管理番号と同じフォルダー名の物を指定した場所に作成し、ハイパーリンクするVBAを
見よう見まねで作成しました。
この作成したVBAに追加機能を付けたいのですが、
WEBで検索したのですが、なかなか実行したい事が合う内容のものが見つからず、
マクロ初心者で何をどうすれば良いのか解りません。
大変申し訳ありませんが、どなたか教えて頂けませんでしょうか?

追加したい機能は、例としてA列の4と5の行を結合(結合しない場合もある)して管理番号を入力し、
自動で管理番号名のと同じフォルダーを作成しハイパーリンクした後に、
手動で、作成したフォルダーの中にファイルを入れる。
その後、行に同じファイル名を入力し、その行を選択してファイル名が同じ物があればハイパーリンクする様にしたい。

添付の画像ですと、管理番号を付けるのはA列で順番に番号を付けていきます。
1つのフォルダーの中に複数ファイルを入れる場合は、列を結合して1つの管理番号にし、
同じ行に並ぶフォルダーのE列(列の場所は変わる場合もあり)にフォルダーの中のファイル名を入力して、
フォルダー内同期リンク実行ボタンを押してファイルをハイパーリンクしたい。

※管理番号で列に対し行は1:1の時もあれば、ファイルの数により、列を結合し1:2~1:10以上もある。
※自動で管理番号名のと同じフォルダーを作成しハイパーリンクするVBAは下記で作ったのですが、
  それをWEBで、似た様な内容のものを少し参考に編集しると、現在の機能も使えなくなってしまったりと困っています。
  難しい。

Sub MakeHyLink()
Dim wkStr As String
If ActiveCell.Column <> 1 Then Exit Sub

If ActiveCell.Value = "" Then
MsgBox "アクティブセルは未入力、やり直し"
Exit Sub
End If

wkStr = ThisWorkbook.path & "\TEST\" & ActiveCell.Value

If Dir(wkStr, vbDirectory) = "" Then
MsgBox "フォルダー:" & wkStr & vbLf & " を、作成します。"
MkDir wkStr
Else
MsgBox "フォルダー:" & wkStr & vbLf & " は、存在します。"
End If

ActiveSheet.Hyperlinks.Add Anchor:=ActiveCell, Address:=wkStr

End Sub

大変申し訳ございませんが、この投稿に添付された画像や動画などは、「BIGLOBEなんでも相談室」ではご覧いただくことができません。 OKWAVEよりご覧ください。

マルチメディア機能とは?

投稿日時 - 2011-06-04 11:34:56

QNo.6785318

困ってます

質問者が選んだベストアンサー

こんにちは No.1です。

>これは「End Sub」の後に「Sub MakeHyLink()」でする事を分けて作成すると
>言う事でしょうか?

そうです。 マクロを記入したシートに続けて記載することができます。
ただし、マクロの名称は別です。

Sub MakeHyLink_Folder() ・・・フォルダにリンクを貼るマクロ。 左側のボタンに登録します。
   :
End Sub

Sub MakeHyLink_File() ・・・ファイルにリンクを貼るマクロ。 右側のボタンに登録します。
   :
End Sub

上記のように、各ボタン用のマクロを作成して、それぞれのボタンにマクロを登録します。

とりあえず、フォルダにリンクを貼るマクロに絞ってマクロの勉強をされたらどうでしょうか?
フォルダが開くだけでも、結構、有効ですから。

この手のマクロを組む時は、必ずループの処理が必要になります。
逆に言えば、このループで処理を自動で繰り返すことができるのがマクロのメリットですね。

For、Do While、Do Untilなど、色々あるのですが、とりあえず、Do Whileを使ったループの
処理を記載します。


Do While 条件式 ・・条件が真(条件に合う)である間、Do While と Loopの間を繰り返し
             処理します。

  :

Loop

基本は下記のようなループ処理です。

Sub MakeHyLink10()

Range("A8").Select '追加 先頭のセルを指定

Do While ActiveCell.Value <> "" 'アクティブセルがNULLでない間(何か入っている)
'DoからLoopまでの間を繰り返す。

ActiveCell.Offset(1, 0).Select '1行、下へ移動

Loop 'Do Whileへ戻る

End Sub

上記のマクロをマクロシートに貼り付けて、Sub MakeHyLink_loop()の行にカーソルを持っていて
F8を押してみてください。

F8を押すと、マクロがステップで実行(1行単位で実行)になり、F8を押すたびに、次の行が
実行されます。 カーソルのある場所がF8を押した時にこれから実行される命令です。

実際にエクセルのシートをみながらやると、動きが分かると思います。
ではさっそく、F8を押してみてください。

Range("A8").Select

が実行されると、エクセルシートのA8が選択されますね。
カーソルはDo While ActiveCell.Value <> ""にあると思います。

次にF8を押すと、Do While ActiveCell.Value <> ""が実行されます。

 Do While ActiveCell.Value <> "" は、

  アクティブセルが、未入力でない間(何か入力されている)、Do と Loopの間の処理を繰り返す。

 ということです。 逆の言い方をすると、

  アクティブセルが、未入力な状態になるまで、Do とLoopの間の処理を繰り返す。

 とも言えます。(笑)

【補足】
 ActiveCell(アクティブセル)とは、範囲選択すると分かりやすいのですが、複数の範囲を
 選択すると、選択された範囲の中で一つだけ、白抜きになった編集対象のセルがありますよね。
 それがアクティブセルです。 なので、単独のセルしか選択していない場合は、そのセルが
 そのままアクティブセルになります。

 ※ActiveCell.Value ← .Valueはアクティブセルの値を意味します。

 また、""とは、NULL(ヌル)と言いますが、何も入力されていない状態(未入力)です。
 何も入っていないように見えても空白は文字とみなされますのでご注意ください。


もし、A8に、何か入っていれば、

 ActiveCell.Offset(1, 0).Select にいきます。

ここでF8を押すと、A9にセルが動くのが確認できると思います。

次のDo While ActiveCell.Value <> ""での判定の準備です。

この処理をしないといつまでたっても、セルの位置が変わらないので永久ループに入ります(笑)
試しにこの行を、'でコメントアウトしてやってみてください。 ずっと繰り返します。
もし、ステップでない状態で実行してしまった場合には、ESCを押すと中断しますのでご安心ください。

 ActiveCell.Offset(1, 0).Select ← .Offset(1, 0).Select は、アクティブセルの位置から
                      1行0列移動したセルを選択しなさいという意味です。
                     .Offset(1, 0)今の位置を基準にして1行0列離れたセル
                     .Select 選択する

次にLoopのところでF8を押すと、Do While ActiveCell.Value <> ""に戻ります。

こうして、アクティブセルが未入力でない状態の間、セルが下にさがっていき、未入力の状態になると

End Sub

に移り、処理が終了します。 これが、ループの基本です。

このループに肉付けしていくと、色々できるようになります。
この処理ができるようになったら、次に進みましょう。


Dim wkStr As String

変数の定義です。
VBAでは変数の宣言をしないと、プログラムの中でその名前を使用できません。

(1)Dim 変数名 As 型

型にはいろいろあるのですが、とりあえず、

Integer ・・・ 数値を扱う場合に使用
String ・・・ 文字列を扱う場合に使用

と覚えておけば、最初は十分でしょう。 最初に宣言しておけば大丈夫です。

(2)下記の文は、ご自身で書かれたものですが、これが1回分の処理ですね。

-----ここから

wkStr = ThisWorkbook.Path & "\TEST\" & ActiveCell.Value

If Dir(wkStr, vbDirectory) = "" Then
MsgBox "フォルダー:" & wkStr & vbLf & " を、作成します。"
MkDir wkStr
Else
MsgBox "フォルダー:" & wkStr & vbLf & " は、存在します。"
End If

ActiveSheet.Hyperlinks.Add Anchor:=ActiveCell, Address:=wkStr

--ここまで

Sub MakeHyLink10()

  ← (1)ここに変数の宣言をしておけば、基本的に大丈夫です。

Range("A8").Select '追加 先頭のセルを指定

Do While ActiveCell.Value <> "" 'アクティブセルがNULLでない間(何か入っている)
'DoからLoopまでの間を繰り返す。

← この間に、ご自身で書かれた上記(2)を記載します。


ActiveCell.Offset(1, 0).Select '1行、下へ移動

Loop 'Do Whileへ戻る

End Sub

基本的に、ループ処理を理解した上で、変数の宣言とご自身で書かれた文を上記の位置に入れて
あげれば、フォルダのリンクは貼れるはずです。
F8を使って、動きを見てみるとわかりやすいですよ^^

そろそろ、残り入力文字数も少なくなってきたので、この辺で(笑)

それでは、何かあれば補足してください。
がんばってください^^

投稿日時 - 2011-06-06 22:54:36

お礼

初心者にわかりやすい様に書いて頂き有難うございます。
とても解りやすく書いて頂いているので、理解もしやすく、
ちゃくちゃくと進み完成しそうです。
まったくの素人にとても丁寧に対応して頂き本当に有難うございます。
本当に有難うございます。

投稿日時 - 2011-06-08 12:43:52

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

こんにちは

マクロ初心者ということですが、コードを全部書くのは問題なので、
避けて回答します。 下記を参考にして考え見てください。

マクロを拝見しましたが、フォルダにハイパーリンクを貼るマクロと、ファイルに
ハイパーリンクを貼るマクロは、分けて作成しましょう。
ボタンが2つありますし、そのつもりだとは思いますが、そのほうが混乱しません。

まず、フォルダにハイパーリンクを貼るマクロですが、ループ処理がありません。
従って、1回しか判定しません。

それから、
>If ActiveCell.Column <> 1 Then Exit Sub
>If ActiveCell.Value = "" Then
>MsgBox "アクティブセルは未入力、やり直し"
>Exit Sub
>End If
このあたりの処理はいらないと思います。 特に意思がなければ削除しましょう。
その変わり、ループ処理をするにあたって、きちんと先頭のセルを指定しましょう。

Range("A8").Select ← A8のセルを選択

ループ処理をしますので、終了の判定をどうするか決定しましょう。
1行づつ、下にずらして処理していき、NULLセルであれば終了する。
といった具合です。
その変わり、この場合は途中にNULLのセルがあると終了します。

NULLのセルは飛ばして、最後まで処理したいなどの場合は、最後のセルに
"EOF"などの文字を設定してその文字と一致したら終了する。
という様にするなどいくつか方法がありますが、今回はNULLのセルがあったら終了
という前提で説明します。

Do While ActiveCell.Value <> ""

  この間に1回の処理を書きます。

Loop

この様にすると、ActiveCellの値がNULLでなくなるまでLoopの間を繰り返します。
ただ、このままですとセルの位置が変わりませんので無限ループになります。
そこで、Loopの上に、ActiveCell.Offset(1, 0).Selectを記入して、

Do While ActiveCell.Value <> ""

  この間に1回の処理を書きます。

  ActiveCell.Offset(1, 0).Select
Loop

とします。 こうすると、1回の処理が終わると、現在のアクティブセルの位置から
1行0列、移動したセルがアクティブセルになります。(~.Offset(行,列).select(選択)
Offsetは相対的な位置を指定します。

また、ActiveCell.Offset(1, 0).Selectを使用すると結合されたセルは1つのセルとして
処理されますので、次の結合されていない下のセルが選択されます。

これで、フォルダーのリンクはできるかと思います。
また、ファイルのリンクについては、

>同じ行に並ぶフォルダーのE列(列の場所は変わる場合もあり)

このような、不規則な条件はやめましょう。 条件を特定すれば、やってできないことは
ありませんが、条件が曖昧なうえに初心者では難しすぎます。

結合の処理については以下のURLが参考になります。

http://officetanaka.net/excel/vba/tips/tips50.htm

上記のURLを参考にして、フォルダのマクロを改良してマクロを作ってみてください。
フォルダが存在するかどうかのチェックをしてからファイルのリンク作業に入るというチェック
に、フォルダのマクロが使えます。

いったん、ここで回答を終了します。 マクロを作成してみて、どうしても上手くできなければ、
わからない個所を明記して、またご質問ください。

では、検討を祈ります。

投稿日時 - 2011-06-05 14:51:50

補足

ご丁寧な回答有難う御座います。
申し訳ありません。
すごく丁寧な回答を頂いたのですが、初心者の私の熟知度が低い為、
色々と試してみたのですが駄目でした。

まず「フォルダにハイパーリンクを貼るマクロと、
ファイルにハイパーリンクを貼るマクロは、分けて作成しましょう」
の回答ですが、これは「End Sub」の後に「Sub MakeHyLink()」でする事を分けて作成すると言う事でしょうか?

それと私の質問が悪く「E列(列の場所は変わる場合もあり)」ですが、
1つのエクセルファイルの書式内で列を変える事はありません。
列が変わる場合もありとは、作ったファイルをコピーして書式を変更して使い回すので、
ファイル毎にE列をリンクさせるファイルもあれば、D列をリンクさせるファイルもあるのでと言う事で、
書かせて頂きました。
すみません紛らわしい書き方しまして。

URLの方を確認させて頂きましたが、私には難易度が高く、どう利用していいのか。

今回、フォルダー作成&ハイパーリンク作成のVBAもWEBで、とても内容が似た内容があり、
変えた所と言えば、もともとA列の1行目からリンクする様なVBAだったみたいですので、
そんな記載があったところを削除したり、結合すると機能しなかったりしたので、
適当なところを削除したら結合しても使える様になったり、
フォルダー作成場所を指定出来なかったので、WEBで調べたらフォルダー指定するようなVBAがあったので
追加したら指定出来る様になったりと、殆ど記載の意味も知らずに編集によって見よう見まねで作成しました。

すみません初心者すぎて・・・

投稿日時 - 2011-06-06 11:54:52

あなたにオススメの質問