VBA練習問題
VBA100本ノック 76本目:ボタンの表示名の位置へ移動

VBAを100本の練習問題で鍛えます
最終更新日:2021-02-22

VBA100本ノック 76本目:ボタンの表示名の位置へ移動


シートのフォームコントロールのボタン表示文字の位置へ移動する問題です。


ツイッター連動企画です。
ツイートでの見やすさを考慮して、ブック・シート指定等を適宜省略しています。

VBAテスト用のサンプルデータは、VBA100本ノックの目次ページ からもダウンロードできます。
マクロVBAを初心者向けの基本から上級者向けの高度な内容までサンプルコードを掲載し解説しています。エクセル関数・機能・基本操作の入門解説からマクロVBAまでエクセル全般を網羅しています。


出題

出題ツイートへのリンク

#VBA100本ノック 76本目
フォームコントロールのボタンに登録するSubを作成。
ボタン表示文字を判定し下記パターン位置へ移動します。
・シート名!セル番地 → シートのセルへ
・シート名 → シートへ
・名前定義 → ブック範囲の名前定義へ
※名前定義よりシート名を優先
移動先なしはメッセージ表示

マクロ VBA 100本ノック


サンプルファイルです。
https://excel-ubara.com/vba100sample/VBA100_76.xlsm
https://excel-ubara.com/vba100sample/VBA100_76.zip


VBA作成タイム

この下に頂いた回答へのリンクと解説を掲載しています。
途中まででも良いので、できるだけ自分でVBAを書いてみましょう。


他の人の回答および解説を見て、書いたVBAを見直してみましょう。


頂いた回答

解説

まずは押されたボタンを取得しなければなりません。
これを取得するには、
Application.Caller
これを使います。
ユーザー定義関数ならRangeが入ってくるので判定したりしますが、今回は無くても良いと思います。
Application.Gotoを使っていますが、"!"で分割してSelectでも良いです。

Sub VBA100_76_01()
  '今回の場合は考慮しなくても良いですが
  If TypeName(Application.Caller) <> "String" Then Exit Sub
  
  '呼び出し元のボタンの文字列
  Dim sCaller As String
  sCaller = ActiveSheet.Shapes(Application.Caller).TextFrame.Characters.Text
  
  'シートのセル指定
  On Error Resume Next
  If sCaller Like "*!*" Then
    Application.Goto Range(sCaller)
    If Err.Number = 0 Then Exit Sub
  End If
  
  'シート指定
  On Error Resume Next
  Sheets(sCaller).Select
  If Err.Number = 0 Then Exit Sub
  
  '名前定義
  On Error Resume Next
  Application.Goto Range(sCaller)
  If Err.Number = 0 Then Exit Sub
  
  MsgBox "ボタン名称が正しくありません。"
End Sub

Sub VBA100_76_02()
  '今回の場合は考慮しなくても良いですが
  If TypeName(Application.Caller) <> "String" Then Exit Sub
  
  '呼び出し元のボタンの文字列
  Dim sCaller As String
  sCaller = ActiveSheet.Buttons(Application.Caller).Caption
  
  On Error Resume Next
  Dim obj As Object
  
  'シートのセル指定
  If sCaller Like "*!*" Then Set obj = Range(sCaller)
  
  'シート指定
  If obj Is Nothing Then Set obj = Sheets(sCaller)
  
  '名前定義
  If obj Is Nothing Then Set obj = Application.Range(sCaller)
  
  Err.Clear
  If TypeName(obj) = "Range" Then
    Application.Goto obj
  Else
    obj.Select
  End If
  
  If Err Then MsgBox "ボタン名称が正しくありません。"
End Sub


2通り書いてみましたが、お好みでどちらでも。
普通無いと思いますが、ふと思ったのは、
"Sheet2!B2"というようなシートも作成できてしまうので、これは判断できないと思いました。
特に補足はありません。記事にはVBAコードを掲載しました。


補足

補足はありません。


サイト内関連ページ

第136回.フォームコントロール
リボンの開発タブにコントロールの挿入があります。フォームコントロールをVBAで扱う場合の解説になります。ワークシートでフォームコントロールを扱う事の是非はありそうですが、使用することで便利かつ見栄えの良いシートになる場合もあります。
第137回.ActiveXコントロール
リボンの開発タブにコントロールの挿入があります。ActiveXコントロールをVBAで扱う場合の解説になります。ワークシートでActiveXコントロールを扱う事の是非はありそうですが、使用することで便利かつ見栄えの良いシートになる場合もあります。
ボタンのテキスト名のシートへ移動(Application.Caller)
メニューのシートを作成して、ボタンを配置、そしてボタンにより指定シートに移動する。よくありますが、ボタン一つずつに別々(移動先のシート毎に)のマクロを作成するのは面倒です、そこで、一つのマクロで済ませる方法の紹介です。Application.Caller Application.Callerは、VBAを呼び出した方…




同じテーマ「VBA100本ノック」の記事

73本目:新規ブックにボタン作成しマクロ登録
74本目:1シート複数表をDB形式に変換
75本目:ログインフォームの作成
76本目:ボタンの表示名の位置へ移動
77本目:シート挿入イベント
78本目:グラフのデータ範囲拡張
79本目:Wordにセル範囲を図として挿入
80本目:読み取り専用で保存できないブックにする
81本目:全フィルターの絞り込解除
81本目:全フィルターの絞り込解除
82本目:ブックのドキュメントプロパティを取得


新着記事NEW ・・・新着記事一覧を見る

エクセル馬名ダービー|エクセル雑感(2021-07-21)
在庫を減らせ!毎日棚卸ししろ!|エクセル雑感(2021-07-05)
日付型と通貨型のValueとValue2について|エクセル雑感(2021-06-26)
DXってなんだ? ITと何が違うの?|エクセル雑感(2021-06-24)
エクセルVBA 段級位 目安|エクセル雑感(2021-06-21)
ローカル版エクセルが「Office Scripts」に変わる日|エクセル雑感(2021-06-10)
新関数SORTBYをVBAで利用するラップ関数を作成|VBA技術解説(2021-06-12)
VBA今日のひとこと/VBA今日の教訓 on Twitter|エクセル雑感(2021-06-10)
VBAの演算子まとめ(演算子の優先順位)|VBA技術解説(2021-06-09)
画像が行列削除についてこない場合の対処|VBA技術解説(2021-06-04)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.Excelショートカットキー一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.RangeとCellsの使い方|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.マクロって何?VBAって何?|VBA入門
7.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
8.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
9.セルに文字を入れるとは(Range,Value)|VBA入門
10.とにかく書いてみよう(Sub,End Sub)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ