• 締切済み

VB.NET Excelの読み取り(ループ処理)

VB.NETでExcelをループ処理で読み取る際に、While文を使用して1行ずつ読み込む処理をするのですが、皆さんはどのようにして書かれてますか? While文の条件は「空白の行が見つかったらループを辞める」という条件で処理をするのですが、書き方がいまいちピンとこないので、皆様の情報を参考にさせて頂ければと思いました。 ・Excelのデータは約3000~4000件ほど(データによって件数は若干変動) ・Excelの6行目(A:6)から読み込む 是非ともよろしくお願いいたします。

みんなの回答

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.5

個人的には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)
回答No.4

こんにちは! 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)は割愛しますが、その他にもいろいろ方法はあります。

回答No.3

そのとおりです。StreamReaderはストリームの読み込みであるためexcelには使えません。excel操作に使えるのは、excel(バージョンごとに用意されたliblaeryに用意されています。例としてliblary10とか)これをimportして(選択する画面がありそこをチェックすることに利用可能) となります。

回答No.2

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ですのでバージョンにより使うクラス が異なってくると思いますのでお手元のバージョンにより調査する必要があるかと思います。

NBOSS55
質問者

補足

詳しく記載いただきましてありがとうございます。 大変参考になります。 一点だけ気になったのですが、StreamReaderはExcelの読み込みにも使えるのでしょうか? 私が勉強不足で申し訳ないのですが、StreamReaderは主にテキストを読み込むときに使い、Excelでは使えないと過去に聞いたことがありまして...。 間違えて理解していたら申し訳ありません。

回答No.1

excelは、一行がレコードという概念でなく、列がひとつのオブジェクト という概念なので、列ごとに読み込みを行ったほうが効率的です。 3000-4000件ということなので、余裕を持って列5000件 を範囲として、それを項目数分繰り返せば、効率的に取り込めます。 一度、メモリに格納してから、1行ずつ処理すればよいと思います。 なお、行をレコードとして読み込んだ場合、処理効率が悪く、処理速度もかなり遅くなると思います。

NBOSS55
質問者

補足

回答ありがとうございます。 説明して頂いた概要よく理解できました。 ただ、今回の場合なのですが、どのように記述すれば良いか?というのがひらめかないため苦戦している状況です。 普段はWhile文をほとんど使用しないので、条件式の書き方が出てこないような感じです。 なので、簡単なものでも大丈夫ですので、どのような書き方をされるのか見させて頂ければと考えており、そこから参考にしたいと思っています。 もしお手間でなければ簡単なサンプルを教えてくださると助かります。(ネットで探してもWhile文を利用したExcelの読み込み方法の情報が少ないので...)

関連するQ&A

  • .netからexcel操作の処理速度が異常に遅い

    VB2005にてエクセルへ値をセットし印刷するPGを作成しております。 その際、データ件数が200件ほどしかないのですが すべてセットし印刷が始まるまで3分ほどかかります。 特にややこしい処理ではなく、for文でループさせながら セットしているだけです。 range、cellsどちらでやっても変わらずでした。 これくらいかかるのが普通なのでしょうか??

  • ループ内での条件処理

    ループ内で、ある条件の時だけ処理をする場合は、どういう書き方しますか? 例えば、私は while(ループ条件) { if (判定==false) continue; 処理 } ってやります。

    • ベストアンサー
    • Java
  • Excel のVBA ループ処理について

    マクロの歴が浅く、いまひとつ処理のロジックがわかりません。どなたかご教示下さい。 A列には番号が振ってあり、B列にはデータがあります。 ここで、番号で分けられているデータは7項目ある状態で、A列の番号をキーにして、ループ処理をさせたいと思っています。 データを上から順番に見ると、A1には番号1があり、1のデータはB1からB7まで書き込まれている配列になっています。この配列が、番号がnまで続く時のループ処理がわかりません。つまりA1の番号の下、A2からA7までは空白で、A8に番号2があり、この2のデータがB8からB14まで番号1と同様のデータが並んでいる配列です。 間に空白の無い場合の処理はわかるのですが、この様な場合、どういう処理を行えばよろしいのでしょうか?

  • エクセルのループ処理について

    ループ処理で、2つのシートを内容を比較して 一方のシートにあったデータを別のシートのリストから削除しています。しかし、単純なループ処理でやるとすごく時間がかかるので早く処理する方法を教えていただければと思います。 シートA(3000件)とシートB(5000件程度)があり,AとBともにデータのソートを行なっています。そして、 シートAの特定セルのデータを順番に読み、その内容がシートBのあるセルのデータと一致するか検索し、セル値が同じ場合、シートBの行を削除するような仕組みです。 よろしくお願いいたします。

  • エクセルのマクロでループ処理

    エクセルのマクロで、ループを使っています 下の様な感じです。 sub TEST() a: re=re+1 if ○○=○▲ THEN GOTO b: 処理・・・ goto a: b: end sub() ですが、これの書き方はDo WhileやDo Untilを使った方が 早く処理できるのでしょうか? また、書き方等もお教え下されば助かります。

  • 【VB】セルが空になるまで処理を繰り返したい

    Excel VBAを使用してです。 列Aにデータがずらっと入っています。 そのデータを列Bに、 Do while ~loop か Do until ~loopを使って データが無くなるまでコピーするという処理を書きたいのです。 VB歴が浅いためひらめきません。よろしくお願いします。m(__)m

  • エクセルのデータの処理はVB?orVBA?

    エクセルのデータを処理するときVBAとVBどちらで処理することが多いですか? また、処理する理由は何ですか? 自分はVBAで処理していますが、VBAだとメモリがたりなくなったり、処理に時間がかかるので困っています。 VBAで処理する理由は、はじめに学んだからです。 VBで処理するように変えようか迷っています。 教えていただけないでしょうか? よろしくお願いします。

  • 10進ベーシックでループを抜けたい

    for文で作った2重ループの中にif文があります。 if文の条件を満たしたらループを抜けるようにしたいのですが、 「goto 行番号」や「EXIT FOR」 を使ってもうまくいきません。 一度に2重ループを抜けたいのですが、どうすればいいでしょうか?

  • エクセルでデータの個数

    エクセルで文字列のデータが入っている件数を把握する 方法を教えてください。 データは空白のものがランダムに入っていて、その列または 行の空白を除くデータの件数を把握する方法を教えてください。

  • VB及びエクセルのVBAにて、

    VB及びエクセルのVBAにて、 300000行のCSVデータを読み込もうと試みました。 ファイルOpenで、Line InputやInputBを使用しましたが、 どちらもあまり処理速度は変わらないようです。 高速で1行ずつCSVデータを読み込む方法をご存じないでしょうか。 ご存知でしたら、関連するサイトを教えていただければ助かります。 お手数をおかけしますが、よろしくお願いします。

専門家に質問してみよう