No.5ベストアンサー
- 回答日時:
#4です。
不具合の件ですが、Excel97ではシートに貼り付けたActiveXコマンドボタンを押した瞬間にアクティブセルを見失ってしまうんです。
Private Sub CommandButton1_Click()
Dim r As Long
r = Range("A1").CurrentRegion.Rows.Count
End Sub
これ、エラーになっちゃいます。
いやーこれにははまりました。
ボタンを押した瞬間にフォーカスがボタンに移ってしまい、アクティブセルがない状態、すなわち「どのセルも選択されていない状態」になってしまう。
なので、
Private Sub CommandButton1_Click()
Dim r As Long
ActiveCell.Activate
r = Range("A1").CurrentRegion.Rows.Count
End Sub
なんていうヘンなコードを書く必要があります。
Excel2000からは解消された不具合みたいですけどね。
まぁ最近は目立った不具合にぶち当たっていませんが、Public Subプロシージャを実行するだけなら、それこそオートシェイプでも良いわけで、フォームのコマンドボタンは使いますが、ActiveXコマンドボタンは使っていません。
ツールバーの件。自動的に開業された部分は直してください。ThisWorkbookのコードモジュールに記述します。
Private Sub Workbook_Open()
Dim myCmdBar As CommandBar
Dim myCtrl As CommandBarButton
' ツールバーを作成
Set myCmdBar = Application.CommandBars.Add(Name:="Hoge", Temporary:=True)
With myCmdBar
.Visible = True
.Position = msoBarTop
End With
' 読み込みボタン
Set myCtrl = myCmdBar.Controls.Add(Type:=msoControlButton)
With myCtrl
.Caption = "読み込み"
.Style = msoButtonCaption
.OnAction = "ReadDataFile"
End With
' 仕訳ボタン
Set myCtrl = myCmdBar.Controls.Add(Type:=msoControlButton)
With myCtrl
.Caption = "データ仕訳"
.Style = msoButtonCaption
.OnAction = "JournalizeData"
End With
Set myCtrl = Nothing
Set myCmdBar = Nothing
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
' マクロブック終了時にツールバーを削除する
On Error Resume Next
Application.CommandBars("Hoge").Delete
End Sub
Private Sub Workbook_Activate()
' マクロブックがアクティブならツールバーは有効
On Error Resume Next
Application.CommandBars("Hoge").Enabled = True
End Sub
Private Sub Workbook_Deactivate()
' 他のブックがアクティブならツールバーは無効
On Error Resume Next
Application.CommandBars("Hoge").Enabled = False
End Sub
このブックが開かれると同時に独自のツールバーを作成し、コマンドボタンを2つ作成します。
ボタンのOnActionプロパティにはクリック時に実行させたいPublic Subプロシージャの名前を記入します。
Excel上で手作業でツールバーを作成するとそのツールバーは次回Excel起動時にも残っていますが、 Temporary:=True とすることでツールバーがExcelに記録されず、Excel終了時に自動的に削除されます。
まぁこの例ではブック終了時に明示的にツールバーを削除していますが、これは同時に別の目的で別のブックを開いていた場合の対処です。マクロのブックを閉じてもツールバーだけ残ってしまうのを防ぐためです。
それと、マクロのブックがアクティブになった時と他のブックがアクティブになった時にツールバーの有効・無効をコントロールしています。
うぉぉぉぉぉぉぉーーーーーっ!!!
私は今、言葉では言い尽くせないほど感激しています!!
たいへんすばらしいぃ!!!
どーーもありがとうございますっ!!!
うぉぉぉぉぉぉぉーーーーーっ!!!
感動です!!感激です!!感謝です!!
No.4
- 回答日時:
フォームのコントロールは旧来のコントロールです。
ツールボックスのコントロールはActiveXコントロールです。
フォームのコントロールにはコードを記述できません。
ですのでイベント処理を記述することができません。
多少のプロパティしかありません。
マクロ(Public Subプロシージャ)を呼び出すことぐらいしかできません。(一部のコントロールは自身が持つ機能の範囲で特殊な動作をしますが)
ツールボックスのコントロールはイベント処理を記述できます。
イベント処理を記述できるということはイベント内で完結する処理を記述することもできますし、「Public Sub」を呼び出す以外にも、Public Functionや、同じモジュール内のSubやFunction、他のユーザーフォームなどを呼ぶこともできます。
各種プロパティを設定できます。
私の使い分けですが、シート上に必要なコントロールの種類とその機能によって全体をセットで使い分けています。
単にPublic Subを呼び出すだけならフォームのコントロールを置いて「マクロの登録」でPublic Subを指定します。
応用として、ExcelのShapeオブジェクト(オートシェイプ)もマクロの登録ができますから、ボタンのように「押したよ」という視覚的な効果が必要じゃない場合はオートシェイプで華やかにすることもできます。
コンボボックスの内容を動的に変える必要があれば、その他のコントロールもActiveXコントロールを使用します。
ただし私の場合はシート上にActiveXコントロールを置くのは不具合の原因になったりすることもあり、あまり好きではありません。
最近はなるべくBook起動時にToolBarをテンポラリで作成し、そこに必要なコントロールを配置するようにしています。
この回答への補足
ご回答ありがとうございますっ!!!
シート上にActiveXコントロールを置くとどんな不具合になるんですか?
ということはなるべくフォームのボタンを使ったほうがよいのでしょーか??
?????
ToolBarをテンポラリで作成しコントロールを配置するのはどのようにすればよいのでしょーか??
??????
よろしくおねがいしますうっ!!
No.3
- 回答日時:
私も貴殿の質問に近いことをずっと疑問に思っていました。
聞く人もなく、説明した本にも出会わず、今日もTextBoxXのXの相対化の質問が載り、色々やっていて頭から離れません。実はVBAなどの本の最初の辺りに、オブジェクトの体系図(
四角で囲んだオブジェクトから四角で囲んだサブオブジェクト
がぶら下っている図)が載っています。ほとんど詳しく述べられず、初心者には載っているだけのようですが、意外に重要なことを物語っているのではないかと思っています。コントロールも2箇所以上にぶら下っているところがあると思います。
エクセルのシステムプログラムに、コントロールを定義するプログラム(=オブジェクト。オブジェクトとプロパティとメソッドのセット)が2つ以上あって、少しそれらの間で差があるのだと思います。どちらを呼び出すのかは、どのツールバーをクリックして呼び出すかの操作と直結していると思いますが、どれがどれを呼ぶのか説明した
本をみたことはありません。
またExcel5.0->Excel95->Excel97
->Excel2000->Excel2002と改訂されていますが、その都度一部ですが、オブジェクトの体系図の構成が変更になったり、追加は勿論、移し変えもあるようです。
すなわちエクセルのシステムプログラムが構成を変えているのでしょう。
従来のアプリ・プログラムはそのまま動くようにマイクロソフトは考えるので、従来分も残されていることが多いでしょう。それで複雑になっているのだと思います。
最後に私は、確信は持てませんが
(1)ActiveXコントロール(WEBがらみ)
(2)OLEコントロール
(3)Shapes
の3つがあるのではと思っています。どなたか批判して教えて下されば幸いです。
またコントロールを貼りつける(埋め込む)ことが出来る「台紙」に当たるものは、WorksheetsやChartsやFormsなどがあり、「コンテナ」と言うのではないかと思います。そしてラベルの中にはボタンを貼りつけられませんが、その点ではフォームなどは特別なオブジェクトなわけです。
Excel5.0にはModuleというWorkSheet
と同列のものがあり、Dialog1などにコントロールを載せていました。それは95でVBE画面が出来るとSheetとFormに移行したようです。
下記はすべて動きます。同じSheet1上のTextBox1に対してです。なぜこんなに違うのか判りません。
Sub text04()
Dim sh As Worksheet
Set sh = Worksheets("sheet1")
MsgBox Worksheets("sheet1").TextBox1.Name
MsgBox sh.TextBox1.Name
End Sub
Sub test05()
MsgBox Worksheets("sheet1").Shapes("TextBox1").Name
End Sub
Sub test06()
MsgBox Worksheets("sheet1").OLEObjects("textbox1").Name
MsgBox Worksheets("sheet1").OLEObjects("textbox1").Top
End Sub
Sub text03()
For i = 1 To 2
tb = "TextBox" & i
MsgBox Worksheets("sheet1").DrawingObjects(tb).Left
MsgBox Worksheets("sheet1").DrawingObjects(tb).Name
MsgBox Worksheets("sheet1").DrawingObjects(tb).Index
Next i
End Sub
●ある本の記述を今偶然見つけました。「フォームツールバーの部品はExcel95以前のバージョンで作成したワークシートとの互換を保つために用意されたもので、通常は使用しません。」X-Media社SuperMaster。Excel2000/2002VBA。P13。
No.2
- 回答日時:
下にも書いてありますが、
1.コードの記述場所
2.イベントへの対応
3.シート以外の貼り付け先
4.プロパティやメソッド
が違いでしょうか。
個人的にはほとんどコントロールツールボックスのコントロールしか使いません。
状況によって、フォームツールバーのボタンなどを使います。(理由としては、コードが簡単に書けることがあります)
次に詳しく説明されています。
VBA入門者の”どっち?”・・・フォームツールバー or コントロールツールボックス(1)
http://www.moug.net/cgi-bin/technic.cgi?exvba+TI …
VBA入門者の”どっち?”・・・フォームツールバー or コントロールツールボックス(2)
http://www.moug.net/cgi-bin/technic.cgi?exvba+TI …
No.1
- 回答日時:
素人考えで申し訳ありませんが、
(1)フォームの場合はエクセルに依存したものだと思います。昔Excel95などVBAがなかったころはエクセル上で動作していたからです。
(2)コントロールツールボックスの場合はVBAに依存したものだと思います。VBAなのでいろんな設定ができる点が魅力だと思います。
複雑な処理をさせたいときはコントロールツールボックスより使用した方がいいと思います。
後はプロの方にお任せします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カメラスクロールするのを動画...
-
excel vbaでユーザーフォームに...
-
excelのリストボックスで選択し...
-
Excelで、コンボボックスで選択...
-
ACCESS2010のVBAでフォーム内ク...
-
コントロールの絶対位置を取得...
-
エクセルVBAユーザーフォーム・...
-
VBAでタブのページを削除す...
-
キンドルでの購入が親にバレな...
-
C言語による「テキストファイル...
-
JavaScriptからVBAの関数を呼び...
-
優しくされると甘えて調子に乗...
-
EXCEL VBA リストビューの項...
-
現代文読解力開発講座の問題です。
-
wsock32.dllによるconnectのtim...
-
With~EndWithの省略部分と引数...
-
VC++6.0 MFC 日時指定コントロ...
-
カレンダーコントロールの使用...
-
トグルボタン一部を一度にON OF...
-
もしフォームヘッダーにコント...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カメラスクロールするのを動画...
-
エクセル・VBA CheckBoxのオブ...
-
エクセルVBAでオプションボタン...
-
vb.netで画面のコントロールId...
-
ExcelVBAでListViewが使用できない
-
EXCELでactivexコントロールを...
-
コントロールを移動できない
-
フォーム上の現在アクティブな...
-
ユーザーフォームで動的(Me.Con...
-
ListViewのチェックボックスに...
-
C#で角が丸いテキストボックス
-
エクセル コントロールツール...
-
VBAのフォームでTextBoxがいっ...
-
Excel VBA で Richtextboxを使...
-
VBA ユーザーフォームの Keypre...
-
Groupboxの配下のコントロール...
-
ACCESS2010のVBAでフォーム内ク...
-
chr関数の呼び出しで「プロ...
-
vba dbcommand button activex ...
-
With~EndWithの省略部分と引数...
おすすめ情報