• 締切済み

VB2005で作成したエクセルファイルに問題が・・・。

お世話になっております。 VB2005にてまず大元のエクセルファイルを分割し、別ツールにて分割したファイルを読み込み、その後に読み込んだファイルを処理をしようとしています。 先に質問させていただき、分割はVBAコードを改変することで可能となりました。 http://oshiete1.goo.ne.jp/qa3739293.html(以前の質問です。) 問題は、その分割したファイルを当方の別ツールにてStreamReaderで読み込んだ際に起こります。 20行づつに分割したエクセルファイルでは、20行目以降には文字列は入っておりませんが、StreamReaderで読み込むと20行以上(もしくは以下)読み込んでしまい、ファイル内の情報を正しく読み取ってくれません。 ファイルの作成方法に問題があるのでしょうか。 それとも、StreamReaderではなく、別の方法で最終行までの文字列を読み込んだほうがいいのでしょうか。 ご教示いただければ幸いに思います。 宜しくお願いいたします。 以下、作成したコードです。 ~分割するコード~ Dim xlApp As Object = CreateObject("Excel.Application") Dim xlwb As Microsoft.Office.Interop.Excel.Workbook = xlApp.Workbooks.Open(TextBox1.Text) Dim xlsheet As Microsoft.Office.Interop.Excel.Worksheet xlsheet = xlwb.Worksheets("Sheet1") Dim d As String d = xlsheet.Range("A65536").End(Excel.XlDirection.xlUp).Row Dim sh1 As Excel.Worksheet sh1 = xlwb.Worksheets("Sheet1") '元データシート Dim rs As Integer = 20 Dim i As Integer Dim m As String = 1 MsgBox(d + "件ありました(=゜ω゜)ノ") '分割フォルダを作成 System.IO.Directory.CreateDirectory(System.IO.Directory.GetCurrentDirectory() + "\分割フォルダ") Dim s As Integer = 1 For i = 1 To d Step rs Dim dire As String = (System.IO.Directory.GetCurrentDirectory()) Dim xlFilePath As String = (dire + "\分割フォルダ\" + m + "つ目.csv") Dim xlApp3 As Object = CreateObject("Excel.Application") Dim xlwb3 As Microsoft.Office.Interop.Excel.Workbook = xlApp3.Workbooks.add Dim xlsheet3 As Microsoft.Office.Interop.Excel.Worksheet xlApp3.DisplayAlerts = False xlsheet3 = xlwb3.Worksheets("Sheet1") sh1.Range(sh1.Cells(s, "A"), sh1.Cells(s + rs - 1, "B")).Copy() xlsheet3.Paste() xlsheet3.SaveAs(xlFilePath) xlwb3.Close(True) xlApp3 = Nothing xlwb3 = Nothing xlsheet3 = Nothing m += 1 s = s + rs Next i MsgBox("分割OK♪") xlwb.Close(True) xlApp = Nothing xlwb = Nothing xlsheet = Nothing ~ファイルを読み込むコード~ Dim hReader As New System.IO.StreamReader(FileName) Dim lCount As Int64 While (hReader.Peek() >= 0) hReader.ReadLine() lCount += 1 End While MsgBox(lCount) hReader.Close()

みんなの回答

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

よくはわからないですが、Excelファイルに20行ずつ分割しても、 実際のシートの行数は6万行とかあります。 その辺の問題ではないのでしょうか? 例えばテキストファイル等にしてみたりは無理ですか? 経験がないので参考にならないかも知れませんが。 http://jeanne.wankuma.com/tips/stream/readtoend.html

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excelのシートをコピー

    環境は,Visual Studio 2005 Standard Editionです. プログラムを実行後,以下の例外が発生しました. 「HRESULT からの例外: 0x800A03EC」 発生場所は★の位置です. ここから------- Dim xlApp As Microsoft.Office.Interop.Excel.Application = Nothing Dim xlBook As Microsoft.Office.Interop.Excel.Workbook = Nothing Dim xlSheet As Microsoft.Office.Interop.Excel.Worksheet = Nothing xlBook = xlApp.Workbooks.Open("ファイルのパスが入ります") xlSheet = xlBook.Worksheets("シート名が入ります") Dim xlBook2 As Microsoft.Office.Interop.Excel.Workbook = Nothing Dim xlSheet2 As Microsoft.Office.Interop.Excel.Worksheet = Nothing xlBook2 = xlApp.Workbooks.Open("ファイルパスが入ります") xlSheet2 = xlBook.Worksheets("シート名が入ります") 'Excelを表示しない xlApp.Visible = False xlSheet.Copy(Before:=xlSheet2) ★ ここまで-------------- やろうとしているのは,xlSheet2のシートを含むExcelファイルに,xlSheet2の前にxlSheetをコピーする処理です. ★のところで上の例外が発生してしまいます. 以上,よろしくお願いします.

  • VB2005:Excelからの参照で教えてください

    下記のコードにてExcelからFindにて検索しセルの値を参照したいのですが 元データがフィルタにて表示されていない場合、ヒットしません。 SQLにて読み出す方法も試したのですが、日付ばかりの列に日付以外が 入っている場合が満足な結果にならないため、下記の方法を試していますが フィルタに阻まれてうまくいきません。 どうか、フィルタによって表示されていない場合でも検索出来る方法が ありましたらご教授お願いいたします。 素人の質問で判りにくいとこがあるかもしれませんが よろしくお願いいたします。 Dim xlApp As New Excel.Application Dim xlwb As Excel.Workbook = xlApp.Workbooks.Open("C:\納期情報\制御盤納期表(元).xls") Dim xlsheet As Excel.Worksheet Dim fndArea As Excel.Range '探すセル範囲 Dim product_code As String '探す文字列(Text8に入力) Dim rg As Object '探し出したセル Try xlsheet = xlwb.Worksheets("制御盤納期") fndArea = xlsheet.Range("A5:A65536") product_code = StrConv(Me.TextBox8.Text, VbStrConv.Uppercase) 'シートを検索する rg = Nothing rg = fndArea.Find(product_code, , Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart, _ Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, False) If Not rg Is Nothing Then Me.TextBox1.Text = rg.Offset(0, 1).Value End If xlwb.Close(False) '保存しない xlApp = Nothing xlwb = Nothing xlsheet = Nothing fndArea = Nothing rg = Nothing Catch ex As Exception xlwb.Close(False) '保存しない xlApp = Nothing xlwb = Nothing xlsheet = Nothing fndArea = Nothing rg = Nothing ' 例外が発生した時の処理 MessageBox.Show(ex.ToString, "例外発生") Return End Try

  • VB2008 エクセル出力

    VB2008 エクセル出力 教えていただけると助かります VB6.0使用時にエクセル出力をするために下記のようなプログラムで出力していました ※「Microsoft Excel 9.0 Object Library」を参照 Dim xlApp As EXCEL.Application Dim xlBook As EXCEL.Workbook Dim xlsheet As EXCEL.Worksheet Dim File As String File = App.Path + "\EXCEL\" + "フォーム.xls" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(File) Set xlsheet = xlBook.Worksheets("テスト") xlsheet.Range("A1") = "テスト" 'フォルダ作成 If Dir("D:\", vbDirectory) = "" Then Call Mkdirs("D:\テスト") 'Worksheetを名前をつけて保存します。 xlApp.DisplayAlerts = False xlsheet.SaveAs "D:\テスト\テスト.xls" xlApp.Quit Set xlApp = Nothing Set xlBook = Nothing Set xlsheet = Nothing VB2008の場合だとどのように書けば同じように動きますか ※色々試してみましたがダメでした 「Microsoft Excel 12.0 Object Library」を参照しています

  • VBからエクセルを起動。そのあとエクセルを終了

    教えてください。 VBからエクセルを起動します。 そのあと、エクセルのシートの上にデータを貼り付けます。そして、エクセルを終了します。 しかし、エクセルが終了しません。 タスクバー上のエクセルをクリックすると終了します。 どうして、このような現象が起こるのかわかりません。 教えてください。 下記に同様のサンプルを書きました 誤記入があるかも知れませんが このような感じのプログラムです。 以上、よろしくお願いします。 public sub test Dim XApp as Excel.Application Dim nfilename as string Dim xlBook As Object Dim xlSheet As Object ' エクセルを起動 Set xlApp = New Excel.Application nfilename ="AAAA.xls" ' 指定されたファイルを開く Call xlApp.Workbooks.Open(nfilename) Set xlBook = xlApp.ActiveWorkbook Set xlSheet = xlBook.Worksheets(1) 'フォームを貼り付ける xlSheet.Range("a1").PasteSpecial      'ファイル名の作成 Filename="BBBB.xls" '保存 ChDir "C:\" xlBook.SaveAs Filename:=Filename,FileFormat:=xlNormal, _ Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _ CreateBackup:=False Set xlSheet = Nothing xlBook.Close True Set xlBook = Nothing xlApp.Quit Set xlApp = Nothing End sub

  • VB2005でExcelファイルを開く

    こんにちは。 VB2005の勉強をさせて頂いています。 ボタンを押すとコモンダイヤログを表示し、 ダイヤログ内で選択したExcelファイルの内容をフォームのDataGridViewにもって行きたいと思っていますが 上手くできません。一応現在のソースを下記に置いておきます。 特に、下記のソースの 'DataGridView1に展開 For i As Integer = 0 To xlSheet.Rows.Count - 1 DataGridView1.Rows.Add() DataGridView1.Item(0, i) = xlSheet.Rows.Item(i, 0) Next のループ条件xlSheet.Rows.Count - 1がどうも6万くらいになっているようなのですが、 実際セルに入力したデータは5行程度のものです。 1セル1セル文字が入っているかどうかを調べていかないといけないのでしょうか? よろしければ、具体的なソースやアドバイスをお願いいたします。 -------------------------------------- Dim ofd As New OpenFileDialog() 'ofdの設定をする 'ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する If ofd.ShowDialog() = DialogResult.OK Then '選択されたファイルを読み取り専用で開く Dim ReadFile As System.IO.Stream ReadFile = ofd.OpenFile() If Not (ReadFile Is Nothing) Then Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks '既存ファイルを開く場合 Dim xlFilePath As String = ofd.FileName Dim xlBook As Excel.Workbook = xlBooks.Open(xlFilePath) Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) 'DataGridView1に展開 For i As Integer = 0 To xlSheet.Rows.Count - 1 DataGridView1.Rows.Add() DataGridView1.Item(0, i) = xlSheet.Rows.Item(i, 0) Next 'xlSheet の解放 'xlSheets の解放 'xlBook を閉じる 'xlBook の解放 'xlBooks の解放 'Excelを閉じる 'xlApp を解放 End If End If ofd.Dispose()

  • VB.NET EXCEL

    下記のコードで、アプリケーション実行中 EXCELが起動したままになり アプリケーション終了時に、EXCELも一緒に終了する という、タスクマネージャーに残るという動作になります。 どこの COM の扱い方がまずかったのでしょうか? 教えてください。お願いします。 ※文字数制限で、SQLコネクション周り、SQL系宣言 エラー処理を消しました。 ※EXCEL周りに関してはすべてそのままです。 変数に代入している COMオブジェクトをすべて Marshal.FinalReleaseComObject してもEXCELが終了しないので何かしら COMオブジェクトを見落としていると思うのですが どれだかわかりません。 よろしくお願いします Imports Microsoft.Office.Interop Imports System.Runtime.InteropServices Public Class Cls_Print_Excel Public Sub S_Print_Excel() 'エクセルアクセス用 Dim _xslFile As String = "C:\base.xls" Dim objExcel As Excel.Application = Nothing Dim objWorkBook As Excel.Workbook = Nothing Dim objWorkBooks As Excel.Workbooks = Nothing Dim xlSheet As Excel.Worksheet = Nothing Dim xlRange As Excel.Range = Nothing Dim xlPageSetup As Excel.PageSetup = Nothing Try objExcel = New Excel.Application objWorkBooks = objExcel.Workbooks objWorkBooks.Open(_xslFile) objWorkBook = objExcel.ActiveWorkbook xlSheet = DirectCast(objWorkBook.Worksheets(1), Microsoft.Office.Interop.Excel.Worksheet) rs = cm.ExecuteReader() I = 3 Do While rs.Read Dim AA() As String = {"B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"} Dim K As Integer For K = 0 To 11 IN_Range(xlSheet, AA(K) & I.ToString, rs(K).ToString) Next xlRange = xlSheet.Range("3:3") xlRange.Copy() A = A + Marshal.ReleaseComObject(xlRange) xlRange = xlSheet.Range(I.ToString & ":" & I.ToString) xlRange.PasteSpecial( _ Paste:=Microsoft.Office.Interop.Excel.XlPasteType.xlPasteFormats, _ Operation:=Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, _ SkipBlanks:=False, Transpose:=False) A = A + Marshal.ReleaseComObject(xlRange) xlRange = xlSheet.Range(I.ToString & ":" & I.ToString) xlRange = xlRange.EntireRow xlRange.AutoFit() A = A + Marshal.ReleaseComObject(xlRange) xlRange = xlSheet.Range(I.ToString & ":" & I.ToString) N = 5.5 While True If CType(xlRange.RowHeight, Double) < N Then Exit While Else N += 5.5 End If End While xlRange.RowHeight = N '高さを設定 A = A + Marshal.ReleaseComObject(xlRange) I += 1 'ループカウンタを積む Loop xlPageSetup = xlSheet.PageSetup xlPageSetup.PrintArea = "B2:M" & (I - 1).ToString A = A + Marshal.ReleaseComObject(xlPageSetup) S_filename = System.IO.Path.GetDirectoryName(_xslFile) & Format(Now(), "yyyy-MM-dd-HH-mm-ss") & ".xls" objWorkBook.SaveAs(S_filename) objWorkBooks.Close() A = A + Marshal.ReleaseComObject(objWorkBooks) objExcel.Quit() A = A + Marshal.ReleaseComObject(objExcel) Exit Sub Catch ex As Exception Finally End Try End Sub Private Sub IN_Range(ByRef wSheet As Microsoft.Office.Interop.Excel.Worksheet, _ ByVal iCell As String, _ ByVal Value As String) Dim rng As Excel.Range = wSheet.Range(iCell) rng.Value = Value Marshal.FinalReleaseComObject(rng) rng = Nothing End Sub End Class

  • VB.NETからEXCELの起動が、うまくいかない

    3回目の同じ質問になってしまうのですがよろしくお願いいたします。 下記のようなソースでEXCELファイルを作成し、その後ファイルを開くという処理をしています。 Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlBook As Excel.Workbook = xlBooks.Add Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) Dim xlRange As Excel.Range Dim xlCells As Excel.Range = xlSheet.Cells xlRange = xlCells(1, 10) xlRange.Value = "--" xlRange = xlCells(1, 5) xlCells.EntireColumn.AutoFit() xlBook.SaveAs(sPath & "\" & sFileName, Excel.XlFileFormat.xlWorkbookNormal) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlCells) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlRange) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlSheet) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlSheets) xlCells = Nothing xlRange = Nothing xlSheet = Nothing xlSheets = Nothing xlBook.Close() System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlBook) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlBooks) xlBook = Nothing xlBooks = Nothing xlApp.Quit() System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp) xlApp = Nothing GC.Collect() System.Diagnostics.Process.Start(sPath & "\" & sFileName) ある特定のPCでのみEXCELのメニューバーとステータスバーのみしか表示されない状態です。 起動部分(Process.Start)をコメントアウトして確認したところ GC.COLLECTでEXCELが終了することなく、アプリの終了時にEXCELが終了する 状態にあります。 これはオブジェクトの開放がうまくいっていないのでしょうか? よろしくお願いいたします。

  • VB2005でエクセルの機能を使うには

    VB2005でエクセルに数値を貼り付けた後自動的に エクセルの機能を使ってA列で並び替えをしたいのですが可能でしょうか。 今のソース s1()の配列に数値がはいっている。 exp s1(1)="1.0,2.0,3.0,4.0......" Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlFilePath As String = Application.StartupPath & "\aaa.xls" Dim xlBook As Excel.Workbook = xlBooks.Open(xlFilePath) Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) ':::::::::::::::::::::::::::::::::::::::::::::::sheet1 '-----貼り付け開始 Dim xlRange As Excel.Range Dim xlCells As Excel.Range Dim xlRange1 As Excel.Range xlCells = xlSheet.Cells Dim j Dim Col As String For i = 1 To irec - 1 temp = Split(s1(i), ",") For j = 0 To 12 xlRange1 = xlCells(3 + i, 1 + j) Col = xlRange1.Address(False, False) xlRange = xlSheet.Range(Col) xlRange.Value = temp(j) Next j Next i ここで並び替えしたいのですが。

  • VBからExcelを操作

    VisualBasic6.0(初心者) VBを始めたばかりで、Excelの入力文字をVBで変換しようと考えています。 様々な保管場所にあるExcelを開いて選択セルの文字をコマンドボタンで変換しようと下記コードを考えました。(一部) 問題は、Load時にすでに開いているExcelを閉じてまいます。 何か良い方法は無いでしょうか?(アクティブなExcelを操作したい) また、下記コードで不適切なところがありましたら御教授願います。 Private Sub Form_Load() Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) Set xlApp = GetObject(, "Excel.Application") With xlApp.Selection Cells(1, 1).Value = "" End With xlApp.DisplayAlerts = False xlApp.Quit Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing End Sub '----------------------(大文字変換) Private Sub CB2_Click() On Error Resume Next If ActiveCell.Row = Null Then MsgBox "Excel が見つかりません" Else Dim xlApp As Excel.Application Set xlApp = GetObject(, "Excel.Application") If Err.Number Then MsgBox "Excel が起動されていません" Else Dim X As Long Dim Y As Long Dim Hmae As String Dim Hgo As String X = 0 Y = 0 With xlApp.Selection Do Do Hmae = Cells(ActiveCell.Row + X, ActiveCell.Column + Y).Value Hgo = StrConv(Hmae, 1) Cells(ActiveCell.Row + X, ActiveCell.Column + Y).Value = Hgo X = X + 1 Loop Until X >= .Rows(.Rows.Count).Row - .Row + 1 X = 0 Y = Y + 1 Loop Until Y >= .Columns(.Columns.Count).Column - .Columns(1).Column + 1 End With End If xlApp.DisplayAlerts = False Set xlApp = Nothing End If End Sub

  • VBにExcelを読み込む

    VBにExcelデータを取り込んでからSQL ServerにINSERTしたいんですが、 読み込みに時間がかかりすぎるんですが、どういったやり方だとうまくいきますか? データをまとめてVBに取得できればいいんですが。 Accessだとちょっと問題があって出来ない。 Private Sub Excel() Dim i, j As Integer Dim dSet As DataSet = New DataSet Dim dAdp As OleDb.OleDbDataAdapter Dim cn As OleDb.OleDbConnection Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim SQL As String Dim Seru1 As String Dim Seru2 As String Dim Seru3 As String cn = New OleDb.OleDbConnection( _ "provider=Microsoft.Jet.OLEDB.4.0; " & _ "data source='" & lblファイル.Text & "'; " & _ "Extended Properties=Excel 8.0;") '「Sheet1」シートのデータを取得する dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM [Sheet1$]", cn) dAdp.Fill(dSet) For i = 0 To dSet.Tables(0).Rows.Count() - 1 For j = 0 To dSet.Tables(0).Columns.Count() - 1 Debug.Write(dSet.Tables(0).Rows(i)(j) & ControlChars.Tab) Next Debug.WriteLine("") xlApp = CreateObject("Excel.Application") 'xlApp.Visible = True 'アプリケーションの表示 'Set book = app.Workbooks.Add '新規作成 xlBook = xlApp.Workbooks.Open(lblファイル.Text) 'ファイルを開く xlSheet = xlBook.Worksheets(1) 'シート1を選択 'Debug.WriteLine(xlSheet.Cells(1, 1).Value) '値を読み出す Seru1 = i Seru2 = i Seru3 = i If Not i = 0 Then If Not i = 1 Then sqlConn = objclass2.gFunc_OpenSqlConn() sqlCmd = sqlConn.CreateCommand() '初期化 imtxtExcelコード2.Text = "" imtxtExcel1.Text = "" imtxtExcelコード1.Text = "" '読み出し imtxtExcelコード2.Text = xlSheet.Range("A" + Seru1).Value imtxtExcel1.Text = xlSheet.Range("B" + Seru2).Value imtxtExcelコード1.Text = xlSheet.Range("C" + Seru3).Value SQL = "" SQL = SQL & "INSERT INTO W_Excel( " SQL = SQL & "コード1,コード2,備考 ) " SQL = SQL & "SELECT " SQL = SQL & "'" & imtxtExcelコード2.Text & "'," SQL = SQL & "'" & imtxtExcel1.Text & "'," SQL = SQL & "'" & imtxtExcelコード1.Text & "'" sqlCmd.CommandText = SQL sqlCmd.ExecuteNonQuery() End If End If xlSheet = Nothing xlBook.Close() 'Book を閉じる xlBook = Nothing xlApp.Quit() 'Quit メソッドを使って Excel を終了します。 xlApp = Nothing Next End Sub End Class