エクセルセット への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2015/7/2 13:56:36
> 'Excelアプリケーションオブジェクトを生成
> xlApp = CreateObject("Excel.Application")
> 'ワークブック開く
> bookHoge = xlApp.Workbooks.Open("C:\Users.xls")
> 'ワークシートの操作
> shtHoge = bookHoge.worksheets("Sheet1")
> shtHoge.range("T1").value = TextBox1.Text
> shtHoge.range("T2").value = TextBox2.Text
> '保存して閉じる
> bookHoge.save()
> bookHoge.close()
> xlApp.quit()
> xlApp = Nothing

提示頂いたコードでは、解放処理がゴッソリ漏れているようです。
(Nothing 代入で解放されるのは .NET 側のリソースだけです)

現状の作りだと、Excel を Quit メソッドで終了したとしても、実際の Excel.exe は
即時終了せず、非表示状態のまま残り続けてしまう可能性があります。
タスクマネージャーで、Excel.exe が残っていないか確認しておいた方が良いでしょう。


使用済みの COM オブジェクトを即時解放するために、Marshal クラスの
ReleaseComObject メソッドを呼び出すことを検討してみて下さい。
たとえばこんな感じ。

'Imports System.Runtime.InteropServices 

Dim xlApp = CreateObject("Excel.Application")
'xlApp.Visible = True 
Dim xlBooks = xlApp.Workbooks
'Cドライブのルートフォルダで読み書きするのは避けましょう 
'Dim bookHoge = xlBooks.Open("C:\Users.xls") 
Dim bookHoge = xlBooks.Open("C:\SAMPLE\Users.xls")
Dim xlSheets = bookHoge.Worksheets
Dim shtHoge = xlSheets("Sheet1")
Dim xlRange As Object
xlRange = shtHoge.Range("T1")
xlRange.Value = TextBox1.Text
Marshal.ReleaseComObject(xlRange)    '★ 
xlRange = shtHoge.Range("T2")
xlRange.Value = TextBox2.Text
Marshal.ReleaseComObject(xlRange)    '★ 
Marshal.ReleaseComObject(shtHoge)    '★ 
Marshal.ReleaseComObject(xlSheets)   '★ 
bookHoge.Save()
bookHoge.Close()
Marshal.ReleaseComObject(bookHoge)   '★ 
Marshal.ReleaseComObject(xlBooks)    '★ 
xlApp.Quit()
Marshal.ReleaseComObject(xlApp)      '★ 


VB.NET からの Excel 操作については、下記も参照してみて下さい。
http://hanatyan.sakura.ne.jp/dotnet/Excelflm.htm
投稿者 (削除されました)  () 投稿日時 2015/7/2 13:55:37
(削除されました)
投稿者 中年初心者  (社会人) 投稿日時 2015/7/2 13:26:06
daive様 魔界の仮面弁士様

書いている内容を何度も繰り返し参考にしましたら
簡単に出来ました。ありがとうございます。
難しく考えすぎていました。

また分からないことがあれば質問させていただきます。

今回はありがとうございました。

投稿者 中年初心者  (社会人) 投稿日時 2015/7/2 11:07:17
daive様 魔界の仮面弁士様

ありがとうございます。
相当、私自身説明が上手でない事がわかります。
その上でここまで丁寧に説明して頂きありがとうございます。

なんと説明したらよいのか。。。
決まっているセルに数字や文字を入れたいだけなのですが。。
こんなソースで書き込み出来ますがこれをドラッグ&ドロップしたファイルに
セル位置は分かっているのでVBのテキストボックスから書き込みたいのです。

    Dim xlApp As System.Object
        Dim bookHoge As System.Object
        Dim shtHoge As System.Object
        'SaveFileDialogクラスのインスタンスを作成
        Dim sfd As New SaveFileDialog()

        'Excelアプリケーションオブジェクトを生成
        xlApp = CreateObject("Excel.Application")
        'ワークブック開く
        bookHoge = xlApp.Workbooks.Open("C:\Users.xls")
        'ワークシートの操作
        shtHoge = bookHoge.worksheets("Sheet1")
        shtHoge.range("T1").value = TextBox1.Text
        shtHoge.range("T2").value = TextBox2.Text
        '保存して閉じる
        bookHoge.save()
        bookHoge.close()
        xlApp.quit()
        xlApp = Nothing


1.OSは何ですか?、x86、x64の別、バージョン、エディションも含めて記述してください。
  Windows7 Professional SP1 64bit版
2.VB.NETは何ですか?バージョン、エディションも含めて記述してください。
  例:VS2010 professional 
3.OFFICE又は、EXCELは何ですか?、x86、x64の別、
  Microsoft Office Professional 2010 
4.EXCELが、インストールされていない環境での動作は、考えていますか?
  考えていません
5.魔界の仮面弁士さんが、紹介してくださった機能や、有償で購入可能な、
  考えていません
6.配布はどうしますか?⇒6人ぐらいで使います。
投稿者 (削除されました)  () 投稿日時 2015/7/2 10:46:17
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2015/7/1 20:43:05
> ファイルの中身をFormのテキストボックスに結び付ける方法がわかりません。

残念ながら、直接結びつけるような簡単な方法はありません。

相手がテキストファイルなら、読み書きの方法が多数用意されており、たとえば
RichTextBox1.LoadFile("C:\sample\test.csv", RichTextBoxStreamType.PlainText)
などと簡単に書けますが、今回は xls なのでそういうわけにもいきません。

Excel の読み書きに対応したライブラリを用意し、それを呼び出すコードを
ご自身で記述して頂く方法があります。


必要なライブラリの名前については既に紹介していますが、それぞれの違いについても
補足説明しておきます。ご自身で追加調査の上、要件にあったものを選択してみて下さい。


> EPPlus
> ClosedXML
これらは xls には対応していません。xlsx 用です。
今回の要件を満たさないので、詳しい説明は省きます。


> NPOI
97-2003 の xls ファイルに対応しています。(xlsx も可)
実行環境に、Microsoft Excel が無くても動作します。
ライブラリは下記からダウンロードして下さい。
 https://npoi.codeplex.com/


> Microsoft.Office.Interop.Excel
実行環境に、Microsoft Excel がインストールされている必要があります。
また、これを使う場合には、開発環境の Excel バージョンと、実行環境の Excel バージョンを
同一のバージョンにそろえておくことが望まれます。

この方法による操作例は、ここのサイト(VB中学校)の初級講座(第44回)
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/index_sta.htm
を始めとして、インターネット上でも多数見つかるので、サンプルに困ることは無いでしょう。

Excel を外部から操作する方法のため、自由度は非常に高いです。
ただし、もともとが .NET ライブラリではなく、ActiveX のライブラリなので、
メモリ解放処理(Marshal.ReleaseComObject)の呼び出しが適宜必要になります。

そのため、実装難易度としてはやや高めかも知れません。

解放漏れがあると、Excel.EXE が終了せず、ゾンビプロセスとして
残ったり、2 回目以降の操作時が期待動作しないなどの障害を
引き起こすことがありますので、単にサンプルをコピーして使うのではなく
コードの各行の意味を十分に理解した上で利用されることをお奨めします。


> ACEDAO
相手が xls の場合は、「ACEDAO」の前バージョンである「DAO」でも対応できます。
いずれも Excel が無くても動作します。利用するには、System.Data.OleDb にて
 ・Microsoft.ACE.OLEDB.12.0
 ・Microsoft.JET.OLEDB.4.0
のいずれかの OLE DB Provder を呼び出す方法と、CreateObject 等で
"DAO.DBEngine.120" あるいは "DAO.DBEngine.36" を呼び出す方法とがあります。

ただし、Excel シートをデータベースのテーブルのように扱うタイプの
ライブラリなので、自由度はかなり低いです。単純なデータの
追記と読み込みはできますが、削除については制限されていますし、
セル書式データを扱うこともできません。
今回の目的にはあまり向かないでしょう。こちらも説明は割愛します。



このほか、有償製品の ExcelCreator を使う方法などがあります。
いろいろと制限があるので、個人的には好きでは無いのですが、
Excel の無い環境でも xls ファイルの読み書きが出来るため、たまに利用しています。


なお、xls ファイルのバイナリーフォーマットは公開されていますので、
実装の手間を惜しまないのであれば、自前で読み取ることも
原理的には可能だったりします。実装コストを考えると現実的ではありませんが。
https://msdn.microsoft.com/ja-jp/library/office/gg615407.aspx


あるいは考え方を変えて、VB.NET で Excel データを読み取ろうとするのではなく、
Excel VBA でファイルを読み取り、それを VB.NET に渡すという方法もあるかもしれません。
投稿者 daive  (社会人) 投稿日時 2015/7/1 17:48:51
まず、明らかにしなければ成らない事があります。
1.OSは何ですか?、x86、x64の別、バージョン、エディションも含めて記述してください。
  例:Windows 8.1 pro Update x64 等、(x86=x32)
2.VB.NETは何ですか?バージョン、エディションも含めて記述してください。
  例:VS2013 professional 等
3.OFFICE又は、EXCELは何ですか?、x86、x64の別、
  バージョン、エディションも含めて記述してください。
  例:OFFICE 2013 x86 等、(x86=x32)
4.EXCELが、インストールされていない環境での動作は、考えていますか?
  ブックからの入力だけであれば、OleDB / ODBC で、取得可能な物もあります。
  ブックへの出力は、EXCELインストール環境下では、Microsoft.Office.Interop.Excel、VSTOなど
  インストールされていない環境&楽する為には、サードパーティー製の、スプレッドシート機能など。
  但しシート上にActive-X コントロールがある場合は、別途考慮が必要。
5.魔界の仮面弁士さんが、紹介してくださった機能や、有償で購入可能な、
  VB.NETで使用可能な、スプレッドシート機能の、使用の可否は?
  有償品は、そこそこの値段がします。
6.配布はどうしますか?⇒自分だけが使えればよい等

>> ドラッグ&ドロップし
>ドロップされたファイル名を取得する方法は、下記を参照してみて下さい。
>http://dobon.net/vb/dotnet/control/droppedfile.html
>これでファイル名を得た後、そのファイルの中身を読み取り、
>その内容を編集して別名保存するという流れになりますね。
>上記は出来ましたが。。
>ファイルの中身をFormのテキストボックスに結び付ける方法がわかりません。
>甘えてばかりですがよろしくお願いします。
と、書かれていますが、
実際に、
>これでファイル名を得た後、そのファイルの中身を読み取り、
>その内容を編集して別名保存するという流れになりますね。
迄出来たのですか?
ココまで出来たのであれば、あとは、ブック上のシートデータを
どうやって、VB.NET フォーム上のコントロールと結びつけるかになりますが、
出来ていなければ、その様に、書かれた方が良いです。
投稿者 中年初心者  (社会人) 投稿日時 2015/7/1 16:12:50
まちがいがありました。

2、もテキストボックスと結び付して文字&数字を入れたいのです。 

> ドラッグ&ドロップし
ドロップされたファイル名を取得する方法は、下記を参照してみて下さい。
http://dobon.net/vb/dotnet/control/droppedfile.html

これでファイル名を得た後、そのファイルの中身を読み取り、
その内容を編集して別名保存するという流れになりますね。

上記は出来ましたが。。
ファイルの中身をFormのテキストボックスに結び付ける方法がわかりません。
甘えてばかりですがよろしくお願いします。


投稿者 (削除されました)  () 投稿日時 2015/7/1 15:55:21
(削除されました)
投稿者 中年初心者  (社会人) 投稿日時 2015/7/1 15:43:09
daive 様 魔界の仮面弁士様

早々の返信ありがとうございます。

自分ではわかっているのですが。。説明が本当に下手ですいません。

ファイルは.xlsで指定の見積書ですが担当によって項目は同じですが書き込む所が変更になります。
しかし各項目は同じです。
それを.NET側のFormのテキストボックスと結び付けしたいのです。

1,テキストボックスにファイル名の取得!それが商品名になります。
2, 空白なのでそこに文字&数字を入れる。それが30項目ぐらいあります。

とりあえずそこまで出来ればと今は思っています。

超簡単なシステムは作った事があります。
ただ自分の難点は取説とか作るのが苦手なので
説明も下手です。よろしくお願いします。




投稿者 魔界の仮面弁士  (社会人) 投稿日時 2015/7/1 15:21:18
> ドラッグ&ドロップし
ドロップされたファイル名を取得する方法は、下記を参照してみて下さい。
http://dobon.net/vb/dotnet/control/droppedfile.html

これでファイル名を得た後、そのファイルの中身を読み取り、
その内容を編集して別名保存するという流れになりますね。


> 既存のExcelファイル

これは CSV ファイルやタブ区切りテキストではなく、
*.xlsx ファイルのことでしょうか?

CSV 出力であれば、「VB CSV 出力」などのキーワードで検索すれば、
いろいろなサンプルが見つかるかと思います。基本的には、
VB.NET や .NET Framework の標準機能だけで処理できるでしょう。


一方、Excel のバイナリファイルだとすると、読み書きには
出力可能な専用ライブラリが別途必要となり、実装難易度が上がります。

Excel 出力可能ならライブラリの例:
 ・EPPlus
 ・NPOI
 ・ClosedXML
 ・Microsoft.Office.Interop.Excel
 ・ACEDAO
投稿者 daive  (社会人) 投稿日時 2015/7/1 15:11:10
という、思いはかかれていますが、

具体的に、
1.プログラムをどの様に組むのかという、質問なのか?
2.掲示の機能が、あるかないかの質問なのか?
3.はたまた、??

1.の場合は、
1-1.ドラッグドロップで、ファイル名の取得が出来る事。
1-2.何らかの方法で、ファイル情報を取得する事。
1-3. 。。。。。。
というように、機能を箇条書きしていって、
概略の必要な機能を、書き出します。
次に、仕様をまとめる為に、種々条件を考えます。
条件は、EXCELのブック側、VB.NETの側で、個別のもの、両方に関わるものなど
を、考慮します。

2の場合は、
そんな都合の良い、万能機能はありません。
なので、プログラムを作成する必要がでてきます。という回答になります。
ブックの状態、仕様、範囲名が付いているかとか、情報が全くありません。

書込みから、VB.NETでシステムを作成したことが無いように、見受けられます。
何か簡単な物を作る事や、
掲示通りの初心者であれば、
ここのサイトの、準備編から全部学習して、
ドットインストール
http://dotinstall.com/lessons
等の学習サイトで勉強されて、出来る様になる方もいらっしゃいますが、
確約はできません。
投稿者 中年初心者  (社会人) 投稿日時 2015/7/1 14:46:02
VB.NETから既存のExcelファイルをドラッグ&ドロップし
Formに設定してあるテキストボックスへ値を設定して各項目に書き込み別名で保存したいのですが
いろいろなところでも調べてみたのですが出てこず質問させて頂きました。

これは、現在指定の見積書がありVBで書き込み保存し別で一覧を作りたいからです。

説明が本当に下手なのですがよろしくお願いします。