かなりの初心者(始めて3日)ですが宜しくお願いします。
しかも2点あります。。。
(1)ユーザーフォームにある大量のテキストboxないし、optionboxをエクセルのsheet2に反映させたいです。
で、地道に
With Sheets(2)
.Range("A22").Value = OptionButton184.Value
.Range("A23").Value = OptionButton185.Value
.Range("A24").Value = OptionButton186.Value
.Range("A25").Value = OptionButton187.Value
とAの行を手で直していたのですが、途中で間違えて、手直しは断念しました。そこで、思いついたのが、「ひとつ下のセルに記述する」ということでした。
で、本を見ながら考えたのが、
With Sheets(2)
Range("A1").Select
ActiveCell.Offset(1, 0).Value = TextBox1.Text
ActiveCell.Offset(1, 0).Value = TextBox2.Text
ActiveCell.Offset(1, 0).Value = TextBox3.Text
まずA1を指定させて、下にずらしていけるかと思ったのですが、全然上手くいきません。しかもsheet1のA1を選択してるようです。どうしてでしょうか???
(2)フォームOKボタンを押して、上記の処理をしても、フォームに記入したものが次にフォームを開いた時に消えていないように、
Me.Hide
End Sub
で終わらせたのですが、次に開いても残っていません。
無知でお恥ずかしいですが、宜しく御願い致します。
No.3ベストアンサー
- 回答日時:
>まずA1を指定させて、下にずらしていけるかと思ったのですが、全然上手くいきません。
しかもsheet1のA1を選択してるようです。どうしてでしょうか???With Sheets(2)
Range("A1").Select
ActiveCell.Offset(1, 0).Value = TextBox1.Text
多分、Sheet1からこのユーザーフォームが開かれているのでは?
『Range("A1").Select』があり『ActiveCell』を基準にしているので、『With Sheets(2)』が意味をなしていません。
書くなら、
Sheets(2).Activate
With Sheets(2).Range("A1")
.Offset(1, 0).Value = TextBox1.Text
これでSheet2のA2から書き出すはずです。(未確認です)
>で終わらせたのですが、次に開いても残っていません。
『残っていない』のではなく、最初にデザインした状態が再度表示されているわけです。
残すためには、プロパティ『ControlSource』にセルを指定する必要があります。
または、下の例示のように『Initializeイベント』で値を取得する必要があるでしょう。
質問では、オプションボタンやテキストボックスが沢山あるみたいですが、一括で処理する例です。
オプションボタン1~80の値をA1~A80に、
テキストボックス1~80の値をB1~B80に 書き込んでいます。
説明を簡略化するために、オプションボタン等の番号と書き出すセルの行番号を一致させています。
終了後、最後フォームを開いた時に書き込んだ値を取得するために、『Unload』で終わり、
『UserForm_Initialize』で取り込んでいます。コード表現は書き込みと逆ですね。
'Sheet2へ書き込む
Private Sub CommandButton1_Click()
Dim i As Integer
With Worksheets(2)
'オプションボタンの値を書き出し
For i = 1 To 80
.Range("A" & i) = UserForm1.Controls("OptionButton" & i).Value
Next
'テキストボックスの値を書き出し
For i = 1 To 80
.Range("B" & i) = UserForm1.Controls("TextBox" & i).Text
Next
End With
End Sub
'Formを呼び出したとき、Sheet2から読み込む
Private Sub UserForm_Initialize()
Dim i As Integer
With Worksheets(2)
'オプションボタンの値を読み込み
For i = 1 To 80
UserForm1.Controls("OptionButton" & i).Value = .Range("A" & i)
Next
'テキストボックスの値を読み込み
For i = 1 To 80
UserForm1.Controls("TextBox" & i).Text = .Range("B" & i)
Next
End With
End Sub
'終了ボタン
Private Sub CommandButton2_Click()
Unload Me
End Sub
この回答への補足
長い回答ありがとうございます。
ご指摘の通り、sheet1にフォームを開くボタンがあって、そのフォームに記入した内容をsheet2に記述させたいのが全体の流れです。
つまり、長々と500行近くコードにA1、A2...と記述するのではなく、変数を使って変化させると言う認識で良いのでしょうか?
と言うことは、全部Aの列に入れたい私はtextboxとoptionbuttonも数字をならびにしないといけないと言うことですか?(今はぐちゃぐちゃ状態です。1~766まで。。。)
でも、記述がその分、短くて良いと言うことですよね。今の番号ぐちゃぐちゃ状態でやるには、Do...Loopとかいうのを使って可能ですか?(本を見ました。)
No.2
- 回答日時:
VBAプログラムを組みたいのかもしれませんが、
この件では、エクセルVBAならプログラムにしないで処理できます。
テキストボックス、オプションボタンともデザインモード
でマウス右クリックすると「プロパティ」が出てきて、
その中の項目に「LinkedCell」があります。
これにA22やA23を入れていけば、連動します。
この辺を操作ですませ、プログラムにしないこと(コントロールも手で貼りつけたでしょう)こそVBなどの目指しているところだと思います。
VBならコントロール配列がつかえること、コントロールを配列にすることを思い出してください。
また私はOFFSETはCells(i+1,j+1)とかすれば良いので、使いません。
この回答への補足
お返事有り難うございます。
それも考えたのですが、社内のエクセル苦手な人々に記入してもらう為、いじられないように&全角とかで記入されないようにユーザーフォームにしてみたのですが・・・逆に大変な事始めちゃったかしら。。。
No.1
- 回答日時:
初めて3日ですでここまで考えられたら大したものです。
さて
>With Sheets(2)
>Range("A1").Select
>ActiveCell.Offset(1, 0).Value = TextBox1.Text
>ActiveCell.Offset(1, 0).Value = TextBox2.Text
>ActiveCell.Offset(1, 0).Value = TextBox3.Text
With Sheets(2)
Range("A1").Select
Selection.offset(1).Select
Selection.Cells.Value = TextBox1.Value
Selection.Offset(1).Select
Selection.Cells.Value = TextBox2.Value
.
.
.
Ene With
offsetは行方向、列方向に移動出来ます。
offset(1).Selectは、行方向に一つ移動します。
offset(,-1).Selectは、列方向に一つ移動します。
今アクティブなセルを基準に考えれば
上に一つ移動は offset(-1).Select
下に一つ移動は offset(1).Select
右に一つ移動は offset(,1).Select
左に一つ移動は offset(,-1).Select
上に移動し右に移動する場合はoffset(-1,1).Selectとなります。
あと個人的には、TextBoxの値を取る場合、Valueで収得した方が良いですよ。特にセルの値を取る場合は必ずValueで設定して下さい。
ユーザーフォームを非表示は Unload命令で、オブジェクトをメモリーから削除します。
Hideメソッドはメモリー上から削除されませんから、マクロで操作可能ですので少し工夫して下さい。
プログラミングは、100人いれば100通りのやり方がありますのでこれが正解だとは言い難いです。
工夫次第では素人のアルゴリズムの方が優れている場合もありますよ。
どんどん自分で工夫して頑張って下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 並べ替え、ソートの構文がわからない。 お世話になります。VBA超初心者です。 エクセルでワークシート 2 2023/06/28 21:00
- Excel(エクセル) vba userformで漢字を全角カタカナに 2 2022/07/24 15:38
- Visual Basic(VBA) いつもお世話になります 下記のコード実行すると エラーになります わかるかた教えてくれませんでしょう 6 2022/12/17 15:01
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) 前回質問の続きになりますが、下記マクロでシート1からシート2の抽出項目セルB3「りんご」とセルC2「 2 2022/12/02 17:37
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ハッシュテーブル(連想配列)が...
-
PysimpleGUIでデータベースを作る
-
power BI クエリエディター 〇...
-
VBA 違うシートにコピペしてソ...
-
rand関数の割合変更
-
テキストボックスのvalueとtext...
-
オペランド
-
VBA 「実行エラー”13” ...
-
ユーザーフォームのテキストボ...
-
aspx.csからJSON形式にする方法
-
OracleでRecordCountが正しくな...
-
値を返さないコード パス
-
マクロ 特定のセル値のみクリ...
-
形式(値だけ)を選択して貼り...
-
パスワードの再入力処理
-
VBでBtrieveファイルにアクセス...
-
VBのテキストボックスに値が...
-
pingを行うプログラム
-
C# get set
-
マクロで奇数と偶数の値を2か所...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストボックスのvalueとtext...
-
マクロ 特定のセル値のみクリ...
-
VB.NETでコンボボックスの1行目...
-
変数名の取得
-
値を返さないコード パス
-
Excel VBAのリストボックスの値...
-
VB初心者。小数点以下の表示で...
-
ハッシュテーブル(連想配列)が...
-
textboxとLabelを動的に変更する
-
PL/SQLでのTO_DATEの時間取得に...
-
VB.NETでアクティブなformを知...
-
Excel vba ユーザーフォームテ...
-
マクロで奇数と偶数の値を2か所...
-
DataTableに対するLINQについて
-
【C++/CLI.NET】コンボボックス...
-
[VBA]選択範囲の下から上に処理...
-
範囲が指定されている乱数について
-
[VB.net] DataGridViewのコンボ...
-
変数に代入してある数値を表示...
-
vbscriptを使いexcelを参照して...
おすすめ情報