ハイパーリンクの一括設定をするマクロをWEB上からダウンロードしました。
勉強のため、自分で書ける程度にソースの理解をしたいと思っています。
Application.ScreenUpdating等を除いた根幹部分は下記のようになっています。
Dim a
For Each a In Selection
If Not IsError(a) Then
a.Hyperlinks.Add a, a.Value
End If
Next
この記述では、変数aに定義がなされていません。
変数aをvariant以外で定義するなら、どう書けばいいのでしょうか。
variant以外で書いた場合、もう少し複雑になりそうな気がするのですが。
型を指定する場合は、Rangeです。セルは、Rangeオブジェクトですので。
Shapeオブジェクト用のプログラムではないですよね? もし、Shapeにハイパーリンクを設定しているのであれば、Shapeです。
Sub Normal() Dim a As Range For Each a In Selection If Not IsError(a.Value) Then a.Hyperlinks.Add a, a.Value End If Next End Sub
なお、このサンプルだと空白セルへもハイパーリンクが張られてしまいますので、if文の中にもう一つif文を入れて""かどうかをチェックするのがいいと思います。
同じif文だと、error式のときに型エラーになってしまいます。
又、サブアドレス(例. q.hatena.ne.jp/1214348151#a838419)が記載あるのであれば、そちらもトライしてみてはどうでしょうか?
Iserror(a.Value)
→こちらは、Iserror(a)でも同じなのですが、後で分かり易くするため、デフォルトであってもプロパティは記載したほうがベターです。
Dim a As Object
あるいは
Dim a As Variant
のいずれかになります。
Object型の方がメモリ使用量が少ないので
目的がハッキリしている現状ではObject型が正解かもしれないが
コーディングする上ではVariant型の方が型に悩まなくて済むので便利。
なお、これは実はやってみれば簡単に判ります。
Dim a As Boolean
などとエラーになりそうな指定をして実行してみる事です。
そうすれば「オブジェクト型かバリアント型でなければなりません」といわれますから・・・。
同じ事がFor Eachのヘルプに書かれていますからご一読を。
ありがとうございます。For Eachのヘルプ、拝読させていただきます。
型を指定する場合は、Rangeです。セルは、Rangeオブジェクトですので。
Shapeオブジェクト用のプログラムではないですよね? もし、Shapeにハイパーリンクを設定しているのであれば、Shapeです。
Sub Normal() Dim a As Range For Each a In Selection If Not IsError(a.Value) Then a.Hyperlinks.Add a, a.Value End If Next End Sub
なお、このサンプルだと空白セルへもハイパーリンクが張られてしまいますので、if文の中にもう一つif文を入れて""かどうかをチェックするのがいいと思います。
同じif文だと、error式のときに型エラーになってしまいます。
又、サブアドレス(例. q.hatena.ne.jp/1214348151#a838419)が記載あるのであれば、そちらもトライしてみてはどうでしょうか?
Iserror(a.Value)
→こちらは、Iserror(a)でも同じなのですが、後で分かり易くするため、デフォルトであってもプロパティは記載したほうがベターです。
おっしゃる通り、元のマクロは、もう一つif文をかませていました。
知りたいことをはっきりさせるために、今回転載する際に省略させていただきました。
さすがですね。
サブアドレスの記載があった場合は、上記マクロでは実行できないんでしょうか??
一度試してみます。
プロパティを記載する旨、了解しました。
勉強になります。
おっしゃる通り、元のマクロは、もう一つif文をかませていました。
知りたいことをはっきりさせるために、今回転載する際に省略させていただきました。
さすがですね。
サブアドレスの記載があった場合は、上記マクロでは実行できないんでしょうか??
一度試してみます。
プロパティを記載する旨、了解しました。
勉強になります。