ユーザフォームのボタンにハイパーリンクを割当てたい

このQ&Aのポイント
  • VBAのユーザフォームでボタンにハイパーリンクを割り当てる方法について教えてください。
  • ボタン数が可変の場合、ボタンに参照アドレスのリンクをセットして、ボタンが押された時にはそのアドレスに無条件に飛んでいく方法はありますか?
  • ユーザフォームのボタンに自動的にハイパーリンクを割り当てる方法について教えてください。
回答を見る
  • ベストアンサー

ユーザフォームのボタンにハイパーリンクを割当てたい

VBAの質問になります。 ユーザフォームのボタンにハイパーリンクを割り当て、ボタンを押すとそのアドレスのHPを表示するパターンは、通常下記のようにイベントハンドラにて定義すると思いますが、 Private Sub CommandButton3_Click() If InStr(1, Range("C5"), "https://") > 0 Then ActiveWorkbook.FollowHyperlink Address:=Range("C5") End If ボタン数が可変の場合、上記イベント関数がどこまで存在するかわからない時にはxxx_clickを定義しておけません。 そのため、ユーザフォームのイニシャライズ時に、ボタンに、上記のように参照アドレスのリンクをセットして(イニシャライズの時にはボタン数がわかります)、ボタンが押された時にはその定義されたアドレスに無条件に飛んでいくようにできないものでしょうか。 (ボタンを押した際、xxx_click()の中で判断して飛ばすのではなく。xxx_click()を定義していなくても飛んでいってほしい) 方法があれば、ご教授のほどよろしくお願いいたします。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.2

> xxx_click()を定義していなくても飛んでいってほしい ということですが、xxx_click()を動的に作成するという方法でよろしければ試してみてください。 元ネタはカレンダーを探しているときに見つけたサイトのクラスを使うカレンダーです。 https://ateitexe.com/excel-vba-calendar-control/ クラスモジュールClass1に Private WithEvents Target As MSForms.CommandButton Private SetUrl As String '新しくイベントを作成する Public Sub SetCtrl(New_Ctrl As MSForms.CommandButton, ByVal mUrl As String) Set Target = New_Ctrl SetUrl = mUrl End Sub Private Sub Target_Click() If InStr(SetUrl, "https://") > 0 Then ActiveWorkbook.FollowHyperlink Address:=SetUrl Else MsgBox "対象文字列 [ " & SetUrl & " } は暗号化されたURLではありません。" & vbCrLf & "もしくはURLではありません。", vbCritical End If End Sub フォームモジュール Private mCmdButton() As Class1 Private Sub UserForm_Initialize() Dim j As Long Dim mUrl As String Me.Frame1.SetFocus Me.大外フレーム.Copy 'CommandButton1も動的にclick()作成 ------------------------- '質問にあった「ActiveWorkbook.FollowHyperlink Address:=Range("C5")」から、対象セルはC5から始まっているとして mUrl = ThisWorkbook.Sheets("Sheet1").Cells(5, "C").Value Call Make_Event(1, mUrl) '----------------------------------------------------------- For j = 1 To 10 Me.大外フレーム.Paste '中略 Me.Controls("CommandButton" & j + 1).Caption = Me.Controls("CommandButton" & j + 1).Name '動的に作成されたCommandButtonのclick()作成 ------------------------- mUrl = ThisWorkbook.Sheets("Sheet1").Cells(5 + j, "C").Value 'C5から下に続いているとして Call Make_Event(j + 1, mUrl) --------------------------------------------------------------------- Next Me.大外フレーム.ScrollHeight = Me.大外フレーム.ScrollHeight + Me.Frame1.Height * j 'j=(Past回数+1) End Sub Function Make_Event(ByVal i As Long, ByVal mUrl As String) ReDim Preserve mCmdButton(i) Set mCmdButton(i) = New Class1 mCmdButton(i).SetCtrl Me("CommandButton" & i), mUrl End Function

gge00741
質問者

お礼

いつもフォローして頂きありがとうございます。 もちろん、xxx_click()を動的に作成するという方法でも構いませんでした。 先の方のご教授にもありましたが、クラスモジュールと、動的ハンドラの割り当て方法は非常に参考になりました。 また、記載して頂いたロジックも、かなり参考になり助かりました。 ただ、ReDim Preserve など使用したこともなりものもあり、まだちょっと調査が必要です。 ありがとうございました。

その他の回答 (1)

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.1

そういう場合はクラスモジュールを使うと良いです。 下記の URLにクラスモジュールを使った電卓が紹介されています。 電卓のボタンの数だけ Clickイベントを作成しなくても良い方法で、似たような例かと思います。 https://blog.goo.ne.jp/pc_college/e/9ca2b0c452e9e691cad1dbd2783868cf

gge00741
質問者

お礼

回答ありがとうございました。 クラスモジュールと、ボタンにxxxxx_clickを動的に割り当てるやりかた等、すごく参考になりました。 電卓モジュールは、昔作成したことがありましたが、全てにとび先を設定していました。共通化できるのやり方も参考になりました。 ありがとうございました。

関連するQ&A

  • VBAでユーザーフォームを再表示させたい。

    ExcelのVBAでユーザーフォームを作成し、 Initializeイベントで初期化をし、コマンドボタンを クリックしたら処理を行うように作成しました。 ところがコマンドボタンによって処理を行った後、 再度Initializeイベントを呼びたいんです。。 (コンボボックスの表示を更新する処理を 含んでいるため) なんとかうまい方法はないでしょうか??

  • ユーザーフォームのデータ

    ユーザーファームを2つ作成しました。 そのユーザーフォームのデータを表の最終行に追加をしたいのです。 Range("A65536").End(xlUp).Offset(1,0).select を使おうと思っていますが、うまくいきません。 どなたか教えてください。 <ユーザーフォーム1> Private Sub CommandButton1_Click() Sheet2.Range("H7") = TextBox1 Sheet2.Range("I7") = TextBox2 Sheet2.Range("J7") = TextBox3 Sheet2.Range("K7") = TextBox4 Sheet2.Range("L7") = TextBox5 Sheet2.Range("P7") = TextBox6 If CheckBox1.Value = True Then Worksheets(2).Range("M7") = "0:30" Else Worksheets(2).Range("M7") = "0:00" End If If CheckBox2.Value = True Then Worksheets(2).Range("R7") = "1000" Else Worksheets(2).Range("R7") = "0" End If If CheckBox3.Value = True Then Worksheets(2).Range("S7") = "3000" Else Worksheets(2).Range("S7") = "0" End If If CheckBox4.Value = True Then Worksheets(2).Range("T7") = "1500" Else Worksheets(2).Range("T7") = "0" End If Unload Me End Sub <ユーザーフォーム2> Private Sub CommandButton1_Click() Sheet2.Range("V7") = TextBox1 Sheet2.Range("W7") = TextBox2 Sheet2.Range("X7") = TextBox3 Unload Me End Sub

  • エクセルのユーザーフォームについて

    パスワード入力用のしかけです。 ワークシートに配置したコマンドボタンを押してユーザーフォームを呼び出します。 Private Sub CommandButton1_Click() UserForm1.Show End Sub ユーザーフォームにはテキストボックスとコマンドボタンを配置しております。 テキストボックスのPasswordCharには * を設定しました。 Private Sub CommandButton1_Click() If StrConv(TextBox1.Text, vbLowerCase) = "abcd" Then MsgBox "OK!" Unload Me Else TextBox1.Text = "" TextBox1.SetFocus End If End Sub これで、ABCDまたはabcdと入力され、ユーザーフォーム上のコマンドボタンをクリックすれば、ユーザーフォームは消えます。 でも、いちいちマウスでクリックするのが面倒なのでEnterキー1回でユーザーフォームを消したいのです。 今でも、一度Enterキーを押すと、ボタンにフォーカスが移動するので、さらにEnterで消えますが、二度ではなくEnterキー1回でユーザーフォームを消すにはどうすればよいのでしょうか? ユーザーフォームは使ったことがないのでわかりません。 よろしくお願いします。

  • excel2000のvbaハイパーリンク

    excel2000のvbaユーザーフォームで ラベルをクリックしたら、ハイパーリンクで別のファイルを開くのですが、リンクが切れていた場合、リンクが切れているという風に警告してもらいたいです。 リンクさせるアドレスを、sheet1のA1セルに格納していますが、下記のままだと、リンク切れしていたばあい、エラーとなってしまいます。Private Sub テストラベル_Click()ThisWorkbook.FollowHyperlink Address:=Worksheets(”Sheet1”).Range("A1").TextEnd Subどう修正すればいいでしょうか?

  • エクセルVBA、ユーザーフォーム[×]活用法?

    いま、VBAでマクロを作成中なのですが、 ユーザーフォームの右上に存在する×ボタンの使い方がよくわかりません。 マクロのイメージは以下のとおりです。 ユーザーフォーム・オブジェクト ┌─────────────┐ │              【×】  │←この×ボタンです │                   │ │  ┌───────┐    │ │  │ Button1     │    │ Private sub Button1_Click()   ・      ・ If Button_×_click Exit sub Else ・        ・ End If End Sub ×ボタンをコマンドボタンのように動作させるイベントマクロを作成するにはどのように コーディングしたらよいのかさっぱりわからずこまっています。 どうかご回答のほどよろしくおねがいもうしあげますm( _ _ )m

  • エクセルユーザーフォームで困ってます。

    エクセル初心者です。 自分のユーザーフォーム(住所、商品登録)を作りたくて大変困ってます。 下記は、ネットなどをみて貼り付けたのですが、上手くいきません。 まずTOPページを作り、ユーザーフォームを呼び出すボタンを作り、クリックすると フォームが出るようにしてあります。 そこに、自分の入力したいものをユーザーフォームにテキストでつくり、シート9に 登録ボタンを作りクリックしたら、シートに反映させたいと思ってます。 登録ボタンを押したら、入力画面はクリアにしたいです。 他にいろいろやりたい事もあるのですが、入力した順番に001・002・003と顧客番号をつけたり 検索ボタンを作って、名前や、顧客番号を入れると情報を呼び出したり、請求書用のプリントシートや、封筒シートに簡単に反映できればと思っています。 しかし、まだまだそこまではいかず、最初でつまずいてます。 現状は、フォームを呼び出すときに実行時エラーがでます。 どうしても、自分の使い勝手のいいものを作りたいので どうか、助けてください。大変まいってます。 長文になりますが、どうかよろしくお願いします。 下記の入力中のものをみていただけて、いろいろ意見をいただけるとありがたいです。 Sub FormShow() UserForm1.Show End Sub 'Sheet9へ書き込む Private Sub 登録_Click() Dim i As Integer With Worksheets(9) 'テキストボックスの値を書き出し For i = 1 To 80 .Range("B" & i) = UserForm1.Controls("TextBox" & i).Text Next End With End Sub 'Formを呼び出したとき、Sheet9から読み込む Private Sub UserForm_Initialize() Dim i As Integer With Worksheets(9) 'テキストボックスの値を読み込み For i = 1 To 80 UserForm1.Controls("TextBox" & i).Text = .Range("B" & i) Next End With End Sub '終了ボタン Private Sub CommandButton2_Click() Unload Me End Sub

  • はじめてのユーザーフォーム

    Excel2013 ユーザーフォームの使い方をテストしているのですが、 何処が悪いのか添削して頂けると助かります。 したいこと シートに列の多い表があります(テストでは2列 名前,住所) シート上ボタンでフォームをモーダレスで表示し、 シート上セルを移動すると、該当セル行の内容を ControlSourceでフォーム(カード表示状態)に連動表示し、 こちらでは1件毎に表示して閲覧や修正をしたい。 'Sheet1上のボタン Sub ボタン1_Click() 'フォーム起動 UserForm1.Show vbModeless End Sub 'Sheet1上のスクリプト Private Sub Worksheet_SelectionChange(ByVal Target As Range) If UserForm1.Visible = True Then nr = ActiveWindow.RangeSelection.Row '現在行取得 If nr > 3 Then '3行目より上は見出し行なので無視 名前TextBox.ControlSource = Cells(nr, 1) 'エラーになります 住所TextBox.ControlSource = Cells(nr, 2) End If End If End Sub 修正ボタン押下でセルをフォーム変数へ代入するのはできたので、ControlSourceで セルと連動できれば横着できるなと… よろしくお願いします。

  • ユーザーフォーム オプションボタン について

    ユーザーフォーム内にオプションボタンを21個作っており、 Private Sub CommandButton1_Click() Dim SerchArea As Range '検索範囲(シート名指定) Set SearchArea = Sheets("1").Range(Range("A:A"), Range("A:A").End(xlDown)) '検索処理(引数:LookAt に xlWhole で完全一致 Set FoundCell = SearchArea.Find( _ What:=Me.TextBox1.Value, _ SearchOrder:=xlByRows, _ LookAt:=xlWhole, _ LookIn:=xlValues, _ MatchCase:=False) '商品コードが無い場合の処理 If FoundCell Is Nothing Then MsgBox "ありません!", vbCritical GoTo ExitHandler End If '見つかった場合の処理 With FoundCell Me.TextBox1.Value = .Offset(0, 0).Value Me.TextBox2.Value = .Offset(0, 11).Value Me.TextBox3.Value = .Offset(0, 12).Value Me.TextBox4.Value = .Offset(0, 4).Value テキストボックスにセルの値が入るようにしており、追加でオプションボタンを付けて更新としたいのですが、21個のうちどれか一つを選択して、その値をZ列に反映させたいのですが Private Sub CommandButton2_Click() With FoundCell .Offset(0, 13).Value = Me.TextBox20.Value .Offset(0, 4).Value = Me.TextBox4.Value .Offset(0, 5).Value = Me.TextBox5.Value ここの追加でオプションボタンを設定するにはどうすれば良いでしょうか?

  • EXCEL VBAのユーザーフォームに引数を渡す方法について

    すいません、EXCEL VBAのユーザーフォームに引数を渡す方法についてご質問があります。 シート上にコマンドボタンを2つ用意する。 コマンドボタン1を押すと変数mは1 コマンドボタン2を押すと変数mは2 としてユーザーフォームを呼び出す。 Public m As Integer Private Sub CommandButton1_Click()  m = 1  Call フォーム呼び出し(m) End Sub Private Sub CommandButton2_Click()  m = 2  Call フォーム呼び出し(m) End Sub Sub フォーム呼び出し(m As Integer)  UserForm1.Show End Sub 次にユーザフォームにコマンドボタンを1個置き、 ボタンを押したとき、mが1であれば「ボタン1」 mが2であれば「ボタン2」 とメッセージボックスを出し、ユーザーフォームを閉じる。 Private Sub CommandButton1_Click()   If m = 1 Then    MsgBox "ボタン2"   ElseIf m = 2 Then    MsgBox "ボタン2"   End If  Unload UserForm1 End Sub プロシージャ間の引数渡しは色々なテキストに載っているのですが ユーザーフォームに引数を渡す方法はどうも見つからず、 Private Sub CommandButton1_Click(m) としても、コンパイルエラーとなってしまいます。 よろしくご教示をお願いいたします。

  • 複数のユーザーフォームをコマンドボタンにて表示・非表示させるには

    VBA勉強中のものです。 複数のユーザーフォームをコマンドボタンを使用して画面への表示切替を考えております。 例)ユーザーフォーム1,ユーザーフォーム2,ユーザーフォーム3のそれぞれにコマンドボタン1,コマンドボタン2,コマンドボタン3を作成し、   コマンドボタン1→ユーザーフォーム1を表示   コマンドボタン2→ユーザーフォーム2を表示   コマンドボタン3→ユーザーフォーム3を表示 とするようなことを考えおります。  そこで、下記のようにコードを作成したのでですが,一度表示させたユーザーフォームを再度表示させようとコマンドボタンをクリックしたら、「フォームはすでに表示させているのでモーダル表示はできません」とエラーがでてしまいます。   どなたか、どのようにしたらいいかご教授ねがいます。 サンプルコード) --------------------------------------------------- 'UserForm1のコード Private Sub CommandButton2_Click() Call UserForm2_show UserForm1.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm1.Hide End Sub ---------------------------------------------------- 'UserForm2のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm2.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm2.Hide End Sub ------------------------------------------------------- 'UserForm3のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm3.Hide End Sub Private Sub CommandButton2_Click() Call UserForm2_show UserForm3.Hide End Sub ------------------------------------------------------------ '標準モジュール コード Sub UserForm1_show() UserForm1.Show End Sub Sub UserForm2_show() UserForm2.Show End Sub Sub UserForm3_show() UserForm3.Show End Sub

専門家に質問してみよう