Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

VBからエクセル出力 解決済み

Excel 作り方の相談 タグの編集...

投稿者 SAMO   (社会人)   投稿日時 2021/5/2 21:57:02
お世話になります。VB初心者です。
VBフォームアプリケーション、ボタンクリックの度、ボタンクリック日時とテキストボックス内容をエクセルに出力していくコードを作成したいのですが、全くわかりません。(下の行に順に入力される様)
ご教授いただければ幸いです。

宜しくお願い致します。

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2021/5/3 08:56:45
> コードを作成したいのですが、全くわかりません

全く、ということはないでしょう。

現状はどこまでできているのか、その目的を実現するにあたって何が不明なのか、
分からない点をもう少し絞って、かつ具体的に質問してみてください。


•どの Visual Basic を使うべきか、どのバージョンを使うべきか相談したい
•コードを作成するために VB を入手したが、インストール方法が分からない
•VB はインストールしたが、新規作成時のテンプレート選択で悩んでいる
•学習のために、このサイト(VB中学校)で学び始めているが、その中に分からない点があるので追加説明が欲しい
•Excel 以外に出力する方法(テキストファイルやメッセージボックス)なら分かるが、Excel に出力するための手段が分からない
•このサイトの○○○のところまで学習を進めたが、×××を実現するための手段が分からない
 例:ボタンクリック時の処理を書いたつもりだが、クリックしてもその処理が呼び出されない
 例:VBフォーム上のボタンをクリックした時に、現在の日時を取得する方法が分からない
 例:Excelフォーム上のボタンをクリックした時に、現在の日時を取得する方法が分からない
 例:Excelシート上のボタンをクリックした時に、現在の日時を取得する方法が分からない
 例:VBフォーム上のテキストボックスの値を取得する方法が分からない
 例:Excelフォーム上のテキストボックスの値を取得する方法が分からない
 例:Excelシート上のテキストボックスの値を取得する方法が分からない
 例:基本操作は問題ないが、Excelに出力するための方法が見つからない
 例:Excel に出力するための方法が多数見つかり、どれを選択するべきか悩んでいる
 例:Excel に出力する方法は分かったが、下の行に追記する方法が分からず、毎回新規作成になってしまう
 例:自分なりにコードを書いてみたのだが、コンパイルエラーになってしまっている
 例:自分なりにコードを書いてみたところ、期待する結果は🔵🔵なのに、実際には🔴🔴になってしまう

投稿者 SAMO   (社会人)   投稿日時 2021/5/3 21:34:17
魔界の仮面弁士様
ご返答ありがとうございます。
現在、日時の出力までは可能となりましたが、現在フォームボタンをクリックし、他フォームのテキストボックスの値をエクセルへ出力することができていません。
下記コード記載致しますので宜しければご教授をお願い致します。

Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
   Dim app As Application
        Dim book As Workbook
        Dim sheet As Worksheet
        '現在日時を取得
        Dim timestanpText As String = Format(Now, "yyyyMMddHHmmss")
     app = CreateObject("Excel.Application")
        book = app.Workbooks.Open("C:\ファイル名.xlsx")     'ファイルを開く

        sheet = book.Worksheets("シート1")     'シート1を選択
        sheet.Cells(2, 1).Value = Format(Now, "yyyy/MM/dd HH:mm:ss")      'セルに日時を出力
<不明箇所>
     sheet.Cells(2, 2).Value = Format(F_フォーム1, TextBox1.Text)
        app.Visible = True
        book.SaveAs("c:\desktop")  '名前をつけて保存

        'app.Quit() '終了

        ' オブジェクトを解放します。
        sheet = Nothing
        book = Nothing
        app = Nothing
    End Sub

投稿者 魔界の仮面弁士   (社会人)   投稿日時 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

投稿者 SAMO   (社会人)   投稿日時 2021/5/10 09:28:41
魔界の仮面弁士 様

ご返答遅くなり申し訳ありません。
回答頂きありがとうございます。

他のフォームの呼び出しについてはパターン1で呼び出しております。
🔷パターン1
f = New Form2() '明示的なインスタンス生成
f.Show(Me) 'モードレス フォームとして呼び出し

また、
「本来、Form1 から Form2 のコントールを直接的に操作することは好ましくありません」については
知らなかったことでしたので大変参考になりました。

今後ともよろしくお願いいたします