- 締切済み
VB.NET Excelの読み取り(ループ処理)
VB.NETでExcelをループ処理で読み取る際に、While文を使用して1行ずつ読み込む処理をするのですが、皆さんはどのようにして書かれてますか? While文の条件は「空白の行が見つかったらループを辞める」という条件で処理をするのですが、書き方がいまいちピンとこないので、皆様の情報を参考にさせて頂ければと思いました。 ・Excelのデータは約3000~4000件ほど(データによって件数は若干変動) ・Excelの6行目(A:6)から読み込む 是非ともよろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- n-jun
- ベストアンサー率33% (959/2873)
個人的にはWhile文よりDo~Loopの方をよく使いますね。 セルの値が "" であったなら終了みたいな。 ただExcel部分をどのように書かれているのかでも参考コードは違うかもです。 i = 6 Do ? = xlsheet.Range("A" & i.Tostring).Value ? を何かにか使う??? i += 1 Loop Until xlsheet.Range("A" & i.Tostring).Value = "" '次の処理 みたいな感じですがここに直接打ち込んだので未検証になってます。
- scutotto
- ベストアンサー率100% (1/1)
こんにちは! VB.NETでExcelを読み取った後に内部的にメモリに格納すると思いますが、何に格納するかによっても何パターンかのシートからの取得方法があると思います。 (1)配列に格納する (2)DataTableに格納する (3)カスタムクラスのリストに格納する (1)の配列に格納する場合ですと、 1.対象のシートのデータが格納されている範囲の開始アドレスを求める 2.対象のシートのデータが格納されている範囲の終了アドレスを求める 3.上記アドレスを指定してExcelのRangeオブジェクトを使用してシートの対象範囲のデータを取得する 4.上記Rangeオブジェクトの内容を2次元配列に格納する 大まかに書けば上記の通りです。 Dim xlsRange As Range = Nothing ' A1形式セルアドレス Dim A1CellAddress As String = String.Empty ' A1形式セルアドレス(範囲終了セル用) Dim A1CellAddressEnd As String = String.Empty A1CellAddress = "A1" A1CellAddressEnd = "D10" Dim excelDataArray(9, 3) As Object ' targetSheet:対象のシート 適宜事前に宣言してください。 xlsRange = targetSheet.Range(A1CellAddress, A1CellAddressEnd) excelDataArray = CType(xlsRange.Value, Object(,)) (2)のDataTableに格納する場合ですとExcelシートに対してSQL文を発行して直接DataTableに格納することも可能です。 ADO.NETでExcelファイルに接続する https://qiita.com/unarist/items/6cc35bb9fe502ced332f (3)は割愛しますが、その他にもいろいろ方法はあります。
- ToOrisugaru
- ベストアンサー率28% (80/280)
そのとおりです。StreamReaderはストリームの読み込みであるためexcelには使えません。excel操作に使えるのは、excel(バージョンごとに用意されたliblaeryに用意されています。例としてliblary10とか)これをimportして(選択する画面がありそこをチェックすることに利用可能) となります。
- ToOrisugaru
- ベストアンサー率28% (80/280)
excelの読み込みということは関係なくwhileの使い方例としては このような形となります。これは順編成ファイルの読み込みです Dim i As Long = 0 Dim sr As System.IO.StreamReader Dim sr As System.IO.StreamReader While sr.Peek() > -1 pRecord = sr.ReadLine() ReDim Preserve pRecords(i) pRecords(i) = pRecord i += 1 End While となります。 なお、excelの読み込み時はすでに読み込むべきレンジが解っているのでwhileではなく以下の方式で読み込みます。 Dim Finding As Range Dim CurRange As String Dim Data(,) As Object Dim Idx1 As Integer ReDim Preserve Data(Value.length - 1, 0) For Idx1 = 0 To Value.length - 1 Data(Idx1, 0) = Value(Idx1) 'valueは既にexcelの内容を読み込ん 'で取り込んだ状態(型 object) Next なお、読み込み時のみ(この前にも色々と手続きがるのですが) これもレンジ指定となるので以下の方式で読み込みます。なので while等の繰り返し分は発生しません。 Dim Finding As Range Dim Var As Object Finding = PxlSheet.Range(Range) Var = Finding.Value2 System.Runtime.InteropServices.Marshal.ReleaseComObject(Finding) なお、私の環境では、excel2007ですのでバージョンにより使うクラス が異なってくると思いますのでお手元のバージョンにより調査する必要があるかと思います。
- ToOrisugaru
- ベストアンサー率28% (80/280)
excelは、一行がレコードという概念でなく、列がひとつのオブジェクト という概念なので、列ごとに読み込みを行ったほうが効率的です。 3000-4000件ということなので、余裕を持って列5000件 を範囲として、それを項目数分繰り返せば、効率的に取り込めます。 一度、メモリに格納してから、1行ずつ処理すればよいと思います。 なお、行をレコードとして読み込んだ場合、処理効率が悪く、処理速度もかなり遅くなると思います。
補足
回答ありがとうございます。 説明して頂いた概要よく理解できました。 ただ、今回の場合なのですが、どのように記述すれば良いか?というのがひらめかないため苦戦している状況です。 普段はWhile文をほとんど使用しないので、条件式の書き方が出てこないような感じです。 なので、簡単なものでも大丈夫ですので、どのような書き方をされるのか見させて頂ければと考えており、そこから参考にしたいと思っています。 もしお手間でなければ簡単なサンプルを教えてくださると助かります。(ネットで探してもWhile文を利用したExcelの読み込み方法の情報が少ないので...)
補足
詳しく記載いただきましてありがとうございます。 大変参考になります。 一点だけ気になったのですが、StreamReaderはExcelの読み込みにも使えるのでしょうか? 私が勉強不足で申し訳ないのですが、StreamReaderは主にテキストを読み込むときに使い、Excelでは使えないと過去に聞いたことがありまして...。 間違えて理解していたら申し訳ありません。