@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

txtファイルデータの一部を既存Excelファイルへの貼り付け方法

1
投稿者投稿内容
bigbook
会議室デビュー日: 2007/08/29
投稿数: 3
投稿日時: 2007-08-29 19:09
Windows XP SP2
Excel 2000 SP3
Visual Basic 2005 Express Edition
Micrsoft Excel 9.0Obuject Library 1.3

初めまして、お世話になります。bigbookです。
VBを最近入手しまして、習得中のド素人であり、
皆様に見当外れなお聞きするかも知れませんがご了承願います。

現在、ローカルPC内で、既存Excelファイルにtxtファイルのデータの
一部を貼り付けるプログラムを作成しています。

貼り付け方法として、txtファイルのデータをExcelファイルで表示させ、
セルA12〜D275のデータを貼り付けたいと考えています。
その先、コピーが良いのか、配列が良いのかは、プログラムの作成が
そこまで至っていないのが現状です。

プログラムが出来ている所
既存Excelファイルが開ける。
txtデータがExcelファイルで開ける。

現在、行き詰まっている所
txtデータのセルを選択したいがデバッグにてエラーが下記箇所に発生し、対処が出来ない。

xlsSheetT = xlsBookT.Worksheets

エラー内容
MissingMemberExceptionはハンドルされませんでした。
公開メンバ 'Worksheets' は型 'Boolean' に見つかりませんでした。

ご教授して頂きたいこと。
・エラーの対処方法
・Excelファイルへtxtデータの貼り付け方法が、もし小生のやり方が邪道であるならば
 もっとも適した手法と参考資料?
・その他プログラムのおかしい所
 COM参照の開放が出来ていないは、認識しています。(着手出来てません)
 txtファイルを開く際のプログラムは何となくおかしいかな?(一応デバッグOK)

各方便から参考にして作成したプログラム

Dim xlsApp As Object
Dim xlsBook As Object
Dim xlsBookT As Object
Dim xlsSheet As Object
Dim xlsSheetT As Object

xlsApp = CreateObject("Excel.Application")
'[FileNameCP]のリストボックスからフルパスの既存エクセルファイルを開く。
xlsBook = xlsApp.Workbooks.Open(FileNameCP)

'作業したいシートの番号を選択する。
Dim A As Integer = TextBox1.Text
xlsSheet = xlsBook.Worksheets(A)
xlsApp.Visible = True

'[FileNameup1]のリストボックスからフルパスのtxtファイルをエクセルファイルで開く。
xlsBookT = xlsApp.Workbooks.OpenText(Filename:=FileNameup1, StartRow _
:=1, DataType:=1, TextQualifier:=1, _
ConsecutiveDelimiter:=False, TAB:=True, Semicolon:=False, Comma:=True, _
Space:=False, Other:=False)

xlsSheetT = xlsBookT.Worksheets 'ここでエラーが発生
   
 ’対処出来ないため、これ以降は、未検証。
xlsSheetT.Cells.Select()    
xlsSheetT.Cells.EntireColumn.AutoFit()
xlsSheetT.Range("A10").Select()
xlsApp.Visible = True


txtファイルのデータの一部
Excelへ貼り付けしたいデータは、"A", "B", "C", "D", "E"以降の数値

Label:, CH1,,,
DateTime:, Thu May 17 15:13:35 2007,,,
DataKind:, CH1,,,
DataPoints:,264,,,
DataCalc:,,,,
Frequency:,0,2000,,
Sample:,2048,,,
Average:,283,,,
Voltage(CH1):,0,,,

"A", "B", "C", "D", "E"
1.00E+03,3.66E-01,3.71E-01,2.35E-01,3.47E-01
1.02E+03,3.66E-01,3.49E-01,4.14E-01,6.85E-01
1.03E+03,3.35E-01,3.39E-01,4.96E-01,6.15E-01
1.05E+03,3.45E-01,3.83E-01,6.62E-01,6.04E-01
1.07E+03,3.51E-01,4.50E-01,5.43E-01,4.94E-01
1.10E+03,5.39E-01,4.60E-01,1.54E-01,4.28E-01
1.14E+03,5.91E-01,6.57E-01,1.70E-01,2.14E-01
1.19E+03,3.71E-01,7.77E-01,1.14E-01,1.92E-01
1.21E+03,6.85E-02,3.98E-01,9.00E-02,1.17E-01
1.25E+03,1.31E-01,8.31E-01,2.99E-01,3.28E-01
1.29E+03,2.43E-01,9.68E-01,4.76E-01,1.96E-01
1.34E+03,3.06E-01,1.22E+00,5.17E-01,1.85E-01
1.39E+03,2.04E-01,1.44E+00,1.10E+00,3.67E-01
1.44E+03,2.13E-01,1.53E+00,1.23E+00,3.52E-01
1.49E+03,3.78E-01,1.85E+00,9.10E-01,3.52E-01
1.51E+03,4.13E-01,1.66E+00,8.38E-01,3.04E-01
1.55E+03,6.87E-01,1.75E+00,4.84E-01,3.57E-01
以下数値のデータが続く。

_________________
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2007-08-29 19:56
私は以前このページを参考にしました。

http://support.microsoft.com/kb/306022/ja
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-08-29 20:05
引用:

bigbookさんの書き込み (2007-08-29 19:09) より:

ご教授して頂きたいこと。
・エラーの対処方法


まずは例外の内容を理解することから始めるべきだと思いませんか? それと例外が発生している箇所だけを見ていると正解にたどりつきにくくなる場合もあります。

引用:

xlsBookT = xlsApp.Workbooks.OpenText...


意味がわからなければ、ここの戻り値の型が何たるかを意識してください。 調べてみれば例外の意味も理解できるハズです。

引用:

・Excelファイルへtxtデータの貼り付け方法が、もし小生のやり方が邪道であるならばもっとも適した手法と参考資料?


テキスト ファイルをわざわざ Excel Object Library の OpenText メソッドで開く必要がありません。 私だったら .NET Framework の StreamReader なりでテキスト ファイルを開き Read が完了したのち、Excel Workbook 側のマクロ (メソッド) に Read した文字列を渡すなりして委譲します。

引用:

・その他プログラムのおかしい所
 COM参照の開放が出来ていないは、認識しています。(着手出来てません)
 txtファイルを開く際のプログラムは何となくおかしいかな?(一応デバッグOK)


自身で挙げられた 2 点は確かにおかしいと思います。 その他気になったことですが、最初のミスは System.Object 型、つまり遅延バインディングだったため見抜けなかったミスです。 型を明示化してこういったコーディング ミスを失くした方が良いでしょう。 他の部分でも型を意識できていない箇所があります。 .NET は型があってこそのテクロノジですから型を意識しましょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
bigbook
会議室デビュー日: 2007/08/29
投稿数: 3
投稿日時: 2007-08-30 10:26
こあらさん・じゃんぬねっとさん
早速のご指導ありがとうございます。

こあらさんへ
確認し、参考にさせて頂きます。

じゃんぬねっとさんへ
引用:
--------------------------------------------------------------------------------

まずは例外の内容を理解することから始めるべきだと思いませんか? それと例外が発生している箇所だけを見ていると正解にたどりつきにくくなる場合もあります。
--------------------------------------------------------------------------------

おっしゃるとおりで何も言えません。申し訳ありません。
引用:
--------------------------------------------------------------------------------


意味がわからなければ、ここの戻り値の型が何たるかを意識してください。 調べてみれば例外の意味も理解できるハズです。
--------------------------------------------------------------------------------

憶測ですが、ExcelのWorkbookでtxtを開き、xlsBookTに代入?するとの程度しか理解していません。
戻り値・型とは、何ぞや?って感じです。基本が出来ていない(知らない)事は十分理解しています。
引用:
--------------------------------------------------------------------------------


テキスト ファイルをわざわざ Excel Object Library の OpenText メソッドで開く必要がありません。 私だったら .NET Framework の StreamReader なりでテキスト ファイルを開き Read が完了したのち、Excel Workbook 側のマクロ (メソッド) に Read した文字列を渡すなりして委譲します。
--------------------------------------------------------------------------------

こあらさんのご指導と同じことをおっしゃっているのか現状では、解りませんので調べて視ます。
愚問で申し訳ありませんが、Excel Workbook 側のマクロ (メソッド) とは、貼付ける側のExcelファイルにマクロを作成すると言うことでしょうか?
出来れば、貼付ける側のExcelファイルには、VBAなどを入れたく無いのですが・・・。

いろんな方のプログラムを真似て学んでいるつもりですが、やはりいけませんね。
兎にも角にも基礎をしっかり勉強し、理解しなければいけないと思っています。基礎が出来なければ応用も出来ないので。
じゃんぬねっとさんは、いろんな方の質問に対し、沢山解答されており、プログラムを熟知されているんですね。
今のレベルに達するまでに大変苦労されたと思います。
昨今、色んな文献が多数あり、どれから着手したら良いか解らないのが現状です。
もし、宜しければじゃんぬねっとさんの経験を基にアドバス頂けたら幸いです。


_________________
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-08-30 15:47
引用:

bigbookさんの書き込み (2007-08-30 10:26) より:

おっしゃるとおりで何も言えません。申し訳ありません。


ちょっと私の書き方がまずかったかもしれませんが、責めているわけではないです。 とりあえず、最初に原因から探ってみましょうか。

引用:

憶測ですが、ExcelのWorkbookでtxtを開き、xlsBookTに代入?するとの程度しか理解していません。戻り値・型とは、何ぞや?って感じです。基本が出来ていない(知らない)事は十分理解しています。


ここがちょっと間違っています。 それにしても戻り値・型を知らずしてコーディングは少々無謀かと思われます。 説明はしてみますが、仮にまったく理解できないようであれば、「急がば回れ」 ということになると思います。

引用:

xlsBookT = xlsApp.Workbooks.OpenText...


ここですが OpenText メソッドの戻り値を xlsBookT が受け取っています。 こいつの戻り値の型、bigbook さんは 'Excel.Workbook' 型になると考えていらっしゃいますよね。 ですが実際には違うのです。 'Excel.Workbook' 型でないからこそ、

引用:

xlsSheetT = xlsBookT.Worksheets 'ここでエラーが発生


ここで例外が発生します。 先ほどの OpenText メソッドで受け取った 'xlsBookT' を利用していることに着目してください。 ここから Worksheets というメンバを呼び出そうとしていますが、これは 'xlsBookT' に格納されたデータの型が 'Excel.Workbook' でなければ呼び出すことができません。

ここまで何となく理解できましたら、次に例外の内容をご覧になってください。

引用:

MissingMemberExceptionはハンドルされませんでした。
公開メンバ 'Worksheets' は型 'Boolean' に見つかりませんでした。


私が先までに解説したことと似た内容だと感じましたか? MissingMemberException という名前のとおり、「'Worksheets' というメンバが見つからない」 と言っています。

引用:

xlsSheetT = xlsBookT.Worksheets 'ここでエラーが発生


その 'Worksheet' とは、もちろんこいつのことです。
例外の内容の後半にある

引用:

型 'Boolean' に見つかりませんでした。


この部分にも着目してください。 これは、'xlsBookT' に格納されたデータ型が Boolean 型であると言っているわけです。 ここに bigbook さんが考えているものと実際のソースとの間でズレがあることがわかります。 bigbook さんは 'Excel.Workbook' 型だと思っている変数に、'Boolean' 型が格納されているのです。

Boolean 型には Worksheets なるメンバはありませんから 「そんなメンバなんてないよ」 という意味を示す 'MissingMemberException' という例外が発生します。

答えも含めて書かせて頂いていますが、ここまでの話の理屈は理解しておいた方が良いと思います。 ここが理解できないと、今後も型にまつわる問題で困ることになると思うからです。 その問題の数はきっと多いです。

引用:

愚問で申し訳ありませんが、Excel Workbook 側のマクロ (メソッド) とは、貼付ける側のExcelファイルにマクロを作成すると言うことでしょうか?出来れば、貼付ける側のExcelファイルには、VBAなどを入れたく無いのですが・・・。


軽く説明しますと、その場合は ScriptControl を使って VBA のコードを .NET 側に書いて実行することができます。

引用:

いろんな方のプログラムを真似て学んでいるつもりですが、やはりいけませんね。兎にも角にも基礎をしっかり勉強し、理解しなければいけないと思っています。基礎が出来なければ応用も出来ないので。


私も何事もそうだと思います。 テストで良い点を取れれば良いという勉強法はこの世界では通用しなくて、自分で応用できるか、自分で調査できるか、理解するための引き出しがあるかどうかが非常に重要になります。

引用:

じゃんぬねっとさんは、いろんな方の質問に対し、沢山解答されており、プログラムを熟知されているんですね。今のレベルに達するまでに大変苦労されたと思います。昨今、色んな文献が多数あり、どれから着手したら良いか解らないのが現状です。もし、宜しければじゃんぬねっとさんの経験を基にアドバス頂けたら幸いです。


そんな熟知しているつもりはありません。 また私はここ数年、プログラマとは言えないような仕事をしています。 それでも時間は作るようにしています。 これは好きだからなのでしょう。 よって、重要なのは好きになれるかどうかではないでしょうか。 面白いと感じれば自然と覚えられると思います。(仕事だと考えてしまうと、それが難しいのですけど...)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
bigbook
会議室デビュー日: 2007/08/29
投稿数: 3
投稿日時: 2007-08-31 13:23
じゃんぬねっとさん
恐らく、仕事の合い間をぬってのご教授、ありがとうございます。

引用:--------------------------------------------------------------------------------

xlsBookT = xlsApp.Workbooks.OpenText...

--------------------------------------------------------------------------------

ここですが OpenText メソッドの戻り値を xlsBookT が受け取っています。 こいつの戻り値の型、bigbook さんは 'Excel.Workbook' 型になると考えていらっしゃいますよね。 ですが実際には違うのです。 'Excel.Workbook' 型でないからこそ、
--------------------------------------------------------------------------------

じゃんぬねっとさんのおっしゃる通り、xlsApp.Workbooksで開けば、'Excel.Workbook' 型になると思っていました。

引用: --------------------------------------------------------------------------------

xlsSheetT = xlsBookT.Worksheets 'ここでエラーが発生

   --------------------------------------------------------------------------------

ここで例外が発生します。 先ほどの OpenText メソッドで受け取った 'xlsBookT' を利用していることに着目してください。 ここから Worksheets というメンバを呼び出そうとしていますが、これは 'xlsBookT' に格納されたデータの型が 'Excel.Workbook' でなければ呼び出すことができません。
--------------------------------------------------------------------------------
bigbook が’Dim xlsBookT As Object ’で変数の型宣言が'Excel.Workbook型' になるだろうと思っていたが、
VB側が別の型(Boolean)を暗黙の宣言していたからエラーが発生したのですね。

仮に当初の目的であったtxtデータをExcelファイルで開き、コピーなり、配列したいのであれば、

Dim xlsApp As Object
Dim xlsBook As Object
Dim xlsBookT As Object
Dim xlsSheet As Object
Dim xlsSheetT As Object

の変数の型宣言をしっかりとExcelの関係に宣言すれば解決できる問題なのでしょうか?
とりあえず、bigbook が考えた手法でセルの選択までが出来てから、こあらさん・じゃんぬねっとさんからご指導頂いた手法を勉強したいと思います。
でないと中途半端になってしまいますのでご了承願います。
_________________
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-08-31 15:07
引用:

bigbookさんの書き込み (2007-08-31 13:23) より:

仮に当初の目的であったtxtデータをExcelファイルで開き、コピーなり、配列したいのであれば、

Dim xlsApp As Object
Dim xlsBook As Object
Dim xlsBookT As Object
Dim xlsSheet As Object
Dim xlsSheetT As Object

の変数の型宣言をしっかりとExcelの関係に宣言すれば解決できる問題なのでしょうか?


これだけでは当問題は解決できません。 が、コンパイルの段階で間違いに気付くことができます。 コンパイラが型チェックをしてくれるからです。 今回のように実行時ではじめて不具合に気付くと問題の発見が遅れます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)