Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2179 / 13645 ツリー ←次へ | 前へ→

【69506】コマンドボタンから各シートへ がんば 11/7/25(月) 14:56 質問[未読]
【69507】Re:コマンドボタンから各シートへ ichinose 11/7/25(月) 17:27 発言[未読]
【69513】Re:コマンドボタンから各シートへ がんば 11/7/26(火) 11:30 質問[未読]
【69514】Re:コマンドボタンから各シートへ ichinose 11/7/26(火) 21:11 発言[未読]
【69528】Re:コマンドボタンから各シートへ がんば 11/7/28(木) 16:49 質問[未読]
【69529】Re:コマンドボタンから各シートへ neptune 11/7/28(木) 18:04 発言[未読]
【69530】Re:コマンドボタンから各シートへ ichinose 11/7/28(木) 20:52 発言[未読]
【69533】Re:コマンドボタンから各シートへ がんば 11/7/29(金) 9:37 お礼[未読]

【69506】コマンドボタンから各シートへ
質問  がんば E-MAIL  - 11/7/25(月) 14:56 -

引用なし
パスワード
   たぶん初歩のVBAかもしれませんが、ぜひ覚えたいのでご教示お願いいたします。
一つのファイルにシート数が11枚あります。一番最初のファイルが目次。2番目からはNo.1〜No.11までの名前がつけてあります。
目次のシートにはコマンドボタンが11個(No.1〜No.11)作ってあり、一つのボタンをクリックするとそれぞれのシートに飛ぶようにマクロが記入してあります。つまりマクロが11個あります。
 これをボタンを押して目的のファイルに飛ぶのは同じですが、一つのマクロにしたいのですが・・・・

【69507】Re:コマンドボタンから各シートへ
発言  ichinose  - 11/7/25(月) 17:27 -

引用なし
パスワード
   こんにちは。

>たぶん初歩のVBAかもしれませんが、ぜひ覚えたいのでご教示お願いいたします。
>一つのファイルにシート数が11枚あります。
>一番最初のファイルが目次。2番目からはNo.1〜No.11までの名前がつけてあります。
ということは、シートは、11枚ではなく、12枚ですよね!!

>目次のシートにはコマンドボタンが11個(No.1〜No.11)作ってあり、一つのボタンをクリックするとそれぞれのシートに飛ぶようにマクロが記入してあります。
出来ているコードの提示は、必須条件だと考えてください。

>これをボタンを押して目的のファイルに飛ぶのは同じですが、一つのマクロにしたいのですが・・・・
ボタンは、何を使っていますか?
1 Excelコントロール(コマンドバー フォームの ボタン)ですか?
2 それともActiveXControl(コマンドバーコントロールツールボックスのコマンドボタン)ですか?

シートに貼り付けるボタンなら、1のボタンにしてください。
この場合、コードは標準モジュールに記述します。

Sub btnclick()
  If TypeName(Application.Caller) = "String" Then
    MsgBox Application.Caller
    MsgBox ActiveSheet.Buttons(Application.Caller).Caption & "が押された"
  End If
end sub

それぞれのボタンの全てに上記のbtnclickを登録して試してみてください。

【69513】Re:コマンドボタンから各シートへ
質問  がんば E-MAIL  - 11/7/26(火) 11:30 -

引用なし
パスワード
   ▼ichinose さん:
>こんにちは。
>
>>
>ということは、シートは、11枚ではなく、12枚ですよね!!
おっしゃる通りです。ごめんなさい

>>目次のシートにはコマンドボタンが11個(No.1〜No.11)作ってあり、一つのボタンをクリックするとそれぞれのシートに飛ぶようにマクロが記入してあります。
>出来ているコードの提示は、必須条件だと考えてください。
>Sheets("No.1 ").Selectとういマクロが各ボタンに登録してあるだけなのです。
シート数が増えるとそれだけ同じようなマクロが並ぶだけなので、スマートにしたいと思っています。
>>>ボタンは、何を使っていますか?
>1 Excelコントロール(コマンドバー フォームの ボタン)ですか?
>2 それともActiveXControl(コマンドバーコントロールツールボックスのコマンドボタン)ですか?
>ツールバーのフォームのボタンです。コントロールツールボックスのコマンドボタンではありません。
>シートに貼り付けるボタンなら、1のボタンにしてください。
>この場合、コードは標準モジュールに記述します。
>
>Sub btnclick()
>  If TypeName(Application.Caller) = "String" Then
>    MsgBox Application.Caller
>    MsgBox ActiveSheet.Buttons(Application.Caller).Caption & "が押された"
>  End If
>end sub
>
>それぞれのボタンの全てに上記のbtnclickを登録して試してみてください。
標準モジュールに記録して、まずNo.1のボタンに登録してやってみましたが、
No.1が押されました で停止してしまいました。
ほとほと困ってます。教えて下さい。

【69514】Re:コマンドボタンから各シートへ
発言  ichinose  - 11/7/26(火) 21:11 -

引用なし
パスワード
   >>Sheets("No.1 ").Selectとういマクロが各ボタンに登録してあるだけなのです。
>シート数が増えるとそれだけ同じようなマクロが並ぶだけなので、スマートにしたいと思っています。
そのためにApplication.Callerというプロパティをご紹介しました。


>>Sub btnclick()
>>  If TypeName(Application.Caller) = "String" Then
>>    MsgBox Application.Caller
>>    MsgBox ActiveSheet.Buttons(Application.Caller).Caption & "が押された"
>>  End If
>>end sub

>まずNo.1のボタンに登録してやってみましたが、
>No.1が押されました で停止してしまいました。
>ほとほと困ってます。

提示したコードは、Application.Caller使えば、どのボタンが押されたのか
知ることが出来ますよ という例として提示したものであり、
そのままご希望の仕様になっているコードではありません。
最近は、そういうコードは極力投稿しないようにしています。

前回投稿でも
>それぞれのボタンの全てに上記のbtnclickを登録して試してみてください。

複数のボタンに上記のマクロを登録し、表示内容の違いを考察してください。
その違いは、何が原因なのか が理解できれば方法は見えてきます。

【69528】Re:コマンドボタンから各シートへ
質問  がんば E-MAIL  - 11/7/28(木) 16:49 -

引用なし
パスワード
   ▼ichinose さん:

>
>複数のボタンに上記のマクロを登録し、表示内容の違いを考察してください。
>その違いは、何が原因なのか が理解できれば方法は見えてきます。
暖かいアドバイスありがとうございます。ub btnclick()
  Dim BTN As String
  
  If TypeName(Application.Caller) = "String" Then
  
   MsgBox Application.Caller
    MsgBox ActiveSheet.Buttons(Application.Caller).Caption & "が押された"
  
     BTN = ActiveSheet.Shapes(Application.Caller). _
    TextFrame.Characters.Text
  
   Sheets(BTN).Select
  
  End If
End Sub
悪戦苦闘の末、何とか動くようになりました。
お礼の返信をすべきなのですが、
BTN = ActiveSheet.Shapes(Application.Caller). _
    TextFrame.Characters.Text
の意味を知りたくて、質問にしました。
後、何かアドバイスはありますか。
おんぶにだっこで申し訳ありません。

【69529】Re:コマンドボタンから各シートへ
発言  neptune  - 11/7/28(木) 18:04 -

引用なし
パスワード
   ▼がんば さん:
ichinose さんではないですが、

>BTN = ActiveSheet.Shapes(Application.Caller). _
>    TextFrame.Characters.Text
>の意味を知りたくて、質問にしました。
結局わかったのかな?

>後、何かアドバイスはありますか。
上記の例でいうと例えばTextFrameの上にカレットを持って行って
F1を押すと、TextFrameのHelpが表示されます。そこからリンクを
たどっていくと、Charactersがなんであるか、Textがなんであるかすべて
解説されています。
その解説をきちんと読みましょう。
読んでわからなければ、その点を質問すると理解が早くなります。

と、偉そうにいう私もhelpなしではコードは書けません。
恐らく多くの方がそうだと思います。それくらいhelpは重要なんです。

逆にHelpを見ない人はいつまでたっても自分が何をやっているかが
系統だって理解できず、当然スキルは上がりません。

【69530】Re:コマンドボタンから各シートへ
発言  ichinose  - 11/7/28(木) 20:52 -

引用なし
パスワード
   以下のコードをボタンに登録し対象ボタンをクリックしてみてください。


Sub btnClick()
  If TypeName(Application.Caller) = "String" Then
    MsgBox ActiveSheet.Buttons(Application.Caller).Caption
    MsgBox ActiveSheet.Buttons(Application.Caller).Text
    MsgBox ActiveSheet.Shapes(Application.Caller). _
                  TextFrame.Characters.Text
    MsgBox ActiveSheet.Shapes(Application.Caller).OLEFormat.Object.Caption
    MsgBox ActiveSheet.Shapes(Application.Caller).OLEFormat.Object.Text
    MsgBox ActiveSheet.Shapes(Application.Caller).DrawingObject.Caption
    MsgBox ActiveSheet.Shapes(Application.Caller).DrawingObject.Text
   End If
End Sub
7つの記述全てが対象のボタンに表示されている文字列を表しています。

よって、提示されたコードの

    BTN = ActiveSheet.Shapes(Application.Caller). _
    TextFrame.Characters.Text
    Sheets(BTN).Select


この箇所は、

    BTN = ActiveSheet.Buttons(Application.Caller).Caption
    Sheets(BTN).Select

としても同じです。

一つのデータを取得するのに複数の記述方法がある場合があります。
 

>BTN = ActiveSheet.Shapes(Application.Caller). _
>    TextFrame.Characters.Text
>の意味を知りたくて、質問にしました。
Excel95以前は、
ボタンを扱う場合は、ActiveSheet.Buttons というオブジェクトを通して
ボタンの操作を行ってきました。

Excel97以降に新しくShapeという図形全体を表すオブジェクトが登場し、
このShapeオブジェクトのプロパティを取得していくことで
全ての図形(コントロールを含めて)の操作が可能になりました

Shapeオブジェクトの登場で機能も新しく追加された(様々な設定できめ細かい指定が可能)のですが、

使いにくい点もあります。
ActiveSheet.Shapes(Application.Caller). _
    TextFrame.Characters.Text

ActiveSheet.Buttons(Application.Caller).Caption

ボタンにある文字列を取得するのに記述がShapeは長いよね!!


実際には、旧オブジェクトとShapeをTPOによって、使い分けることが良いと思います。
どのように使い分けるかは、経験です。

TextFrameは、文字列を含んだ図形の表示レイアウトに関する情報・設定が
行えるオブジェクトですが、詳細は、Helpで調べてください。

【69533】Re:コマンドボタンから各シートへ
お礼  がんば E-MAIL  - 11/7/29(金) 9:37 -

引用なし
パスワード
   ▼ichinose さん:
 neptune さん:

ありがとうございました。F1の存在も知らない初心者であることがよくわかりました。
ichinose さんの方法もファイルのコピーでやってみました。ずっと参考書にしたいと思います。
この後は、エラー処理を何とかした追加し、希望通りのファイルにしたいと考えています。
大変 助かりました。

2179 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free