- ベストアンサー
VBAデータフォームテキストボックスの表示方法
- VBAデータフォームを利用してテキストボックスの内容を表示する方法について教えてください。
- データフォームを使用して修正マクロを作成していますが、テキストボックスの表示がうまくいかない問題に困っています。
- テキストボックスの内容が変わらない現象が発生しているため、行が変わった時に該当行の内容を表示させる方法を知りたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#2、3、cjです。 私の方にも見落としがあったこともあって (#3のコードは私の見当違いだと気が付きました) ますます、混乱してしまいましたので、 原点に戻って、ご提示のコードに書き加えることだけで レスしてみます。 #3の方は、まだ、手を付けていなければ、試さなくていいです。 すみません。 Private Sub CommandButton1_Click() If setIn Is Nothing Then Set setIn = ActiveCell Select Case データ入力.Caption Case "コード 入 力" cnt_A + 1 setIn(cnt_A, 1).Value = Sample_No.Text Sentaku_Koumoku.Value = "" Case "A 入 力" cnt_A = cnt_A + 1 setIn(cnt_A, 2).Value = Sentaku_Koumoku.Text Sentaku_Koumoku.Value = setIn(cnt_A + 1, 2).Text Case "B 入 力" cnt_A = cnt_A + 1 setIn(cnt_A, 3).Value = Sentaku_Koumoku.Text Sentaku_Koumoku.Value = setIn(cnt_A + 1, 3).Text End Select Sample_No.Value = setIn(cnt_A + 1, 1).Value End Sub > cnt_A = cnt_A + 1 修正対象レコードのインデックスをひとつずつ送る、 というのは理解できました。 > 上から下へのベタ打ち ということですから シート上では「ひとつ下のセル」という意味ですよね? > With setIn(cnt_A) これでは 「ひとつ右のセル」→「ふたつ右のセル」 という意味になってしまうので、修正してます。 Sample_No.Value = setIn(cnt_A + 1, 1).Value Sample_Noは、単純に一つ下のセル値を採ればいいのだと思います。 Sentaku_Koumoku.Value = setIn(cnt_A + 1, 2).Text これで、次のレコードに該当するセル値を表示します。 Sentaku_Koumoku.Value = "" "コード 入 力"モードの場合に、 Sentaku_Koumokuに何を表示するのか判らないので空欄にしています。 以上、これも、可能性が高そうなニーズへの暫定回答です。 (動作は確認していますが、ニーズが確認出来ていません) もしこれで、うまく行かない場合は、 UserForm全体のコードとデザイン、シートのイメージ、の詳細、システム概要 などを添える形で、新たに質問を建ててみてください。 UserFormや他のコントロールのイベントで処理するのが妥当と 思われる内容をコマンドボタンのイベントで処理しているような気がします。 ただ、この回答のコードは、当たらずも遠からず、と思ってレスしていますので、 相違の説明補足あれば対応します。 以上です。
その他の回答 (3)
- cj_mover
- ベストアンサー率76% (292/381)
#2、cjです。 #2補足欄へのレスです。 = Sample_No というのが謎でして、この書き方だと Sample_Noは変数のこと、だと思っていたのですが、 ひょっとしてTextBoxのオブジェクト名なのでしょうか? = Sample_No.Text を省略して書いている?とか? 何れにせよ、TextBoxのオブジェクト名が判らないと、 TextBoxにセルの値を表示させる記述を書くことはできませんので ここでは、仮に、Sample_NoがTextBoxのオブジェクト名だった場合 の例で書いてみます。 TextBoxの表示値変更、セル値の変更、によって それぞれChangeイベントなどを発生させますから、 その手のイベント処理をしている場合などは 全体を見て間違いが無いように気を付けてください。 cnt_A = cnt_A + 1 の記述は何を数えているのか、こちらも解りません。 とりあえず、今回は、ダミーサンプルを作成し、 相当量のテストを経て動作を確認しています。 が、ニーズに合ったものになっているのか、については自信ありません。 Private Sub CommandButton1_Click() Dim colOffset As Long Set setIn = ActiveCell colOffset = -1 Select Case データ入力.Caption Case "コード 入 力": colOffset = 0 Case "A 入 力": colOffset = 1 Case "B 入 力": colOffset = 2 End Select If colOffset = -1 Then Exit Sub cnt_A = cnt_A + 1 ' ? setIn.Offset(0, colOffset).Value = Sample_No.Text Sample_No.Value = ActiveCell.Offset(1, colOffset).Value ActiveCell.Offset(1, 0).Select End Sub
お礼
cj moverさん おはようございます。 お世話になります。いろいろなご指摘とても感謝しております。 なにしろ20年以上前に、今ではレガシー言語と言われているCOBOL,p/L1などで仕事をしてた頃 のメソッドでやっていて(今は工場勤務です)、となりの部署の先輩の応援としての開発なのです。 錆付いた脳に油を差しながら、といった感じです。 >Sample_Noは変数のこと、だと思っていたのですが、 ひょっとしてTextBoxのオブジェクト名なのでしょうか? →その通りです。省略して書いてました。コードの所です。 >cnt_A = cnt_A + 1 の記述は何を数えているのか、こちらも解りません。 →これは行を下にずらすような、改行の様なイメージの記述です。要らないのかも知れません。 職場にデータが有り、今日は夕方から深夜までの勤務で再度試す予定です。 結果を報告しますので宜しくおねがいします。
- cj_mover
- ベストアンサー率76% (292/381)
こんにちは。お邪魔します。 ご提示のコードの読解だけで手直ししたものを挙げてみます。 質問文や補足でもはっきりとは書かれていないのですが、 「CommandButton1をClickしたら」 「処理対象(ActiveCellと右隣2セルのどれか)に」 「Sample_No の値を設定する」 これに加えて 「次の処理対象として1行下のセルを指定する」 ということで宜しいのでしょうか? ' ' ========================= Dim setIn As Range Dim cnt_A As Long Private Sub CommandButton1_Click() ' ' 各項目の入力 Dim colOffset As Long Set setIn = ActiveCell.Offset(0, 0) colOffset = -1 Select Case データ入力.Caption Case "コード 入 力": colOffset = 0 Case "A 入 力": colOffset = 1 Case "B 入 力": colOffset = 2 End Select If colOffset = -1 Then Exit Sub cnt_A = cnt_A + 1 ' ' フォームにコードをセット setIn(cnt_A).Offset(0, colOffset).Value = Sample_No ActiveCell.Offset(1, 0).Activate End Sub ' ' ========================= ActiveCell を基準にすべての処理が始まっていますから ActiveCell.Offset(1, 0).Activate という風に ActiveCell を下に送ってやるのが 現状から一番簡単な対処です。 ご提示のプロシージャは、 3つの項目にそれぞれデータを入力する目的で書かれていますが、 ひとつのレコード(行)について3つの項目を入力し終えてから 次のレコード(行)へ移動 するというようなこと(なのか、それとも?)まで書かれていません。 その点、このままでいいのでしょうか? 通常は、 ■1■ 単項目のデータを出力するコマンドボタンと 次のレコード(行)に移動するコマンドボタンと 別に組合わせて使う とか、 ■2■ 単項目のデータを出力するコマンドボタンと 単項目のデータを出力するとともに次のレコード(行)に移動するコマンドボタンと 別に組合わせて使う とか、 ■3■ ひとつのコマンドボタンで 単項目のデータを出力するとともに 対象レコード(行)の項目データがすべて埋まっていれば 次のレコード(行)に移動する などのような設計になるものと思います。 現在のコードでは、ひとつの項目を入力する度に 次のレコード(行)に移動するようになっています。 これについては、 何か他のコントロールイベントなどで手当てされているのでしょうか? ■1■、■2■については必要ならコントロールを増やして 現行コードをアレンジするだけです。 ■3■については ActiveCell.Offset(1, 0).Activate の部分を If Application.CountA(ActiveCell.Resize(, 3)) = 3 Then ActiveCell.Offset(1, 0).Activate End If のようにすることで、 「3項目すべて入力済の場合だけ次のレコード(行)に移動する」 ようになります。 3例挙げましたが、他にも色々な設計があるでしょう。 そういったイメージが判らないままの回答ですので、 食い違いがあれば、補足してください。 また、私が提示したものは"現状から一番簡単で無難な対処" という意図で書かれています。 全体がイメージできれば色々工夫の余地はあるとは思います。 とりあえず、試してみて、求める結果とどう違うか、です。 以上です。
補足
cj moverさん こんばんは。今仕事から帰って着ました。 説明不足で申し訳ありません。 データの入力手順として、1コードの入力->上から下へのベタ打ち 2、項目A,Bそれぞれ 1と同様上から下へのベタ打ち で入力してます。 ここでは示さなかったのですが、このフォームの前に項目選択のフォームを用意してあり コード、項目A,Bそれぞれオプションボタンを設けて選択することで、項目A、Bの入力、修正を行うように しております。 但し大前提としてコードの入力が最初です。 現状では、入力も修正もできるのですが、OKした後、データ入力のテキストBOXのコード及び 選択項目が最初に選択したコードの次の行を表示しないため、目くらで入力しているような感じ になってます。 >ひとつのレコード(行)について3つの項目を入力し終えてから 次のレコード(行)へ移動するというようなこと →各項目どれかです。3つすべてではありません。 因みに頂いたVBA のコーディングで試したところ、入力が反映されず、いままで動かなかったセルが 水澄ましのように下に動いていきました。 仕様としてはシンプルと思うのですが、頭が固くてうまく行きません。 宜しくおねがいします。
- hirotn
- ベストアンサー率59% (147/246)
>行が変わった時に、該当行の内容(コード、選択項目)を表示させる様にしたいのです。 →With setIn.Offset(cnt_A, 0)ではないでしょうか。 推測で答えているところがありますので、外している場合は、実行イメージを頂きたいです。
補足
hirotnさん こんばんは。早速の回答ありがとうございます。 イメージとしては シートの内容 コード A B aaaa1 && $$ bbbb1 ** ## cccc1 ?? %% dddd1 !! ?? 以下に続く の様な感じで例えばcccc1から選択項目bの%%を修正して、下段に行が変わった時、データフォームのコードのテキストBOXにはdddd1と表示させたいのです。選択項目Bも同様です。 > →With setIn.Offset(cnt_A, 0)ではないでしょうか。 試しましたが、上の例でcccc1の%%を##と入れて見た所、dddd1の所に入力され、またテキストBOXのコードもcccc1で変わりませんでした。 なかなかうまくいかなくて参ってます。(<_>)
お礼
cj moverさん こんばんは お世話になります。いま仕事から帰って着ました 今日は雨がひどくて大変でしたね。 #4の件了解です。#3でやってみたところ選択項目A,Bのセルに コードが入力され、データフォームのコードのテキストBOXにA,Bで入力した@@やら&&が 表示されました。また手順1として最初に入力するコードのベタ打ちはうまくいきました。 >"コード 入 力"モードの場合に、 Sentaku_Koumokuに何を表示するのか判らないので空欄にしています。 →その通りです。何も入れないです。 明日は夜勤なので、いや、もう今日ですね#4のコーディングで再度試行します。 夜勤は、結構纏った空き時間が取れるので、いつもこの勤務帯にVBAを組んでます。 歴史は夜作られるというわけでではないのですけど、捗ります。 結果をご報告しますので宜しくお願いします。
補足
cj moverさん こんにちは お世話になります。仕事から帰って来て少し休んでこの時間です。 結果OKでした。実はこのファイル、レイアウトが2行で構成されてる少し面倒なファイルで 以下の様な感じで項目か10項目程有ります。 コード A B C D E aaaa1 @@ && AA BB ## この2行 %% $$ ?? で1件 cj moverさんからご教示頂いた#3,#4のコーディングをデータ入力前の画面の所で場合分けして データ入力の画面を同じものを2つ作り#3、#4のコーディングを流用して完成しました。 最後は突貫工事で昔の開発仕事の頃のノリです。もうあの頃みたいに36時間戦えないですけどね。 今朝明けの前に簡単な操作ガイドと一緒に隣の部署の先輩に配布しました。喜んでました。 私もうれしいです。 Cj moverさんに感謝です。ありがとうございます。