VBAを始めたばかりの初心者です。
sheet1にコントロール(CommandButton)を10個ほど配置しました。各CommandButtonのCaptionにsheet2~11のセルA1の値を表示させたいと思っています(このA1の値は変化します)。
Private Sub Workbook_Open()
Dim Mrang1 As String
Mrang1 = Worksheet(2).Range("a1").Value
CommandBottan1.Caption = Mrang
End Sub
上記のようなものを考えてみましたが、ダメでした。
根本的に何か間違っているのでしょうか。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

質問の真意というか、困っている状況が良く伝わりませんが推定して


私も試行してみました。上手く行かない原因は「イベント」の捕らえ方
選び方にあると思います。イベントとは「クリックしたら」とか「ワークブックを開いたら」とか言うプログラムが実行される「きっかけ」のことですよね。
以下回答を済ませてから良く見ると質問はコマンドボタン
を貼りつけるものでした。済みません置き換えてください。変わりはないと思います。
新規WorkbookのSheet1を開き、メニューバーの右余白部分で
右クリック-コントロールツールボックス-ラベル(Aの表示のあるもの)とクリックし、ラベルをSheet1上にドラッグして貼りつけました。
それを3回繰り返し3つラベルを貼りつけました。その後
ツール-マクロ-VisualBasicEditor-コードをクリックします。
イベントとしてWorksheetのActivateを選びました。
コーディングの本体は貴殿と同じです。
Private Sub Worksheet_Activate()
Label1.Caption = Worksheets("sheet1").Range("a1")
Label2.Caption = Worksheets("sheet2").Range("a1")
Label3.Caption = Worksheets("sheet3").Range("a1")
End Sub
そしてメニューの「実行」をクリックします。その後Worksheetに切り替えてSheet2のA1に文字列値(ロとする)を入れ、Sheet3のA1に文字列値(ハとする)を入れSheet1に戻ります。最後にSheet1のA1に文字列(イ)値を入れると、Sheet1の3つのラベルの文字がそれぞれイ、ロ、ハになります。
Sheet2を開いてA1の値を変えたり、Sheet3を開いてA1の値を変えたりして、Sheet1に戻るとSheet1の3つラベルは変えたように変わります。
ただこのWorksheetはSheet1を指すようで、Sheet2のA1に「ロ」を
入れた時やSheet3のA1に「ハ」を入れた時に、Sheet1のラベル
が変わるのではないようです。
しかし貴殿の意図のケースではSheet1にもどった時に変わっていれ
ば差し支えないのではないでしょうか。
    • good
    • 1
この回答へのお礼

丁寧な回答で、もやもやとしていたイベントの概念もよーくわかりました。
大きなヒントになったのは、Worksheets("sheet1")の"sheet1"の部分でした。
はずかしながら、Worksheets(1)とWorkshhts("sheet1")は全く同じであると思っておりまして、「ボタン」を配置したシートの指定がまちがっていたようです。
あとは回答いただいた通り作成してみたところ、うまくいきました。本当に有り難うございました。

お礼日時:2002/01/15 09:00

こんな感じはどうでしょう。


コントロールは配列で配置して、

Dim Mrang(10) as string
Dim i as integer

FOR i=0 to 10
Mrang(i)=Worksheets(i+2).Cells(1,1)
WorkSheets(1).CommandButton(i).Caption=Mrang(i)
NEXT i

~まず配列Mrang()にそれぞれの文字列を代入して、コマンドボタンのキャプションに表示させます。
    • good
    • 0
この回答へのお礼

そんな感じでとてもいいです。
10個のコマンドボタンを配置して…と質問に書いた後40個に増えました。なので、この配列の回答はぜひ使わせていただきたいと思います。有り難うございました。

お礼日時:2002/01/15 09:02

シート1に作ったボタンというのは「フォーム」ツールバーの「ボタン」でしょうか。

もしそうならば、それはCommandButtonとは呼ばないようです。
マクロの記録では Shapes("Button 1")となっていました。
そこで、普通に「フォーム」ツールバーの「ボタン」のテキストを表示変更するマクロを作ってみました。

Sub Auto_Open()
For a = 1 To 10
Worksheets(1).Shapes("Button " & a).Select
Selection.Characters.Text = Worksheets(a + 1).Range("A1")
Next
End Sub

ただ、ksjqaさんはWorkbook_OpenというイベントマクロやPrivate Sub~もご存知の方なので「フォーム」ツールバーの「ボタン」のことではないのかもしれませんが。

もし質問の意味が違ったのでしたら、また補足して下さい。
    • good
    • 1
この回答へのお礼

わかりやすい回答をありがとうございました。
「フォーム」ツールバーではなく、「コントロール」ツールバーのボタンのことだったのですが、tamagawa49さんの説明で、「フォーム」ツールバーの「ボタン」の扱いが理解できました。
皆さんの回答を試していてお礼が遅れた事をお詫びします。

お礼日時:2002/01/15 08:52

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcel VBA: private sub 内の変数の値を Sub へ渡すには

VBA初心者です。private sub 内で条件に合致した変数の値をSubへ渡すにはどうしたらよいのでしょう。下記を見ていただければやりたいことの意図は伝わるかと思います。private sub内の変数が多分private sub内のみでしか参照出来ないからだとは思いますが、うまくいきません。グローバル変数化みたいなことが出来るのでしょうか。

Sub Find_OK()
MsgBox "条件に合致したのは" & var1 & "です。"
End Sub

Private Sub Worksheet_Calculate()
Dim var1
 For var1 = 1 to 10
 If var1 > 8 Then Call Find_OK
End If
Next
End Sub

Aベストアンサー

Sub Find_OK(var1)
MsgBox "条件に合致したのは" & var1 & "です。"
End Sub

Private Sub Worksheet_Calculate()
Dim var1
 For var1 = 1 to 10
 If var1 > 8 Then Call Find_OK(var1)
End If
Next
End Sub

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QVBSでDim、Private、Publicの違い

Dim、Private、Publicの違いを教えてください。

どのように使え分けるのですか?

Aベストアンサー

VBSで、どの程度、使いこなせられるかにもよりますね。
一般のVB系の言語と違って、それらのステートメントは出会うことは少ないです。

Dim が入っているので、変数に対してのことだと思います。以下のように3つ並べてみて、その違いが分かるはずです。Dim と Public は、基本的には同じになります。ところが、Private は、呼び出せません。ただし、Function や Sub につけるキーワードは意味が変わります。

On Error Resume Next
Class myClass
Public FirstName
Private LastName
Dim Genr
Property Get FullName
Fullname = FirstName & " " & LastName & " " & Genr
End Property
Sub AddName(fname, lname, gnr)
Firstname = fname
LastName = lname
Genr = gnr
End Sub
End Class
Set Class1 = new myClass
Class1.Addname "Mari", "Yaguchi" ,"Talent"
MsgBox(class1.FirstName)
MsgBox(class1.LastName)
MsgBox(class1.Genr)
MsgBox(Err.Description)
'技術評論社 ポケットリファレンス『VBScript』p.42を参考

VBSで、どの程度、使いこなせられるかにもよりますね。
一般のVB系の言語と違って、それらのステートメントは出会うことは少ないです。

Dim が入っているので、変数に対してのことだと思います。以下のように3つ並べてみて、その違いが分かるはずです。Dim と Public は、基本的には同じになります。ところが、Private は、呼び出せません。ただし、Function や Sub につけるキーワードは意味が変わります。

On Error Resume Next
Class myClass
Public FirstName
Private LastName
Dim Genr
Property Get FullN...続きを読む

Qsheet1 A1日付に合致する内容をコピー

VBAにてsheet2より sheet1 A1日付に合致した日付の内容を添付のようににコピーしたいのですがよろしくお願いします。

Aベストアンサー

こんばんは!

一例です。
Sheet1のシートモジュールにしてください。
(Changeイベントにしています)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, wS As Worksheet
Set wS = Worksheets("Sheet2")
If Target.Address = "$A$1" Then
Set c = wS.Range("B:B").Find(what:=Target, LookIn:=xlFormulas, lookat:=xlWhole)
If Not c Is Nothing Then
c.Offset(1, -1).Resize(3, 3).Copy Range("A2")
Else
MsgBox "該当データなし"
End If
End If
End Sub

こんな感じではどうでしょうか?m(_ _)m

こんばんは!

一例です。
Sheet1のシートモジュールにしてください。
(Changeイベントにしています)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, wS As Worksheet
Set wS = Worksheets("Sheet2")
If Target.Address = "$A$1" Then
Set c = wS.Range("B:B").Find(what:=Target, LookIn:=xlFormulas, lookat:=xlWhole)
If Not c Is Nothing Then
c.Offset(1, -1).Resize(3, 3).Copy Range("A2")
Else
MsgBox "該当デー...続きを読む

QPrivate Subについて

VB初心者ですが質問させていただきます。
現在
Private Sub CommandButton1_Click()
で呼び出されている処理を、
コマンドラインからstart~.exeと入力して呼び出される(実行される)ようにするにはPrivate Subにてどのように記載してexeファイルを作成すればよいでしょうか??

何分初心者な者ですので概念に間違いがありましたら申し訳ございません。

よろしくお願いいたします。

Aベストアンサー

>Sub Main()
>Call Command1_Click
>End Sub
>とか出来なかったっけ?
できるはずがない。
Privateの範囲を考えればわかるはず

Public Sub Command1_Click()
にして
sub min側で
Call Form1.Command1_Click
呼び出せば動かないことはないけどイレギュラー的な
使い方すぎる。
それ考えれば
Command1_Clickイベント内をサブルーチン(関数化)して
それをsub mainとCommand1_Clickイベントから
呼び出して使うのが本来でしょう。


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング

おすすめ情報