tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルエクセルの読込について
記事No10916
投稿日: 2012/09/04(Tue) 15:54
投稿者モモカツ
最近、『VB2010からExcelを操作するためのワンポイントテクニック集』が追加となり参考にさせていただいております。

このたびの追加集を拝見していますが、既存のエクセルファイルの内容を読込むようなサンプルを探していますが見当たらないように思います。
もしかしたら、当方が探し切れていないのかもしれませんが、参考となるサンプルを教えてください。

ちなみに現在、参考にさせていただいているサンプルは以下の通りで、VB2010で設定したデータをエクセルファイルへ出力後、印刷することは出来ています。
次のステップで印刷とは別のエクセルファイルの内容を読んで、VB2010で設定したデータをチェックしたいと考えており、既存のエクセルファイルの読込む方法を探しております。

1.Excel の起動・終了に関する設定
2.VB2010 から Excel へのデータの入力処理及び起動・終了処理例
3.VB2010 から Excel の既存のファイルを印刷

よろしくお願いします。

[ツリー表示へ]
タイトルRe: エクセルの読込について
記事No10917
投稿日: 2012/09/04(Tue) 17:53
投稿者VBレスキュー(花ちゃん)
> 最近、『VB2010からExcelを操作するためのワンポイントテクニック集』が追加となり参考にさせていただいております。
>
> このたびの追加集を拝見していますが、既存のエクセルファイルの内容を読込むようなサンプルを探していますが見当たらないように思います。

.NETからExcelの基本的な操作方法
http://www.hanatyan.sakura.ne.jp/dotnet/Excel01.htm

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
  Call ExcelOpen("", "")   '新規ファイルをオープンして、Excel を起動
  '既存のファイルをオープンして、Excel を起動する場合 (ファイルのフルパス , シート名)
  'Call ExcelOpen(System.IO.Path.GetFullPath("..\..\..\data\DBTest.xls"), "Sheet1")
'---------------------------------------------------------------------------------------------------

上記のコメントの部分に書いていますが。?

詳細は、Private Sub ExcelOpen(ByVal FilePath As String, ByVal SheetName As String) 内を
参照して下さい。



又、下記やサンプル投稿用掲示板のサンプルにも書いていたはずですが
 http://www.hanatyan.sakura.ne.jp/dotnet/Excel06.htm
こちらは、既存のファイルをオープンしております。

[ツリー表示へ]
タイトルRe^2: エクセルの読込について
記事No10918
投稿日: 2012/09/04(Tue) 20:39
投稿者モモカツ
> > 最近、『VB2010からExcelを操作するためのワンポイントテクニック集』が追加となり参考にさせていただいております。
> >
> > このたびの追加集を拝見していますが、既存のエクセルファイルの内容を読込むようなサンプルを探していますが見当たらないように思います。
>
>  .NETからExcelの基本的な操作方法
>  http://www.hanatyan.sakura.ne.jp/dotnet/Excel01.htm
>
> Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
>   Call ExcelOpen("", "")   '新規ファイルをオープンして、Excel を起動
>   '既存のファイルをオープンして、Excel を起動する場合 (ファイルのフルパス , シート名)
>   'Call ExcelOpen(System.IO.Path.GetFullPath("..\..\..\data\DBTest.xls"), "Sheet1")
> '---------------------------------------------------------------------------------------------------
>
> 上記のコメントの部分に書いていますが。?
>
> 詳細は、Private Sub ExcelOpen(ByVal FilePath As String, ByVal SheetName As String) 内を
> 参照して下さい。
>
>
>
> 又、下記やサンプル投稿用掲示板のサンプルにも書いていたはずですが
>  http://www.hanatyan.sakura.ne.jp/dotnet/Excel06.htm
> こちらは、既存のファイルをオープンしております。

ご回答いただきましてありがとうございます。
エクセルファイルのシート名を指定してオープンできていましたが、シート内のデータの読み方がわかりませんでした。
質問した後にいろいろとトライしてみたところ、以下のようにしたら読めたのですが、このような方法で大丈夫でしょうか。

Dim Xls_Data(1000, 20)
Dim Buf_Data(11, 10) As Object   ' エクセルの必要な部分だけを読込む
xlRange = xlSheet.Range("A1:J11")   ' 変数代入を先頭から11行目/先頭列から10列目に設定
Buf_Data = xlRange.Value
MRComObject(xlRange)

For i = 1 To 11
   For j = 1 To 10
      Xls_Data(i - 1, j - 1) = Buf_Data(i, j)
   Next
Next

なお、Buf_Data(11, 10)の2次元配列にしてデバッガ−で変数内容を見ると(0,0)から入力されていますが、この変数を使用してFor-Next文内でIf文で判断する際に“インデックスが配列の境界外です”とエラーとなります。
そこで、変数の先頭を(1,1)と+1した位置で使用するとエラーがなくなりましたので、エクセルから読込んだ変数からソフトで使用する変数に代入しなおしました。

エクセルのデータを読込んだ場合、このような動作するのは正常なのでしょうか。

[ツリー表示へ]
タイトルRe^3: エクセルの読込について
記事No10923
投稿日: 2012/09/07(Fri) 09:34
投稿者VBレスキュー(花ちゃん)
> For i = 1 To 11

.NET 系では、配列の下限は、 0 からとなります、従って

For i = 0 To 11
   For j = 0 To 10

のようにするべきです。
VB6.0 や VBA では、Option Base ステートメント で、配列の添字の最小値の既定値を設定
できましたが、設定していない場合は、0 からとなります。

又、Dim Buf_Data(11, 10) As Object のように配列を宣言した場合、VB6.0(VBA) でも.NET 系でも
12個 と 11個 の要素数の配列を宣言した事になります。
http://msdn.microsoft.com/ja-jp/library/dd297713.aspx

※ 不要な引用は、避けて下さい。又、質問内容を変更されるのなら別にスレッドを立てて下さい。

[ツリー表示へ]
タイトルRe^4: エクセルの読込について
記事No10925
投稿日: 2012/09/07(Fri) 23:00
投稿者モモカツ
VBレスキュー(花ちゃん)さま

ご回答いただきありがとうございます。
今回の質問に対する疑問などは解消しました。

今後も当サイトを参考とさせていただきます。

> > For i = 1 To 11
>
> .NET 系では、配列の下限は、 0 からとなります、従って
>
> For i = 0 To 11
>    For j = 0 To 10
>
> のようにするべきです。
> VB6.0 や VBA では、Option Base ステートメント で、配列の添字の最小値の既定値を設定
> できましたが、設定していない場合は、0 からとなります。
>
> 又、Dim Buf_Data(11, 10) As Object のように配列を宣言した場合、VB6.0(VBA) でも.NET 系でも
> 12個 と 11個 の要素数の配列を宣言した事になります。
>  http://msdn.microsoft.com/ja-jp/library/dd297713.aspx
>
> ※ 不要な引用は、避けて下さい。又、質問内容を変更されるのなら別にスレッドを立てて下さい。

[ツリー表示へ]