• ベストアンサー

VBでExcelファイルをテキストファイルにコンバートしたい

あるソフトからExcelファイルが出力されます。これを編集してテキストファイルにしたいと思います。大体できたのですが、まだ不具合があるのでお教えください。 Excelは、以下のコードで呼び出しています。   Set EX = CreateObject("Excel.Application")   With EX.Application     .Workbooks.Open (Pathname)     .Visible = False     .DisplayAlerts = False       エクセルのデータをファイルに出力するコード     .Workbooks.Close   End With   Set EX = Nothing (1)Excelのデータの範囲を知りたいのですが、以下のコードで検索すると結構時間がかかります。簡単に範囲を得る方法はないでしょうか?行と列と両方知りたいのですが。   lastcell = .Cells(Rows.Count, 1).End(xlUp).Address    または   lastRow = .Range("A65536").End(xlUp).Row (2)VBで作っているのですが、VBAで作るより時間がかかります。これは仕方ないでしょうか? 以上、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BlueRay
  • ベストアンサー率45% (204/453)
回答No.5

>あるソフトからExcelファイルが出力 <案1> そのあるソフトで、保存する前にデータの範囲に範囲名をつけるとか出来れば その範囲のColumns.countやRows.Countで範囲取得できますよ。 例: A1~D5の範囲を範囲名”hoge”として定義済みと仮定。 Range("hoge").Columns.Count Range("hoge").Rows.Count <案2> 出力されているXLSファイルをCSVファイルとして保存して Open&Line Inputで内容を取得して Col数は、","(コンマ)で区切られた数 Row数は、Line Inputの繰り返し数 で、取得するとかは如何でしょうか。 どちらも、一案なので今回のものに適用可能かどうかはわかりませんが 参考程度に如何でしょうか。

lily02
質問者

お礼

どうもありがとうごさいます。 <案1>は、ソフトに修正を入れてもらうのにかなり費用が発生するので難しいです。 <案2>は、発想の転換ですね?感心してしまいました。 参考にさせていただき、いろんな角度でもう少し検討してみます。

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

その他の回答 (4)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

質問とは無関係ですが、最近答えたことと同じような話題がのぼっているのが見えたので、ちーと乱入デシ 参照設定とCreateObjectについて発言しました。 よかったら、見てやってくださいまし。 それでは、おじゃーまいたしました。

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=500315
lily02
質問者

お礼

どうもありがとうございます。 参照設定しながらCreateObjectでこれまで作ってきました。 違うんですね? もっと勉強してみます。

全文を見る
すると、全ての回答が全文表示されます。
noname#102878
noname#102878
回答No.3

EXってExcel.Applicationを参照してるんですよね? なら「With EX.Application」じゃなくて「With EX」じゃないでしょうか。 ま、ボクの勘違いかもしれないですけど、その前提で書きますんで適宜直してください。 (1) Dim myRange As Object Set myRange = Ex.Workbooks(1).Worksheets(1).Range("A1").CurrentRegion MsgBox myRange.Rows.Count & " " & myRange.Columns.Count ってのはどうでしょうか? CurrentRegion は空白行と空白列に囲まれた範囲を返すので、お使いの表がそういう仕様ですと使えませんが。 詳しくは CurrentRegion のヘルプを見てください。 (2) どういう意味で「時間が掛かる」というのかがわかりません。 開発時間なのか、処理時間なのか・・・ 「参照設定」でExcelを参照して開発してみてはどうでしょうか? そうすればオブジェクト変数も Dim mySheet As Worksheet という風に宣言できますし、コーディング中もExcelのオブジェクト名の後ろで「.」を押せばインテリジェンス機能が働きます。(アーリー・バインディング) 参照設定尾は実行時間に関しても多少の改善ができます。 参照設定されているものはVBのApplicationが立ち上がる時に読み込まれますので、CreateObjectの行を処理する時にExcelを読み込む「レイト・バインディング」より速く処理ができます。 ただしVBのApplicationが起動する時間がその分遅くなりますが、「実際に処理する時」に待たされませんから器にならないと思います。 Dim myXL As Excel.Application Dim myBook As Excel.WorkBook Dim myRange As Excel.Range Set myXL = New Excel.Application Set myBook = myXL.WorkbooksOpen(Pathname) Set myRange = myBook.Worksheets(1).Range("A1").CurrentRegion とは言え、参照設定は諸刃の剣です。 「VBのApplicationを実行するPC環境によってExcelのバージョンが違う」 「今後、Excelのバージョンが上がる可能性がある」 という場合は参照設定しないほうが良いでしょう。 参照設定は対象物のバージョンを固定した上で参照するからです。 そこで解決策。 開発時は参照設定で開発を行い、リリースする段階で参照設定を解除し、Excelのオブジェクト型で宣言していた変数をすべて「Object型」に変更、インスタンスを作成している行の記述も「CreateObject」に変更する。 という開発はどうでしょうか。

lily02
質問者

補足

どうもありがとうございます。 (1)については、「With EX.Application」でも「With EX」でも同じ動きでした。 Set myRange = Ex.Workbooks(1).Worksheets(1).Range("A1").CurrentRegion MsgBox myRange.Rows.Count & " " & myRange.Columns.Count では、Rangeで”A1"を指定しているので、11という答えでした。 (2)ですが、もちろん開発時間も速いに越したことはありませんね。 でも、処理時間は深刻です。参照設定でExcel 9.0 Object Libraryを設定しています。設定していてCreateObjectは使い方が変ですか?初歩的に間違っているのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

SpecialCells(xlLastCell).Select はどうでしょう? A1 B1 C1 A2 A3 とセルを使用していた場合、C3を指します。 ただしA4まで使用していて、4行目を削除した場合でもC4へ飛ぶことがあるので 使用した範囲には注意してください。 (よく質問がある、使用していない範囲がスクロールバーに反映される、というバグ?)

lily02
質問者

補足

どうもありがとうございます。 折角お教えいただいたのですが、うまく使えませんでした。 サンプルコードを教えていただけませんか?

全文を見る
すると、全ての回答が全文表示されます。
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

過去スレ

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=492282
lily02
質問者

補足

早速ありがとうございます。 (2)に対するお答と受け取っていいでしょうか? 配列にデータを入れてから編集処理をすることで処理時間が速くなるというお答でしょうか?

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

関連するQ&A

  • VBでExcelファイルの編集

    VBでExcelファイルを作成しようとしていますが、罫線を引くとき、Rangeで範囲を指定しているんですが矩形でかかれず、一本線だけが書かれてしまいます。 どうしたら四角く矩形で罫線が書かれるか教えてください。 Set objExcel = CreateObject("Excel.Application") 'エクセルオブジェクト作成 objExcel.Visible = False 'エクセルを非表示で objExcel.Workbooks.Add '新規に作る With objExcel.Sheets("Sheet1").Range("a19:k29").Borders(1) .LineStyle = xlContinuous .Weight = 4 .ColorIndex = xlAutomatic End With

  • 横にコピーするには・・。

    教えてください・・。 01.xls・02.xls・03.xlsとあり、その中のシート(01・02・03)をコピーして、全部というシートにまとめたいと思っています。 列にデータを追加したいのですが、行にデータが追加されてしまいます・・。 どうしたらいいのか教えてください。 01のシートがAからDまで 02のシートがEからGまで 03のシートがHからLまで とコピーをしたいと思っています・・。 --------- PathName = ThisWorkbook.Path & "\" ArrBook = Array("01.xls", "02.xls", "03.xls") For i = LBound(ArrBook) To UBound(ArrBook) Workbooks.Open PathName & ArrBook(i) Next Set WS(1) = Workbooks("01.xls").Worksheets("01") Set WS(2) = Workbooks("02.xls").Worksheets("02") Set WS(3) = Workbooks("03.xls").Worksheets("03") Set WS(4) = ThisWorkbook.Worksheets("全部") With WS(4) .Cells.ClearContents .Cells(1, 1) = "A" .Cells(1, 2) = "B" .Cells(1, 3) = "C" .Cells(1, 4) = "D" .Cells(1, 5) = "E" .Cells(1, 6) = "F" .Cells(1, 7) = "G" .Cells(1, 8) = "H" .Cells(1, 9) = "I" .Cells(1, 10) = "J" .Cells(1, 11) = "K" .Cells(1, 12) = "L" .Cells(1, 13) = "M" .Cells(1, 14) = "N" .Cells(1, 15) = "O" .Cells(1, 16) = "P" .Cells(1, 17) = "Q" LastRow(1) = WS(1).Range("A65536").End(xlUp).Row LastRow(2) = WS(2).Range("A65536").End(xlUp).Row LastRow(3) = WS(3).Range("A65536").End(xlUp).Row For i = 1 To 3 LastRow(4) = .Range("A65536").End(xlUp).Row + 1 WS(i).Rows("2:" & LastRow(i)).Copy .Cells(LastRow(4), 1) LastRow(4) = .Range("A65536").End(xlUp).Row End With For i = LBound(ArrBook) To UBound(ArrBook) Workbooks(ArrBook(i)).Close SaveChanges:=False Next End Sub

  • 【VB】【エクセル操作】 SaveAsでエラーが出てしまいます。

    VB6.0で作成したソフトの一部でエクセルを操作する箇所があります。 『新しいブックを作成して名前を付けて保存する』ところでエラーが出てしまいます。 Excel2007,2003では正常に動作するのですが、2000ではエラーが発生し強制終了されてしまいます。 '//////////////////////////////////////////////////////////// Private Sub EditExcelFile(FileName As String) Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Add xlApp.Visible = True With xlBook .Application.DisplayAlerts = False .SaveAs (FileName) .Application.DisplayAlerts = True End With Set xlBook = Nothing Set xlApp = Nothing End Function '//////////////////////////////////////////////////////////// 上記コードの .SaveAs (FileName)の箇所でエラーがでます。 .SaveAs (FileName)をコメント文にすると2000でも正常に動作します。 FileNameは新しいブック名のパスが入ります。 2000でも正常に動作させるにはどのような処理を加えれば良いでしょうか? 宜しくお願い致します。

  • VB.NET Excelの解放

    Excel出力の解放について質問です。 下記URLを参考に作成しましたが、出力をし終えたときにプロセスを見るとExcelの解放がされません。 http://hanatyan.sakura.ne.jp/dotnet/Excel01.htm 助言をもらえないでしょうか? With SaveFileDialog1 .FileName = savefilename If .ShowDialog() = Windows.Forms.DialogResult.OK Then wstrPath = .FileName() If Func_Excelチェック(wstrPath) = False Then Exit Function End If End If End With Dim excel As New Excel.Application Dim xlbooks As Excel.Workbooks = excel.Workbooks Dim xlbook As Excel.Workbook = xlbooks.Add Dim xlsheets As Excel.Sheets = xlbook.Worksheets Dim xlsheet As Excel.Worksheet = xlsheets.Item(1) Dim xlCells As Excel.Range Dim xlRange1 As Excel.Range xlCells = xlsheet.Cells Dim i As Integer = 1 作成データテーブルに接続 xlRange1 = xlCells(1, 1) xlRange1.Value = "工場番号" MRComObject(xlRange1, True) While sqlReader.Read xlRange1 = xlCells(i + 1, 1) xlRange1(xlCells(i + 1, 1)).Select() xlRange1.Value = sqlReader("入力_工場番号") MRComObject(xlRange1, True) i += 1 End While excel.DisplayAlerts = False xlsheet.SaveAs(wstrPath) 'Select Case Val(excel.Version) 'Case 9 'xlbook.SaveAs(Filename:=wstrPath) 'Case 12 'xlbook.SaveAs(Filename:=wstrPath, FileFormat:=56) 'End Select 'MRComObject(xlsheet, True) excel.DisplayAlerts = True MRComObject(xlsheet)'xlSheet の解放 MRComObject(xlsheets)'xlSheets の解放 xlbook.Close()'xlBook を閉じる MRComObject(xlbook)'xlBook の解放 MRComObject(xlbooks)'xlBooks の解放 excel.Quit()'Excelを閉じる MRComObject(excel)'excel を解放 Private Function Func_Excelチェック(ByVal arg As String) As Boolean Dim excel As New Excel.Application Dim xlbooks As Excel.Workbooks = excel.Workbooks Dim xlbook As Excel.Workbook excel.Visible = False excel.Application.DisplayAlerts = False Try If System.IO.File.Exists(arg) = True Then xlbook = xlbooks.Open(arg) xlbook.SaveAs(arg, FileFormat:=42, CreateBackup:=False) MRComObject(xlbook, True) Return True Else Return True End If Catch ex As Exception MessageBox.Show("") Return False Finally xlbooks.Close() MRComObject(xlbooks, True) excel.Quit() MRComObject(excel, True) End Try End Function

  • これのおかしいところはありますか?エクセル B列

    Option Explicit Sub ExtractColumnB() Dim FolderPath As String Dim FileName As String Dim SourceWorkbook As Workbook Dim TargetWorkbook As Workbook Dim SourceWorksheet As Worksheet Dim TargetWorksheet As Worksheet Dim LastRow As Long Dim TargetLastRow As Long ' 対象フォルダの選択 With Application.FileDialog(msoFileDialogFolderPicker) .Title = "フォルダを選択してください" .AllowMultiSelect = False If .Show <> -1 Then Exit Sub FolderPath = .SelectedItems(1) End With ' 出力用ワークブックとワークシートを作成 Set TargetWorkbook = Workbooks.Add Set TargetWorksheet = TargetWorkbook.Worksheets(1) ' 対象フォルダ内のExcelファイルを順次処理 FileName = Dir(FolderPath & "\*.xls*") Do While FileName <> "" ' ソースファイルを開く Set SourceWorkbook = Workbooks.Open(FolderPath & "\" & FileName) Set SourceWorksheet = SourceWorkbook.Worksheets(1) ' B列のデータを抽出 LastRow = SourceWorksheet.Cells(Rows.Count, 2).End(xlUp).Row ' 抽出したデータを出力用ワークシートにコピー TargetLastRow = TargetWorksheet.Cells(Rows.Count, 2).End(xlUp).Row + 1 SourceWorksheet.Range("B1:B" & LastRow).Copy TargetWorksheet.Range("B" & TargetLastRow) ' ソースファイルを閉じる SourceWorkbook.Close SaveChanges:=False ' 次のファイルへ FileName = Dir Loop ' 確認メッセージ MsgBox "B列のデータ抽出が完了しました。", vbInformation End Sub

  • 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

  • Excel VBA msoAutomationSecurityForceDisableについて

    マクロを無効にしてファイルを読み込むコードを過去レスを見て作成しましたが、msoAutomationSecurityForceDisableを定数でなく、変数としか認識しないため、うまく機能しません。 下記コードのどこを修正すべきか、ご教示願います。 Sub read() Dim DirN As String Dim Fname As String With ThisWorkbook.Worksheets("手当") .Activate .Range(.Cells(7, 1), .Cells(10000, 40)).ClearContents End With Set NxL = CreateObject("Excel.application") NxL.Visible = True NxL.AutomationSecurity = msoAutomationSecurityForceDisable NxL.DisplayAlerts = False DirN = Worksheets("手当").Range("C2").Value & "\" Fname = Dir(DirN & "*.xls") Set Mybook = NxL.Workbooks.Open(DirN & Fname) Call read1(Mybook) Do While Fname <> "" Set NxL = CreateObject("Excel.application") NxL.Visible = True NxL.AutomationSecurity = msoAutomationSecurityForceDisable NxL.DisplayAlerts = False '追加してファイル名を検索する場合はDir関数の引数はなくす。 Fname = Dir() Set Mybook = NxL.Workbooks.Open(DirN & Fname) Call read1(Mybook) Loop End Sub

  • ASPによるEXCELファイルの操作

    宜しくお願いします。 サーバーに保管してあるEXCELテンプレートが保管してあります。 ASPを用いて、テンプレートの特定セルにデータを入力したのち そのテンプレートをクライアント側のPCに保存したいのですが可能でしょうか。 ちなみに、自分のPC内(Localhost)では、下記のプログラムでうまく動いたのですが サーバーに移すと、このプログラムのところでエラーが出ます。 初心者で見よう見まねでプログラムしているので、理屈等が理解できていないのですが どなたかアドバイスいただけると幸いです。 宜しくお願いします。 '================================================= '----- EXCEL作成 '================================================= Sub excel_save() Dim strFileName Dim ex, wb, sh, objExcelBook strFileName = "C:\Temp\報告書.xls" Set ex = Server.CreateObject("Excel.Application") ex.visible=false ex.displayalerts=false Set objExcelBook = ex.Workbooks.Open(strFileName) Set wb = ex.activeworkbook Set sh = wb.Sheets("報告書") sh.Range("I3").Value = KanriNo objExcelBook.SaveAs ("【" & KanriNo & "】報告書.xls") objExcelBook.Close False ex.Application.Quit set sh = Nothing Set wb = Nothing Set objExcelBook = Nothing Set ex = Nothing End Sub

  • 複数ファイルのA1だけを抽出して別ファイルにしたい

    すみませんが、教えてください。 特定のフォルダ内に入っているcsvのA1列目のみ抽出して別ファイルにしたく、検索したところ 同じように困っていた方がいたようで、参考にさせていただいたのですが、 以下を実行しても インデックスが有効範囲にありませんと出ます。 各csvファイルのシート名は 1000近くあるファイル全て違い、別々の名前(コード00-000とか)になっています。 (エクセルで開いたとき) お手数ですが、教えていただきたくお願いいたします。 参考にしたマクロです。 Sub macro1() Dim myPath As String Dim myFile As String myPath = "ファイルの場所\" myFile = Dir(myPath & "*.xls") Do Until myFile = "" Workbooks.Open myPath & myFile With Workbooks("集約.xls").Worksheets("Sheet1").Range("A65536").End(xlUp) .Offset(1, 0).Value = myFile .Offset(1, 1).Value = Workbooks(myFile).Worksheets("概要").Range("C3").Value End With Workbooks(myFile).Close savechanges:=False myFile = Dir() Loop End Sub 宜しくお願いいたします。

  • 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」を参照しています

このQ&Aのポイント
  • LBT-UAN05C2/N Bluetuuth USBアダプターを購入しましたが、Bluetoothイヤホンと接続できません。
  • Windows7のOSでIVT社製のソフトウェアをインストールしましたが、ペアリングができません。
  • エレコム株式会社の製品についての質問です。
回答を見る

専門家に質問してみよう