痔になりやすい生活習慣とは?

こんばんは。

EXCEL VBAでテキストファイルを読み込む事について質問です。

VBAでテキストファイルをこちらから指定する行数(上から何番目という感じで)からデーターを読み込みたいのですが、どの関数をつかっていいかわからず困っています。
1行ずつ読みこむ「Input Line関数」では、無駄な行まで読み込むので動作が遅くなります。
読み込みたい行はすでにわかっているので、最初からその行に飛んでからデーター読み込みたいと思ってます。

ちなみに指定する行数は、ファイルによって違います。
あらかじめ「Input Line関数」で、ある文字が何行目にあるかを探す行為をあらかじめ行っています。

みなさまのアイデアを拝借したく、よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

速度は分かりませんが、これとか


http://officetanaka.net/excel/vba/filesystemobje …

あるいは、丸ごと読みこんで、改行コードでSplitして、文字列配列を相手に該当行検索も含めて処理するとか。
昨今のPCでは、相当大きなテキストファイルでもメモリー内で処理できると思います。
http://officetanaka.net/excel/vba/filesystemobje …

テキストファイルの構造によってはADOで処理する案も考えられますが、Recordsetにはファイルの先頭から(あるいは末尾先頭で)入っている事が保証されているのか、ちょっと心配。参考URLはCSVになっていますが、タブ区切りテキストファイル(拡張子.txt)でもいけます。
http://home.att.ne.jp/zeta/gen/excel/c04p47.htm

以上ご参考まで。
    • good
    • 0
この回答へのお礼

mitarashiさん


回答ありがとうございます。
いろいろ試したのですが、私のテクニック不足で回答内容と同様の処理にすることはできませんでした。
しかしそこからヒントを得まして結局、
(1)まずは1行ずつ読む(変数に格納するだけ)
(2)行数をカウントしていき、任意の行数になるまでループします。
(3)任意の行数になったら、書き出すようにする。

上記の処理(1行ずつ読む)でもmitarashiさんの言うとおり、昨今のPCだと思っていたよりも処理が早く終わりました。

まずは、この処理で作っていきたいと思います。
しかし、せっかくアドバイス頂いたのでFSOを勉強して使えるようにします!

朝早くにご回答頂き、誠にありがとうございました。

お礼日時:2012/04/15 23:27

>読み込みたい行はすでにわかっているので、最初からその行に飛んでからデーター読み込みたいと思ってます。



であれば、FileSystemObjectを使用し、.SkipLineで飛ばしたい行数分ループさせてみではどうでしょう。
    • good
    • 1
この回答へのお礼

piyo_dansyakuさん

回答ありがとうございます。
回答通りにFSPを駆使してSkipLineでループさせようとしましたが、私のテクニック不足(FSOの理解不足)で、思った通りの処理ができませんでした。
しかし「行数分ループさせる」からヒントを得て、効率が悪いのですが最初から1行ずつ読んで(変数格納のみ)、任意行の時だけ書き出すという処理にしました。
こうすると、処理ができました。
一旦はこの処理で行きたいと思います。

しかし、FSOでSkipLineを駆使すればもっと処理が早くなるのでFSOを勉強してSkipLineを使えるように頑張りたいと思います。

ありがとうございました。

お礼日時:2012/04/15 23:33

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcelVBA テキストファイルから特定行を抽出し、エクセルファイルのテキストボックスに張り付ける

Excel VBAにて、テキストファイルから文字列を選別して、それをエクセルファイルのテキストボックスに張り付けるコードの記述をご教授いただけますでしょうか。

環境はWindows7 Pro Excel2010
下記テキストファイルです。

test.txt

IDENTIFICATION DIVISION.
PROGRAM-ID. sample
AUTHOR. XXX
*
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT A ASSIGN TO B
SELECT C ASSIGN TO D
DATA DIVISION.
FILE SERECTION.

この FILE-CONTROL.と DATA DIVISIONの間に挟まれている
SELECT A ASSIGN TO B
SELECT C ASSIGN TO D

この2行を取り出して、エクセルファイル上にあるテキストボックス張り付ける処理です。
よって、FILE-CONTROL.と DATA DIVISION.の間にある不特定多数の行を抽出するロジックです。

テキストボックスに張り付ける前の行を抽出するだけでも、ご教授頂けたら幸いです。

よろしくお願いします。

Excel VBAにて、テキストファイルから文字列を選別して、それをエクセルファイルのテキストボックスに張り付けるコードの記述をご教授いただけますでしょうか。

環境はWindows7 Pro Excel2010
下記テキストファイルです。

test.txt

IDENTIFICATION DIVISION.
PROGRAM-ID. sample
AUTHOR. XXX
*
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT A ASSIGN TO B
SEL...続きを読む

Aベストアンサー

http://okwave.jp/qa/q8938350.html

Q【VBA ・ エクセル】 テキストファイルから特定情報をぬきだすには

下記のようなテキストファイルから、山田太郎の後ろの数値のみを、エクセルのシートに抜き出すにはどのようにしたらよいのでしょうか。

A1セルに30、A2セルに40、A3セルに60、のように入力したいです。よろしくおねがいします。

山田太郎 30点
aaaaaa30aaaaaaaaaaa
bbbbbb20bbbbbbbbbbb
ccccccccccccccccccc
山田太郎 40点
ssssss30sssssss
eeeeeee40eeeeeeeeee
fffffffffffffffffffffff
山田太郎 60点

Aベストアンサー

例データ
山田太郎 30点
aaaaaa30aaaaaaaaaaa
bbbbbb20bbbbbbbbbbb
ccccccccccccccccccc
山田太郎 40点
ssssss30sssssss
eeeeeee40eeeeeeeeee
fffffffffffffffffffffff
山田太郎 60点
これをメモ帳に貼り付け、名前をtest7.txtで保存しました。名前は自由です。
エクセルのVBEに標準モジュールに
Sub test01()
s = "山田太郎"
i = 2
Open "C:\Documents and Settings\XXXX\My Documents\test7.txt" For Input As #1
While Not EOF(1)
Line Input #1, a
If Left(a, Len(s)) = s Then
Cells(i, "A") = s
Cells(i, "B") = Right(a, Len(a) - Len(s))
i = i + 1
End If
Wend
Close #1
End Sub
を貼り付け、実行しました。
アクチブシートに
A列  B列
山田太郎 30点
山田太郎 40点
山田太郎 60点
となりました。

例データ
山田太郎 30点
aaaaaa30aaaaaaaaaaa
bbbbbb20bbbbbbbbbbb
ccccccccccccccccccc
山田太郎 40点
ssssss30sssssss
eeeeeee40eeeeeeeeee
fffffffffffffffffffffff
山田太郎 60点
これをメモ帳に貼り付け、名前をtest7.txtで保存しました。名前は自由です。
エクセルのVBEに標準モジュールに
Sub test01()
s = "山田太郎"
i = 2
Open "C:\Documents and Settings\XXXX\My Documents\test7.txt" For Input As #1
While Not EOF(1)
Line Input #1, a
If Left(a, Len(s)) = s ...続きを読む

Qテキストファイルの行を指定して読み込み

テキストファイルの読み込みたい行を指定して
テキストボックスに表示させたいのですが、
どのようにすればよいでしょうか?

StreamReaderには一行分の文字を読み取るReadLine
メソッドがありますが、行は指定はできないようです。
良い方法があればアドバイスを頂きたいです。
よろしくお願いします。

---
開発環境:VS2005 pro
OS:Vista

Aベストアンサー

指定したい行まで、
ReadLineをループでくるくる回しては?

int i = 1;
while (line = sr.ReadLine()) != null) {
if( i = 10 ){
lineを表示する;
}
i++;
}

みたいに。
調べないで書いているので、文法間違ってたらごめんなさい。

QEXCEL VBAでテキストファイルの特定の場所にデータを書き込む方法

エクセルVBAのテキスト操作について質問なのですが、以下のようなテキストファイルがあったとしてKey1とKey2の間にデータを書き込みたいのですがどのようにすれば宜しいでしょうか。
宜しくお願い致します。

--- test.txt ここから ---
aaaa
bbbb
Key1
cccc
(ここにデータを書き込みたいです。)
Key2
eeee
--- test.txt ここまで ---

Aベストアンサー

だいたいこんな感じ
-------------------
'ファイルの中から指定した文字列が出現後、指定した文字列の前に行を挿入する
Dim fso, file
Dim tempFile, outFile, readFile
Dim strLine, Flag, fileName, key1, key2, addStr

fileName = "test.txt" 'オリジナルファイル名
key1 = "Key1" 'キーの初め
key2 = "Key2" '挿入場所キー
addStr = "DDDD" '挿入データ

Set fso = WScript.CreateObject("Scripting.FileSystemObject")
tempFile = fso.GetTempName
Set outFile = fso.OpenTextFile(tempFile, 2, true) '作業ファイルを作る
Set readFile = fso.OpenTextFile(fileName, 1)
Flag = false
Do until readFile.AtEndOfStream
strLine = readFile.ReadLine '一行読み出し
if key1 = strLine then 'key1 があった
Flag = true
end if
if Flag and key2 = strLine then 'key2 があった
outFile.WriteLine(addStr) 'key2 の前に一行追加
end if
outFile.WriteLine(strLine)
loop
readFile.Close
outFile.Close
'元ファイルを.bakにする
Set file=fso.GetFile(fileName)
file.Name = fileName & ".bak"
'作業ファイルの名前を付け替える
Set file=fso.GetFile(tempFile)
file.Name = fileName

だいたいこんな感じ
-------------------
'ファイルの中から指定した文字列が出現後、指定した文字列の前に行を挿入する
Dim fso, file
Dim tempFile, outFile, readFile
Dim strLine, Flag, fileName, key1, key2, addStr

fileName = "test.txt" 'オリジナルファイル名
key1 = "Key1" 'キーの初め
key2 = "Key2" '挿入場所キー
addStr = "DDDD" '挿入データ

Set fso = WScript.CreateObject("Scripting.FileSystemObject")
tempFile = fso.GetTempName
Set outFile = fso.OpenTextFile(tempFile,...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

Qテキストファイルの一部分を抽出する方法について

ログファイルのようなテキストファイルの中から一部分だけ抽出することは可能でしょうか。
たとえばタイトルやSQL文、それに結果がダラダラと並んでいる一連のログファイル(テキストファイル)の中から、使いたい結果の部分だけ使用したいと考えております。

具体的には次のような感じです(テキストファイル部分は一字下げています):

 --------------------
 18,購入年月
 SQL>******(省略します)*******
 SQL>******(省略します)*******
 SQL>******(省略します)*******

 顧客番号  購入年月   購入個数
 ----------------------------------
 0000012   2010/01   4
 0000530   2009/12   16
 0001234  2009/11  398

 3行取得しました。

 ----------------------
 19,顧客層
 SQL>******(省略します)*******
 SQL>******(省略します)*******
 SQL>******(省略します)*******
 ・・・

以上のテキストファイルの中から、
(1)「顧客番号  購入年月   購入個数」
から
(2)「3行取得しました。」
までを抽出したいです。
検索して範囲指定して切り取り…というのが原始的な方法ですが
対象ファイルが数個あるので、Excelで開き、VBA等で対応できればと思っています。
ちなみに(1)の項目名の間は複数スペースで区切られており、顧客~個数まで固定で、同一ファイル内に同じ文字列はないので、検索の条件に使えると考えています。(2)は抽出件数によって「*行」の箇所が変わるうえ、同一ファイル内の他の部分にも登場する文字列です。

(1)から次に初めて出てくる(2)までを抽出

といったことができればと思うのですが、なかなか良い方法が浮かびません。
何か良い方法がありましたらご教示いただければ幸いです。

ログファイルのようなテキストファイルの中から一部分だけ抽出することは可能でしょうか。
たとえばタイトルやSQL文、それに結果がダラダラと並んでいる一連のログファイル(テキストファイル)の中から、使いたい結果の部分だけ使用したいと考えております。

具体的には次のような感じです(テキストファイル部分は一字下げています):

 --------------------
 18,購入年月
 SQL>******(省略します)*******
 SQL>******(省略します)*******
 SQL>******(省略します)******...続きを読む

Aベストアンサー

古いVBAで、とりあえずご提示された条件を満たすだけの最低限の内容ですが。

Sub Data_Extract()

Dim TextLine As String
Dim Cell_Row As Long
Dim Atama_Four As String
Dim SW As Integer

Cell_Row = 0
SW = 0

Open "c:\Data.txt" For Input As #1

Do While Not EOF(1)
Line Input #1, TextLine

' 行中に"顧客番号"という文字を発見した場合にスイッチを入れる
If InStr(1, TextLine, "顧客番号") <> 0 Then
SW = 1
End If

' SWが1で、かつ行中に"行取得しました。"という文字を発見した場合にスイッチを切る
If InStr(1, TextLine, "行取得しました。") <> 0 And SW = 1 Then
Cell_Row = Cell_Row + 1
Cells(Cell_Row, 1) = TextLine
SW = 0
End If

'スイッチが入っていればその行を書き出す
If SW = 1 Then
Cell_Row = Cell_Row + 1
Cells(Cell_Row, 1) = TextLine
End If
Loop

Close #1

End Sub

古いVBAで、とりあえずご提示された条件を満たすだけの最低限の内容ですが。

Sub Data_Extract()

Dim TextLine As String
Dim Cell_Row As Long
Dim Atama_Four As String
Dim SW As Integer

Cell_Row = 0
SW = 0

Open "c:\Data.txt" For Input As #1

Do While Not EOF(1)
Line Input #1, TextLine

' 行中に"顧客番号"という文字を発見した場合にスイッチを入れる
If InStr(1, TextLine, "顧客番号") <> 0 Then
SW = 1
End If

...続きを読む

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング