電子書籍の厳選無料作品が豊富!

エクセルVBA:全部のコマンドボタンに反映させる方法。


コマンドボタンにVBAを記述してフォルダを開いたり、
ブラウザを立ち上げたりしています。

現在の状態ですと、
そのコマンドボタン毎にwithの記述をしています。

ボタンが十個ある場合、↓の文を10回書いています。

Dim ooo as worksheet

set ooo = Thisworkbook.worksheets("test")
with ooo

***中身の記述

end with



これを10回かかずに、1回どこかに記述するだけで
全てのボタンに反映させる方法はありませんか?

public sub で記入して
callで呼び出しても

end with で終わってしまうため、
.cell(*.*)が使えなくて困っています・・・

宜しくお願いします。

A 回答 (6件)

あくまでも、一般論ですが、最近、OkWaveで同じパターンの質問が増えてきたようですが、それで、質問が成立するのか、私には分からなくなってきました。

何か典型的な質問パターンなので、少し様子を見させていただいています。

>Dim ooo as worksheet
>set ooo = Thisworkbook.worksheets("test")
>with ooo
>
>***中身の記述
end with

>.cell(*.*)が使えなくて困っています・・・

 カッコの中は、,(カンマ)であるのはいいとしても、実際の問題は何なのか良く分からないのです。使えないって、
With Worksheets("Test")
 MsgBox .Cells(1,1).Value
End With

で問題があるわけないし、まさか、こんなことで、Public じゃなくて、グローバル変数や変数をモジュールスコープにしてやる必要なんて、よほど凝ったコード(または、バカの一つ覚え)でなくてはしませんね。

Public objSh As Worksheet

Sub Test1()
Set objSh = ThisWorkbook.Worksheets("Test")
 Call Test2
Set objSh = Nothing
End Sub

Sub Test2()
 MsgBox objSh.Cells(1,1).Value
End Sub

こういうのは、間が抜けています。人にもよりますが、通常、こうしたオブジェクトをグローバル化しないはずです。

Sub Test1R()
 Worksheets("Test").Select
 Call Test2
End Sub

Sub Test2R()
 MsgBox Cells(1,1).Value
End Sub

単に、こうすればよいだけです。
そもそも、こんなコードなら、Call するか、ということを突っ込まれてしまいます。

Test2Rは、エラーが発生するというのは、少し、認識不足で、それは、モジュールの問題です。標準モジュールを使うということで良いわけです。

おそらく、ここの質問者の質問パターンとしては、自分が認めるコード以上は内容をみせないだろうから、こんな所しか言えません。OkWaveの回答者をみれば、半分以上は、素人コードを出しているのだから、必要以上に隠す必要はないとは思うのです。中には、他人のコードでエラー回避さえ、気に入らないという人たちもいるのですから、その回答者の実力は何をかいわんやというところです。

しかしながら、よかったら、全体の見せられるところ、エラーが出る所ぐらいは見せてほしいものです。

でも、本質的に、こんな問題ではないと思うのです。

>これを10回かかずに、1回どこかに記述するだけで
>全てのボタンに反映させる方法はありませんか?
たぶん、コード全体を見れば、教えることは出来るだろうと思います。しかし、それは、ご質問者さんからしたら、遥か上の技術という可能性があるということだと思うのです。それさえも、ちょっとした技術の応用で、簡単にクリアする可能性もあります。とはいえ、たかだか、数十行を省略したところで、この場合は、全体には変化ないだろうから、現状の技術で可能なら、それはそれとして使う方法もアリだと思うのです。高望みしても、高値の花ということもありますしね。
    • good
    • 0

ちょと分かりにくい質問であることは確かです。

。。(^^;;;

>全てのプロシージャに
> Dim ooo as worksheet
> set ooo = Thisworkbook.worksheets("test")
> with ooo
> end with
>を反映させたいです。

これは、10個のボタンにはそれぞれの機能があるが、
上記の部分は共通しているのでひとつにしたい
ということですか? ですね?

であれば、質問者の試した、

>public sub で記入して、callで呼び出し

でいいと思うのですが、

>end with で終わってしまうため、
>.cell(*.*)が使えなくて困っています・・・

これ、具体例が挙げてないのでよく分かりません。
この部分をも少し具体的に補足してみたらどうでしょう。


共通部分を共通部分というプロシージャにして。。。
下記は全てボタンの配置してあるシートのシートモジュールに書く。

'--------------------------------
Private Sub 共通部分()
  Dim ooo As Worksheet
  Set ooo = ThisWorkbook.Worksheets("test")
  With ooo
    *************
  End With
End Sub
'----------------------------------------
'----------------------------------------
Private Sub CommandButton1_Click()
  Call 共通部分
  ボタン【1】の固有コード
End Sub
'---------------------------------
Private Sub CommandButton2_Click()
  Call 共通部分
  ボタン【2】の固有コード
End Sub
'---------------------------------
   ●以下同様。。。。
'---------------------------------

但し、共有する変数はモジュール変数にするか、
Callするときの引数にすること。
以上です。
 
    • good
    • 0

Dim ooo as worksheet


set ooo = Thisworkbook.worksheets("test")
with ooo
end with

この4行をコマンドボタン毎に書いているのでなんとかしたいということでしょうか。
たった4行ぐらい全部のコマンドボタンに書いてもたいしたことはないと思うのですが。

どうしてもまとめたいのであれば、
プロシージャを1つにまとめて、各コマンドボタンからそれを呼ぶという方法ではどうですか。
ただ、各ボタンの処理が長いとかえって分かりにくくなります。
こんなことするよりは、ボタンごとに記述したほうが分かりやすいでしょう。

ステップ数の多さよりも読みやすさを重視したほうがいいですよ。

Sub ボタン1_Click()
Call ボタン処理(1)
End Sub

Sub ボタン2_Click()
Call ボタン処理(2)
End Sub

Sub ボタン処理(n As Integer)
Dim ooo as worksheet
set ooo = Thisworkbook.worksheets("test")
with ooo
 Select Case n
 Case 1
  ボタン1の処理
 Case 2
  ボタン2の処理
 Case 3
  ・・・・
 End Select
end with
End Sub
    • good
    • 0

ナニをやっているのかよくわかりません



各コマンドボタンで実行するコードに
シートを指定してやる処理があるという事でしょうか?

シート名を変数に格納する動作はたとえばBookOPENイベントで行うとか、
対象となるシート名が確定した時点でそれを行えばいいのです

End Withでひっかかるとありますが
エラーメッセージには何とありますか?

With ~ End With 無いのコードでIf文を使っていませんか?
End Ifを忘れるとそうなりますよ!
    • good
    • 0

Public変数にしやればいいんでないの?

この回答への補足

具体的にはどうすればいいのですか?


どうしても

end with でひっかかってしまいます・・・

補足日時:2010/08/13 13:34
    • good
    • 0

??



言っている意味がよくわかりません

この回答への補足

Dim ooo as worksheet

set ooo = Thisworkbook.worksheets("test")
with ooo

end with

の記述を現状はコマンドボタン毎に記述しています。

これを簡略化したいのですが方法はありませんか?

補足日時:2010/08/13 12:23
    • good
    • 0
この回答へのお礼

もう一つ補足をさせてください。

言葉の使い方が間違ってるかもしれませんが、

全てのプロシージャに

Dim ooo as worksheet

set ooo = Thisworkbook.worksheets("test")
with ooo

end with

を反映させたいです。

宜しくお願いします。

お礼日時:2010/08/13 12:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!