Excel VBAで電卓を作成しようとしているのですがボタンが反応しません


このWebの記事
https://blog.goo.ne.jp/pc_college/e/9ca2b0c452e9e691cad1dbd2783868cf

を見ながら、Excel VBAで電卓の作成を試みました。
使用しているのはOffice365です。

記事にありますように、「frmCalc」というユーザーフォームには、

--------------------------
Option Explicit

Private NumBtn(0 To 9) As New Class1

Private Sub frmCalc_Initialize()
'インスタンスの生成

Dim i As Integer
For i = 0 To 9
NumBtn(i).NewClass Controls("b" & i), i
Next

End Sub

Private Sub b0_Click()

End Sub

--------------------------

を記載しまして。(「UserForm_Initialize()」→「frmCalc_Initialize()」箇所のみ変更)

クラスモジュール「Class1」の方には、

--------------------------
Option Explicit
'イベントを持つコマンドボタン型の変数を宣言
Private WithEvents Btn As MSForms.CommandButton
'ボタンの数字を格納する変数を宣言
Private Index As Integer

Public Sub NewClass(ByVal c As MSForms.CommandButton, _
ByVal i As Integer)
'いわゆるコンストラクタ処理

'引数のコマンドボタンを変数に格納
Set Btn = c
'コマンドボタンの数字を変数に格納
Index = i
End Sub
--------------------------

を記載しました。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2019/09/28 15:52:40
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:moon-fondu

電卓のフォームを開き、F5キーを押してフォームを表示させると。

1のボタンを押すと1が、2のボタンを押すと2が…と、表示されるはずなのですが。

自分の場合、どのボタンを押しても、何の数字も入力されないのです。

http://f.hatena.ne.jp/moon-fondu/20190905152415

記事通りにしたはずなのですが…0~9のボタンのオブジェクト名も、上記コードに「For i = 0 To 9

NumBtn(i).NewClass Controls("b" & i), i」とありますので、b0、b1、b2…と、間違いなくしているはずなのですが。http://f.hatena.ne.jp/moon-fondu/20190905152418

考え得る原因と対策がありましたら、お教えいただけますと助かります。

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

ベストアンサー

id:ken3memo No.1

回答回数317ベストアンサー獲得回数115

ポイント1000pt

>。(「UserForm_Initialize()」→「frmCalc_Initialize()」箇所のみ変更)

↑この、関数名を変えたのが原因では?
UserForm_Initialize は、フォームが作られた時に走るコードなので、
名前を変えない。※変えてはイケナイのでは?

>記事通りにしたはずなのですが…0~9のボタンのオブジェクト名も、上記コードに「For i = 0 To 9
NumBtn(i).NewClass Controls("b" & i), i」とありますので、b0、b1、b2…と、間違いなくしているはずなのですが。http://f.hatena.ne.jp/moon-fondu/20190905152418


UserForm_Initialize ← これが、UserFormを開いた時に走るコードなので、
frmCalc_Initialize
↑と、フォームの名前にしなくても良いのでは?

google:UserForm_Initialize←を検索してみては?

確認方法ですが、コードを見るだけではわからないので、
なれるまでは
MsgBox "frmCalc_Initialize インスタンスの生成"
みたいに、メッセージボックスで確実にここにきているか、確認すると良いのでは。

Private Sub frmCalc_Initialize()
 'インスタンスの生成
MsgBox "frmCalc_Initialize インスタンスの生成"
Dim i As Integer
 For i = 0 To 9
 NumBtn(i).NewClass Controls("b" & i), i
 Next

 End Sub

↑メッセージが、表示されないなら、このコードは走っていない
で、名前を元に戻して

Private Sub UserForm_Initialize()
 'インスタンスの生成
MsgBox "UserForm_Initialize インスタンスの生成"
Dim i As Integer
 For i = 0 To 9
 NumBtn(i).NewClass Controls("b" & i), i
 Next

 End Sub

にすると、メッセージが表示されるか?確認はてみては

原因は、UserForm_Initializeをフォーム名_Initializeにしたために初期化コードが走っていないと予想してみました
解決のヒントとなれば幸いです。

google:UserForm_Initializeを検索

他1件のコメントを見る
id:Silvanus

質問を閉じられていないというのは、未だ全ての問題が解決してはいないということですか?

2019/09/23 18:10:30
id:moon-fondu

いえ、失念しておりました。大変失礼しました。

2019/09/28 15:52:28

その他の回答0件)

id:ken3memo No.1

回答回数317ベストアンサー獲得回数115ここでベストアンサー

ポイント1000pt

>。(「UserForm_Initialize()」→「frmCalc_Initialize()」箇所のみ変更)

↑この、関数名を変えたのが原因では?
UserForm_Initialize は、フォームが作られた時に走るコードなので、
名前を変えない。※変えてはイケナイのでは?

>記事通りにしたはずなのですが…0~9のボタンのオブジェクト名も、上記コードに「For i = 0 To 9
NumBtn(i).NewClass Controls("b" & i), i」とありますので、b0、b1、b2…と、間違いなくしているはずなのですが。http://f.hatena.ne.jp/moon-fondu/20190905152418


UserForm_Initialize ← これが、UserFormを開いた時に走るコードなので、
frmCalc_Initialize
↑と、フォームの名前にしなくても良いのでは?

google:UserForm_Initialize←を検索してみては?

確認方法ですが、コードを見るだけではわからないので、
なれるまでは
MsgBox "frmCalc_Initialize インスタンスの生成"
みたいに、メッセージボックスで確実にここにきているか、確認すると良いのでは。

Private Sub frmCalc_Initialize()
 'インスタンスの生成
MsgBox "frmCalc_Initialize インスタンスの生成"
Dim i As Integer
 For i = 0 To 9
 NumBtn(i).NewClass Controls("b" & i), i
 Next

 End Sub

↑メッセージが、表示されないなら、このコードは走っていない
で、名前を元に戻して

Private Sub UserForm_Initialize()
 'インスタンスの生成
MsgBox "UserForm_Initialize インスタンスの生成"
Dim i As Integer
 For i = 0 To 9
 NumBtn(i).NewClass Controls("b" & i), i
 Next

 End Sub

にすると、メッセージが表示されるか?確認はてみては

原因は、UserForm_Initializeをフォーム名_Initializeにしたために初期化コードが走っていないと予想してみました
解決のヒントとなれば幸いです。

google:UserForm_Initializeを検索

他1件のコメントを見る
id:Silvanus

質問を閉じられていないというのは、未だ全ての問題が解決してはいないということですか?

2019/09/23 18:10:30
id:moon-fondu

いえ、失念しておりました。大変失礼しました。

2019/09/28 15:52:28

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません