🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

2985閲覧

ハイパーリンクを開いての繰り返し処理

FANVGwoS2yVCQha

総合スコア1

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/03/29 02:28

編集2021/03/29 02:31

現在、VBAにてデータ処理の自動化を行っております。
I8~I500までのセルにcsvが開けるハイパーリンクを設定しているのですが そのリンクを開いてcsvを指定フォルダに保存していきたいです。名前は開いたデータと同じ名前のままでいいです。

現在下記のようなVBAを作成したのですがI8にあるリンクのcsvしか保存できませんでした。
選択範囲の中で値がなくなったら処理が終わりというVBAになります。
C5のセルには保存先のアドレスを記載しております。
また、最後にマクロを組んでいるExcelも閉じてしまうので、開いたままにしたいです。

Sub ハイパーリンクを開く()

Dim FolderName As String
Dim FilName As String
Dim i

FolderName = Range("C5").Value
FilName = Range("I8").Value

Application.DisplayAlerts = False
Application.ScreenUpdating = False

If Application.CountA(Range("I8:I500")) > 0 Then

For i = 8 To 500

Workbooks("VBA.xlsm").Worksheets("Sheet1").Cells(i, 9).Select
Selection.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True
ActiveWorkbook.SaveAs FileName:=FolderName & "" & FilName
ActiveWorkbook.Close

Next i

End If

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub

ご教示ただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ActiveWorkbook.SaveAs FileName:=FolderName & "\" & FilName

だと FileName は Range("I8").Value 固定なので I8 の名前で上書きされますね。

下記にすれば開いたブック名で保存されます。

ActiveWorkbook.SaveAs FileName:=FolderName & "\" & & ActiveWorkbook.Name


ただ、やっていることは、ハイパーリンク先のCSVファイルを C5セルのフォルダーにコピーしているだけなので、わざわざブックを開く必要はないですね。FileCopyステートメントでコピーできますので。

vba

1Sub ハイパーリンクファイルをコピー() 2 Dim FolderName As String 3 Dim i As Long 4 5 With Workbooks("VBA.xlsm").Worksheets("Sheet1") 6 7 FolderName = .Range("C5").Value & "\" 8 9 If Application.CountA(.Range("I8:I500")) > 0 Then 10 For i = 8 To 500 11 If .Cells(i, 9).Value <> "" Then 12 FileCopy .Cells(i, 9).Hyperlinks(1).Address, _ 13 FolderName & .Cells(i, 9).Value 14 End If 15 Next i 16 End If 17 End With 18 19End Sub

投稿2021/03/29 03:48

hatena19

総合スコア34073

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FANVGwoS2yVCQha

2021/03/29 05:12

ご回答ありがとうございます。 コピーのやり方がわからず 今回のような書き方をしていたので 大変勉強になりました。
guest

0

・FilNameをRange(”I8”)で取得したまま(全部同じ名前で上書きしていた)なのを、Forループ内で毎回取得しなおす
・ActiveWorkbook.Closeがブックを閉じる命令なので削除

取り敢えずこれで最低限の動きはしてくれるはずです。

VBA

1Dim FolderName As String 2Dim FilName As String 3Dim i 4 5FolderName = Range("C5").Value 6 7Application.DisplayAlerts = False 8Application.ScreenUpdating = False 9 10If Application.CountA(Range("I8:I500")) > 0 Then 11 12For i = 8 To 500 13 14FilName = Range("I" & i).Value 15Workbooks("VBA.xlsm").Worksheets("Sheet1").Cells(i, 9).Select 16Selection.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True 17ActiveWorkbook.SaveAs FileName:=FolderName & "\" & FilName 18 19Next i 20 21End If 22 23Application.DisplayAlerts = True 24Application.ScreenUpdating = True 25 26End Sub

その他気になったところとして
・マクロが書かれているワークブックを指定するときは、単純にThisWorkbookにした方が良い
・毎回セルをSelectしてSelection.Hyperlinks(1)を指定するのも実行速度やらいろいろな面で旨くないので、慣れたらFor Each inによるハイパーリンクそのもののループができたら良いと思います。

投稿2021/03/29 04:02

Usirow

総合スコア364

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FANVGwoS2yVCQha

2021/03/29 05:11

ご回答ありがとうございます。 細かいところまで教えていただき 大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問