エクセル(2003)VBAでつくるマクロに関する質問です。


ハイパーリンクの一括設定をするマクロを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以外で書いた場合、もう少し複雑になりそうな気がするのですが。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2008/07/04 12:45:42
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:airplant No.2

回答回数220ベストアンサー獲得回数49

ポイント40pt

型を指定する場合は、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)でも同じなのですが、後で分かり易くするため、デフォルトであってもプロパティは記載したほうがベターです。

id:tomokazu0525

おっしゃる通り、元のマクロは、もう一つif文をかませていました。

知りたいことをはっきりさせるために、今回転載する際に省略させていただきました。

さすがですね。

サブアドレスの記載があった場合は、上記マクロでは実行できないんでしょうか??

一度試してみます。

プロパティを記載する旨、了解しました。

勉強になります。

2008/07/04 12:36:36

その他の回答1件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント40pt

Dim a As Object

あるいは

Dim a As Variant

のいずれかになります。


Object型の方がメモリ使用量が少ないので

目的がハッキリしている現状ではObject型が正解かもしれないが

コーディングする上ではVariant型の方が型に悩まなくて済むので便利。


なお、これは実はやってみれば簡単に判ります。

Dim a As Boolean

などとエラーになりそうな指定をして実行してみる事です。

そうすれば「オブジェクト型かバリアント型でなければなりません」といわれますから・・・。

同じ事がFor Eachのヘルプに書かれていますからご一読を。

id:tomokazu0525

ありがとうございます。For Eachのヘルプ、拝読させていただきます。

2008/07/04 12:27:20
id:airplant No.2

回答回数220ベストアンサー獲得回数49ここでベストアンサー

ポイント40pt

型を指定する場合は、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)でも同じなのですが、後で分かり易くするため、デフォルトであってもプロパティは記載したほうがベターです。

id:tomokazu0525

おっしゃる通り、元のマクロは、もう一つif文をかませていました。

知りたいことをはっきりさせるために、今回転載する際に省略させていただきました。

さすがですね。

サブアドレスの記載があった場合は、上記マクロでは実行できないんでしょうか??

一度試してみます。

プロパティを記載する旨、了解しました。

勉強になります。

2008/07/04 12:36:36
  • id:SALINGER
    Variantで宣言された変数は、後の方で
    Debug.Print Typename(a)
    とかで調べれば何の型になるのかわかりますよ。
  • id:tomokazu0525
    SALINGERさん

    なるほど。そうやって学ぶテクニックがあるんですね。ありがとうございます。
  • id:airplant
    いるか、ありがとうございました。

    >サブアドレスの記載があった場合は、上記マクロでは実行できないんでしょうか??
    → サブアドレスがあっても実行できます。私の誤解でした。申し訳ありません。

    逆方向(ハイパーリンクされたセルからそのURLを取り出し)の場合は、サブアドレスは別になります。
    以前回答した次の件と混同していました。
    http://q.hatena.ne.jp/1199409445#a791281

    as objcetでもいいのですが、オブジェクトの型を明示することによって、該当オブジェクトのプロパティやメソッドが事前にチェックされ、自動で候補が表示されるというメリットがあります。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません