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

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

詳細はこちら
VBA

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

Q&A

解決済

2回答

1062閲覧

指定のブックにシートが有るか確認したい。

ice930

総合スコア99

VBA

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

0グッド

0クリップ

投稿2021/01/18 12:11

Cells(i,4) に以下のハイパーリンクを設定しました。

ActiveSheet.Hyperlinks.Add Anchor:=Cells(i, 4), Address:=Path & ".xlsx", SubAddress:=" '" & name & "'!A1", TextToDisplay:=name

このCells(i,4)のハイパーリンクを後から有効かチェックしたく、

① Cells(i,4)のアドレスを抽出

② Cells(i,4)のアドレスが有効か確認

の工程で、無効ならメッセージを入れたいのですが、以下のコードでうまく行きません。

Path = Cells(i, 4).Hyperlinks.Item(1).Address If Dir(Path) = "" Then MsgBox "リンクは無効です " Exit Sub End If

まず、「Path = Cells(i, 4).Hyperlinks.Item(1).Address」の部分ですが、ブックのパスは抽出できるのですが、シート名、セルの位置まで抽出することが出来ません。

ネット検索等で探したのですが、「セルから抽出したURLで他のブックに有るシートの有無を確かめる」という様なものを見つける事ができず、こちらで質問させていただきました。

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Hyperlinks(1).SubAddress でシート名、セルの位置を取得できます。

Dir関数では、ブックの存在をチェックできますが、シートが存在するかどうかまではチェックできません。

ブックを開いてシートが存在するかチェックすればいいですが、
ご希望のことは開く前に有効かチェックしたいのですよね。

ExecuteExcel4Macroを使えば、開かずにセルの値を取得できます。

閉じたブックからデータを取得する:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug

存在しないシートだとエラーになりますのでそれで開かずにチェックできます。
ただし、R1C1形式の外部参照式に変換する必要がありますので、なかなか面倒です。

コード例

vba

1Public Sub CheckHyperLink() 2 Dim TargetCell As Range 3 Set TargetCell = Cells(2, 4) 4 5 With TargetCell.Hyperlinks(1) 6 Dim path As String, BookName As String 7 path = .Address 8 BookName = Dir(path) 9 If BookName = "" Then 10 MsgBox "リンクは無効です(存在しないブック) " 11 Exit Sub 12 End If 13 14 Dim F As Variant 15 F = "'" & Split(path, BookName)(0) & "[" & BookName & "]" & Mid(.SubAddress, 3) 16 F = Application.ConvertFormula(F, xlA1, xlR1C1, xlAbsolute) 17 If IsError(F) Then 18 MsgBox "リンクは無効です" 19 Exit Sub 20 End If 21 22 If IsError(ExecuteExcel4Macro(F)) Then 23 MsgBox "リンクは無効です(存在しないシート) " 24 Exit Sub 25 End If 26 End With 27 28End Sub

投稿2021/01/18 15:11

編集2021/01/20 09:50
hatena19

総合スコア34073

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

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

ice930

2021/01/20 01:09

ご回答ありがとうございます。 F = Application.ConvertFormula(F, xlA1, xlR1C1, xlAbsolute) の部分ですが、エラー時のチェックをするために、セルにリンクされているシート名を変えて確認したところ、「型が一致しません」と表示されその先に進めません。 解決するのはどの様にすればよろしいでしょうか。
hatena19

2021/01/20 03:37

そのコードに前に、 Debug.Print F というコードを挿入して実行してみて、イミディエイトウィンドウに出力された文字列を教えてもらえますか。
ice930

2021/01/20 07:11

シート名を変えた後のパスが表示されます。 'F:\作業用データ\プラットフォーム作成用\書籍\書籍記録[記録(ネット).xlsx]ミニサイトつくって儲る法'!A1 ちなみに下が替える前です(問題なく動くやつです) 'F:\作業用データ\プラットフォーム作成用\書籍\書籍記録[記録(ネット).xlsx]ミニサイトつくって儲ける法'!A1
hatena19

2021/01/20 07:35

シート名自体に問題はなさそうですね。その文字列で試してみましたがエラーなく通りました。 原因は分かりませんが、とりあえず、 回答のコードを Application.ConvertFormula でエラーが出ても対応できるものに修正しましたので、それで試してみてください。
ice930

2021/01/20 08:49

ありがとうございます!  Exit Function の所で、「SubまたはPropety内ではExit Functionをしようできません」と表示されてしまします。 試しにこの行のみを削除したところ、F = Application.ConvertFormula(F, xlA1, xlR1C1, xlAbsolute)で同様のエラーが発生し進まなくなってしましました。 順番など変えた方が良いでしょうか。
hatena19

2021/01/20 09:50

Exit Function を Exit Sub に修正してください。
ice930

2021/01/20 10:53

ご指摘の部分と If IsError(Application.ConvertFormula(F, xlA1, xlR1C1, xlAbsolute)) Then に変更したら出来ました! ありがとうございます! ConvertFormulaなど、使ったことのないメソッドを使う事も出来、とても勉強になりました!!
guest

0

SubAddressプロパティに設定したセル番地は、SubAddressプロパティにアクセスすることで取得できます。
https://docs.microsoft.com/ja-jp/office/vba/api/excel.hyperlink.subaddress

たとえば、質問文の例で言えば、

VBA

1a = Cells(i, 4).Hyperlinks.Item(1).SubAddress

とすれば、SubAddressに設定されている値がaに取り出せます。

あとは、取得した"'Sheet1!A1'"という形式の文字列から、Find等を使って、シート名とセル番地を切り出し、
シートの存在を確認、
シートがなければエラーを出し、
シートがあれば、そのシートのセル番地の値を返すようにすればよいでしょう。

投稿2021/01/18 14:22

編集2021/01/18 14:23
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ice930

2021/01/20 10:54

分かり易い回答ありがとうございました! 参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問