Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
VBからエクセル出力
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30604#CommentId84482
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
2021/5/4 13:06:05
> '現在日時を取得
> Dim timestanpText As String = Format(Now, "yyyyMMddHHmmss")
このコードだと、OS 設定が和暦モードの場合、
"20210504123456" ではなく
"030504123456" になるのでご注意を。
他にも、オブジェクトの解放処理も漏れていたり、VBA のコードを直訳したかのような、
.NET っぽくない記述が散見されるのが気にかかりますが、それはさておき。
> 他フォームのテキストボックスの値をエクセルへ出力することができていません。
ということはつまり、Excel 操作を伴うかどうかは別の話であって、要するに
「他のVBフォーム上のテキストボックスの値を取得する方法が分からない」
という質問ということになりますね。
自フォームの場合は「s = TextBox1.Text」と書けますが、
これは「s = Me.TextBox1.Text」の意味にあたります。
まずはこの「Me」に当たる部分を「他フォーム」に差し替えてみてください。
現状、他のフォームはどうやって表示させていますか?
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30451
VB2005 以降をお使いであれば、おそらくは以下のいずれのコードになっていると思います。
🔷パターン1
f = New Form2() '明示的なインスタンス生成
f.Show(Me) 'モードレス フォームとして呼び出し
🔹パターン2
Using f As New Form2() '明示的なインスタンス生成
f.ShowDialog(Me) 'モーダル フォームとして呼び出し
End Using 'モーダルフォームは利用後に破棄する必要がある
🔶パターン3
Form2.Show(Me) '暗黙のFormオブジェクトをモードレスフォームとして呼び出し
🔸パターン4
Form2.ShowDialog(Me) '暗黙のFormオブジェクトをモーダルフォームとして呼び出し
Form2.Dispose() 'モーダルフォームは利用後に破棄する必要がある
◆パターン5:パターン3 / パターン4 の別解
「Form2」の代わりに「My.Forms.Form2」と記述
フォームの表示のために推奨されるのは 1 や 2 の方法ですが、どの方法をとるにしても、
「どのフォームのテキストボックスの値を取得しようとしているのか」を明示するために、
Dim s0 As String = Me.TextBox1.Text '自フォーム上の TextBox の場合
Dim s1 As String = f.TextBox1.Text 'パターン1 / 2 の場合
Dim s2 As String = Form2.TextBox1.Text 'パターン 3 / 4 の場合
Dim s3 As String = My.Forms.Form2.TextBox1.Text 'パターン 5 の場合
といったコードを書くことになります。
そして他フォームの TextBox を操作する場合には、その Form のデザイン時に、
該当の TextBox コントロールの Modifiers プロパティの設定が
Friend もしくは Public に設定されている必要があります。
(なお Modifiers プロパティの既定値は、VB では Friend、C# では private です)
Modifiers はデザイン時専用のプロパティ設定で、コントロールの「適用範囲」を示しています。
適用範囲(スコープ)については、下記をご覧ください。
http://rucio.a.la9.jp/main/kiso/Scope.htm
さて、ここまでが初級編。
上記はお手軽な方法ですが、あくまでも小規模なアプリケーション向けの手法です。
本来、Form1 から Form2 のコントールを直接的に操作することは好ましくありません。
自フォーム以外からも自由にコントロールを操作できてしまうような設計にしておくと、
アプリケーションの規模が大きくなるにつれて「どこから読み書きされているのか」を
管理するのが煩雑になり、保守が難しくなってしまうためです。
また、後からコントロールの名前や種類を変更したい場合にも、修正箇所が多くなってしまいます。
本来、コントロールはそのフォーム自身のみが読み書きすることが望ましいので、慣れてきたら
そのフォーム上に「TextBox の値を取得するためのメソッドあるいはプロパティ」を
Public で設けて、それを通じて操作することが望ましいです。例えばこんな感じです。
https://www.oborodukiyo.info/Forms/VS2008/F-PassDataBetweenForms