質問: n + 1 end sub nの値を用いてセルにテキストボックスの値を入れるというプログラムです。 値をいれたら、nをひとつ増やして次に備えるようにしたいのですが。 そもそも最初にnの値が受け渡しできません。 ボタンコマンドの最初の行でメッセージボックスにnの値を表示して確認しても何も数字が表示されません。 nの値の受け渡しを方法を教えてください。
回答: #1で説明つくされていると思いますが。 私もこういう件で、初心者で、手こずった経験があります。 ーー 総論として、本件はuserformの初めのころの勉強で、やっていると思いますが、 「シートのセルの入力にuserフォームを使うのは」得策ではないと思います。多列の(多項目、多フィールドの。テキストボックスだけでなく、コンボボックスやオプションボタンなども利用した、多項目の入力を(初めての人に)本格的に必要項目の入力を全うさせるための、入力ツールを作る(チェックシステムも組み込む)ならこういう場合は、こういうことは必要ですが。) 直接シートに入力させる方が、簡潔で戸惑いがないでしょう。 本題にかえって ーーー (1)本質問は、変数のスコープという、一番vba学習の大切かつ早く学ぶべきことと関連していると思いました。 http://excel-ubara.com/excelvba1/excelvba408.htmlなど 「vba 変数 スコープ」で照会 >上記記事内の ・シートモジュール・・・シート毎に存在します ・ブックモジュール・・・ブックで1つだけ ・フォームモジュール・・・作ったフォームの数だけ ・標準モジュール・・・好きなだけ作れます ・クラス の区分け意識は重要でしょう。 (2)public変数の話題があります。 「vba 変数 public」で照会。 public変数も弊害が出る場合もあります。 諸言語プログラムの方針の流れとしては、別モジュールに影響をできるだけ与えないような仕組みを作り、使わせる、が基本方針でしょう。privateというのはそういう思想でしょう。 (3)モジュールレベル変数 http://tonari-it.com/public-and-call-procedure/ >「何でもかんでもモジュールレベル変数にするべきではありません。プロシージャ内で完結する変数はdimを使うようにして、どうしてもプロシージャをまたがって使いたいもののみモジュールレベル変数にしましょう」 (3)static変数の話題もあります。 http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_050_04.html の「モジュールレベルの変数」のstaticの部分 (4)プロシージャ―の実行をcallで使い、前段階で決まる変数を引数に指定して、確実に渡すことを推奨している方針もあります。 ーー それとvbaではvbeのメニューのvbaのプログラムの「実行」では、「sub/ユーザーフォームの実行」となっていて、ユーザーフォームのinitializeイベントを指定して入れておくと private sub userform_initialize() n = 1 msgbox n 'userform1.show end sub このnはシートの1行目を指すnとして使えるようです。 ーー また sub test02() n = n + 1 msgbox n end sub のように n = n + 1 を初めの方に入れておくと、nは初期化していないのに、初めにnは1 として使えます。其の後n=n+1を使う。 これは推奨されるやり方ではないかもしれないのですが。 ststicにしておくと、他のモジュールの部分に実行コントロールが行って帰ってきても安全でしょう。 ーー また private sub userform_initialize() n = 1 msgbox n userform1.show vbmodal end sub の vbmodalを入れておいた方が、経験では、入力中にシートのセルに誤って空白セルを作ってしまわなくてよいようです。 ーー userformはvbaでは有名ではありますが、解説書は少なく(amazonで出てくるのは4本のみ。署名になっているのは技術評論社の1本のみ。他は1部分で解説は以外に多数あろう。)、貼り付けるコントロールの説明しかない本も多く、独学だと基礎的な(仕組みの)勉強に苦労します。