Excelのファイルを選択して処理するプログラム

タグの編集
投稿者 ベリークイック  (社会人) 投稿日時 2015/11/5 08:38:17
お世話になります。VisalBasic2005でExcelのファイルを選択して処理するプログラムを作りたいのですが、ご親切な方アドバイスをお願い致します。 

Form1にはボタン1とボタン2を設置しています。ボタン1で開いたファイルをアクティブにして
ボタン2でExcelの計算処理を行いたいと思います。初心者で詳しい事はあまり判りませんので
具体的にアドバイスを頂けると助かります。
誠に申し訳ありませんが、宜しくお願い致します。

Public Class Form1

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

 Dim OpenFileDialog1 As New OpenFileDialog()

 ' ダイアログのタイトルを設定する
'OpenFileDialog1.Title = "ダイアログのタイトルをココに書く"

 ' 初期表示するディレクトリを設定する
OpenFileDialog1.InitialDirectory = "C:\"

 ' 初期表示するファイル名を設定する
OpenFileDialog1.FileName = "初期表示するファイル名をココに書く"

 ' ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
 MessageBox.Show(OpenFileDialog1.FileName)

 ' Multiselect が True の場合はこのように列挙する
'For Each nFileName As String In OpenFileDialog1.FileNames
 'MessageBox.Show(nFileName)
 'Next nFileName
 End If

 ' 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照)
 'OpenFileDialog1.Dispose()
 End Sub
 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

 Dim app As New Excel.Application
 Dim wb As Excel.Workbook
 Dim wsh As Excel.Worksheet
 Dim fn As String = "nFileName"
 Dim rin, rout, tan As Excel.Range

 wb = app.Workbooks.Open(fn)
 'シート1をセット
wsh = wb.Sheets(1)
 Try
 app.Visible = True
 With wsh

 rin = .Range(.Cells(1, 1), .Cells(3, 3))

 End With
 wb.Close()
 app.Quit()
 app = Nothing
 Catch ex As Exception
 wb.Close()
 app.Quit()
 app = Nothing
 End Try

 End Sub
 End Class 
投稿者 shu  (社会人) 投稿日時 2015/11/5 11:28:22
Button1_Clickで取得したファイル名をメッセージ表示するだけでなく
Private変数(クラス全体で使用可能な変数)に設定またはForm上に
TextBoxを配置しそこにファイル名を設定

Button2_ClickではButton1_Clickで設定されたファイル名を使用する

投稿者 ベリークイック  (社会人) 投稿日時 2015/11/5 19:15:34
shu様アドバイスを頂きまして誠にありがとう御座います。
早速、ご指摘頂きましたようにForm1にTextBox1を設置してプログラムを下記のように
修正したのですが、「wb = app.Workbooks.Open(fn)」のところで”COMExceptionはハンドル
されていませんでした”とエラー表示されて動作出来ませんでした。
誠に申し訳ありませんが、アドバイスを頂けると助かります。
~~プログラム~~
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' OpenFileDialog の新しいインスタンスを生成する (デザイナから追加している場合は必要ない)
        Dim OpenFileDialog1 As New OpenFileDialog()

        ' ダイアログのタイトルを設定する
        'OpenFileDialog1.Title = "ダイアログのタイトルをココに書く"

        ' 初期表示するディレクトリを設定する
        OpenFileDialog1.InitialDirectory = "C:\"

        ' 初期表示するファイル名を設定する
        OpenFileDialog1.FileName = "初期表示するファイル名をココに書く"

        ' ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            'MessageBox.Show(OpenFileDialog1.FileName)
            TextBox1.Text = OpenFileDialog1.FileName

            ' Multiselect が True の場合はこのように列挙する
            'For Each nFileName As String In OpenFileDialog1.FileNames
            'MessageBox.Show(nFileName)
            'Next nFileName
        End If

        ' 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照)
        'OpenFileDialog1.Dispose()
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim app As New Excel.Application
        Dim wb As Excel.Workbook
        Dim wsh As Excel.Worksheet
        Dim fn As String = "TextBox1.Text"
        Dim rin, rout, tan As Excel.Range

        wb = app.Workbooks.Open(fn)
        'シート1をセット
        wsh = wb.Sheets(1)
        Try
            app.Visible = True
            With wsh

                rin = .Range(.Cells(1, 1), .Cells(3, 3))

            End With
            wb.Close()
            app.Quit()
            app = Nothing
        Catch ex As Exception
            wb.Close()
            app.Quit()
            app = Nothing
        End Try

    End Sub
End Class
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2015/11/5 22:30:02
> エラー表示されて動作出来ませんでした。
エラー発生が特に予想されるのは、ファイルを開くところですから、
Open メソッドも Try 句の中に入れておくべきでしょうね。


> Dim fn As String = "TextBox1.Text"
Dim fn As String = TextBox1.Text
にしないと、意味が変わってしまいますよ。


TextBox1.Text  =  "こんにちは"
TextBox2.Text  =  "おはようTextBox1.Textこんばんは"
TextBox3.Text  =  "おはよう""TextBox1.Text""こんばんは"
TextBox4.Text  =  "おはよう"" & ""TextBox1.Text"" & ""こんばんは"
TextBox5.Text  =  "おはよう" & """TextBox1.Text""" & "こんばんは"
TextBox6.Text  =  "おはよう" & "TextBox1.Text" & "こんばんは"
TextBox7.Text  =  "おはよう" & TextBox1.Text & "こんばんは"
TextBox8.Text  =  "おはよう{TextBox1.Text}こんばんは"
TextBox9.Text  = $"おはよう{TextBox1.Text}こんばんは"

ちなみに上記を実行すると、下記の結果になります。

TextBox1 が「こんにちは」
TextBox2 が「おはようTextBox1.Textこんばんは」
TextBox3 が「おはよう"TextBox1.Text"こんばんは」
TextBox4 が「おはよう" & "TextBox1.Text" & "こんばんは」
TextBox5 が「おはよう"TextBox1.Text"こんばんは」
TextBox6 が「おはようTextBox1.Textこんばんは」
TextBox7 が「おはようこんにちはこんばんは」
TextBox8 が「おはよう{TextBox1.Text}こんばんは」
TextBox9 が「おはようこんにちはこんばんは」  ← VB2015向け構文(2015未満だと文法エラー)



なお、VB.NET から参照していた Excel オブジェクトを正しく解放するには、
Marshal.ReleaseComObject というメソッドを呼び出す必要があります。

VBA とは違って、Nothing を代入するだけでは Excel オブジェクトを
解放することにはならないので注意してください。