テキストファイル内の文章を最後まで読み込みたいのですが、

do
 Line Input #1, gyou
 処理1
while 条件

で、条件はどのような記述にすればいいのですか?

テキストファイルには、改行コードのみの行や、スペースのみの行が混在しています。
また、行数も常に変動するので、 for~nextで予め回数を指定することも出来ません。

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

A 回答 (1件)

    • good
    • 0

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

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

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

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

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

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...続きを読む

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【VBA】テキストファイルを指定行数からの読み込み

こんばんは。

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

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

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

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

Aベストアンサー

速度は分かりませんが、これとか
http://officetanaka.net/excel/vba/filesystemobject/textstream10.htm

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

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

以上ご参考まで。

QEXCELのVBAでEOFを誤認識

すみません、ファイルからデータを読み込んでいるのですが、変なコードが入っているらしく、EOFはきちんと認識できず、困っています。
文字コードも何かわからなず、半角空白でもないようです。読み込みファイルの2行目の"ー"と"&"の間にある見えない文字コードです。(さくらエディタでは半角空白に見えてます。)
何なのかも私にはわかりませんが解決方法をご教授願います。このコードを削除するば良いですが、大量にあり手動では削除困難です。
(出来れば以下のサンプルプログラムを修正する形で教えてもらえると助かります。)

簡単なVBAコードと読み込みファイルをお付けしますので、解決策をご教授方よろしくお願いします。
(以下のコードでも問題は発生します。)
添付ファイルが付けれないし、コードは変換されて表示されそうです。。。
その場合はどうやって調べれば良いかご教授頂ければと思います。

----------VBAプログラム(Excel2007で作成)----------
Option Explicit

Sub testLoadFile()

Dim intFF As Integer ' FreeFile値
Dim lngREC As Long ' レコード件数カウンタ
Dim strREC As String ' レコード領域
Dim opnFileName As String

' FreeFile値の取得(以降この値で入出力する)
intFF = FreeFile
' 指定ファイルをOPEN(入力モード)
opnFileName = ActiveWorkbook.Path & "\loadtest.txt"
Open opnFileName For Input As #intFF

lngREC = 0
' ファイルのEOF(End of File)まで繰り返す
Do Until EOF(intFF)
' レコード件数カウンタの加算
lngREC = lngREC + 1
' 行単位にレコードを読み込む
Line Input #intFF, strREC

Cells(lngREC, 1).Value = strREC

Loop
' 指定ファイルをCLOSE
Close #intFF

End Sub


--------読み込みファイルテキスト(3行のファイルです。)------------
"aaa","3"
"cccー&","4"
"bbb","5"

すみません、ファイルからデータを読み込んでいるのですが、変なコードが入っているらしく、EOFはきちんと認識できず、困っています。
文字コードも何かわからなず、半角空白でもないようです。読み込みファイルの2行目の"ー"と"&"の間にある見えない文字コードです。(さくらエディタでは半角空白に見えてます。)
何なのかも私にはわかりませんが解決方法をご教授願います。このコードを削除するば良いですが、大量にあり手動では削除困難です。
(出来れば以下のサンプルプログラムを修正する形で教えてもらえ...続きを読む

Aベストアンサー

815Bは<ー>を示しています。
その次の文字は<&>。これは8195となります。

当方の環境ではこれが表示されます。

実行時エラーの表示、申し訳ありません。
エラー内容から察するに、strRECには5文字しか格納されていないようです。

つまり・・・
1文字目:"
2文字目:c
3文字目:c
4文字目:c
5文字目:ー

6文字目は存在していないのでエラーとなります。
Line Inputは一行単位で(厳密にはCr、あるいはCrLfまで)読み取ります。
5文字で読み取りが終了していることを考えると、
見えない何かは”Cr”や”CrLf”の可能性があります。
今回の場合、直感ですがCrの可能性があります。

この文字コードが邪魔しているため、正しく読み取れないものと考えます。
この場合、意図と違った結果が得られてしまいます。

検証方法として、以下のソースコードを試してみてください。
Dim fn As Integer
fn = FreeFile()

Dim testFile As String
testFile = ActiveWorkbook.Path & "\loadtest.txt"

Open testFile For Binary As #fn

Dim sizeOfFile As Long
sizeOfFile = LOF(fn)

Dim stringBuffer As String
stringBuffer = String(sizeOfFile, vbNullChar)

Get #fn, , stringBuffer

Close #fn

Dim lineOfFile() As String
lineOfFile() = Split(stringBuffer, vbCr)

このとき、LineOfFileの配列数がどうなるか。
期待されるのは
0:"aaa","3"
1:"cccー&","4"
2:"bbb","5"

ですが、症状から察すると
0:"aaa","3"
1:"cccー
2:
3:&","4"
4:"bbb","5"

3以降は必ずしもこうなるとは限りませんが・・・。
これに近いもの、と思います。

対応方法
対応1.このファイルを出力しているソフトの担当者に連絡する。
対応2.上記検証用コードを少し書き換える

前)
lineOfFile() = Split(stringBuffer, vbCr)

後)
lineOfFile() = Split(stringBuffer, vbCrLf)

Dim i As Integer
For i = 0 To UBound(lineOfFile)
lineOfFile(i) = Replace(lineOfFile(i), vbCr, "")
Cells(i, 1).Value = lineOfFile(i)
Next i

これで、希望に近い結果になるのではないでしょうか。

815Bは<ー>を示しています。
その次の文字は<&>。これは8195となります。

当方の環境ではこれが表示されます。

実行時エラーの表示、申し訳ありません。
エラー内容から察するに、strRECには5文字しか格納されていないようです。

つまり・・・
1文字目:"
2文字目:c
3文字目:c
4文字目:c
5文字目:ー

6文字目は存在していないのでエラーとなります。
Line Inputは一行単位で(厳密にはCr、あるいはCrLfまで)読み取ります。
5文字で読み取りが終了していることを考えると、
見えない何かは”Cr”や”CrLf...続きを読む

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 ...続きを読む

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ベストアンサー

こんにちは。

こういうものですか?
開くフォルダを変えたいときは targ に与えるパスを変更します。

Sub OpenFolders()
Dim targ As String
targ = "C:\"
Shell "C:\Windows\Explorer.exe " & targ, vbNormalFocus
End Sub

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

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

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

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

Aベストアンサー

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

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


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

人気Q&Aランキング

おすすめ情報