• ベストアンサー
  • 困ってます

EXCEL2007のVBAを使って、テキストファイルを読み込んで別のテ

EXCEL2007のVBAを使って、テキストファイルを読み込んで別のテキストファイルを作って書き込むというコードを書きましたが、新しく出来たテキストファイルの末尾に、もともとのファイルには無かったスペースが追加されてしまいます。 原因と対策を教えて頂きたいです。 ------------------------------------------------------- Dim FileName1 As String Dim FileName2 As String Dim FileNumber1 As Integer Dim FileNumber2 As Integer Dim Data As String FileName1 = Application.GetOpenFilename("Text Files (*.txt), *.txt") FileName2 = Application.GetSaveAsFilename(, "Text Files (*.txt), *.txt") Data = Space(FileLen(FileName1)) FileNumber1 = FreeFile Open FileName1 For Binary As #FileNumber1 Get #FileNumber1, , Data Close #FileNumber1 'この間に"Data"内容を処理するコードを入れる予定 FileNumber2 = FreeFile Open FileName2 For Binary As #FileNumber2 Put #FileNumber2, , Data Close #FileNumber2 ------------------------------------------------------- このコードで1284バイトのテキストを読み込ませると末尾にスペースが追加されて1918バイトになってしまいました。 "Data"の内容を表示させてもスペースはなく、Len関数で大きさを調べても1284バイトです。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数510
  • ありがとう数8

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

  • ベストアンサー
  • 回答No.2
  • notnot
  • ベストアンサー率47% (4579/9596)

まず、出力先のファイルが最初から1918バイトで存在していると、その先頭だけ書き換えて、残りはそのまま残りますけと、そういう事ではないですよね? 以下は、出力先ファイルが新規だとして回答します。 入力ファイルに日本語が、634(=1918-1284)文字入ってますよね?のこりの16(=1284-2*634)バイトが半角文字(CR,LFも含む)のはず。 FileLen(FileName1) はファイルのバイト長なので1284になります。 Data=Space(1284) で、Dataに1284文字のスペースが入りますが、内部は文字コードがUTF-16なので、バイト数は1284*2バイトになります。LenB関数で確認出来ます。 で、getで1284バイト読み込んで、それを先頭から一文字ずつDataに入れます。このとき半角文字も1バイトが2バイトになります。全角文字はそのまま2バイト。で、文字数は全部で650文字(=634+16)なので、残りの634(1284-650)文字はヌル文字が入ります。これを今度UTF-16からシフトJISに変換しながら出力します。バイト数は、全角文字が634*2バイト、半角が16バイト、ヌル文字が634バイト、合計1918バイト(後ろのほうはヌル文字)です。 対処方法は色々考えられますが、安易な方法としては、ヌル文字の削除。 Data = Replace(Data, Chr(0), "")

共感・感謝の気持ちを伝えよう!

質問者からのお礼

有り難うございます。 おかげさまで理由が分かり、解決いたしました。

関連するQ&A

  • VB2005でのファイル操作について

        Dim filedata As String Dim fileNum As Integer Dim fileName As String Dim i As Integer fileName = "C:\Paradata.txt" fileNum = FreeFile() FileOpen(fileNum, fileName, OpenMode.Output) For i = 0 To 9 filedata = data(i, 0) & "," & data(i, 1)・・・・・ PrintLine(fileNum, filedata) Next FileClose あるボタンを押しますと上記のようにテキストファイルにデータを保存しようとしているのですが、1回目のボタンクリックではエラーが無いのですが2回目以降は"別のプロセスで使用されているため、プロセスはファイル 'C:\Paradata.txt' にアクセスできません。"のエラーが発生してしまいます。いろいろと調べているのですがまだわからないのでどこがおかしいか教えてください。よろしくお願い致します。

  • テキストファイルへの書き出し

    ExcelVBAについて教えてください。 Dim path As String Dim FullPath As String Path ="C:\" Dim FN As String FN ="abc.txt" Dim intFF As Integer intFF = FreeFile FullPath = Path & "\" & FN Open FullPath For Output As #intFF Print #intFF, FullPath Close #intFF とやると、Open FullPathのところで、実行時エラー 76、パスが見つかりませんと表示されてしまいます。 やりたいことは、Excel VBAでテキストファイルを新規につくり、そこへ書き出し、保存したいです。ファイル名はFullPathで指定したファイル名を新規で作り出し、それに対して書き出し、保存をしたいです。 何が間違っているのでこのようなエラーが表示されてしまうのでしょうか?回避方法がありましたらご教授お願いいたします。

  • リストボックスの内容を テキストファイルに出力

    エクセル vba初心者です。 (1)ini fileからデータを取得 (2)その内容のリストボックスに表示 (3)リストボックス内容をテキストボックスに出力 (2)、(3)がわかりません。 なんとなくやってたら余計にわからなくなりました。助けてください。 Private Sub CommandButton1_Click() '読込み(1)を押した時の処理 Dim listbox As String Dim strL_Data As String '取得した値 Dim n As Integer n = FreeFile    ListBox1.Clear   Open "C:\filepath.ini" For Input As #n Do While Not EOF(n) Line Input #n, listbox ListBox1.AddItem listbox Loop Close #n End Sub Private Sub CommandButton2_Click() '書込み(1)を押した時の処理  Dim listbox As String Dim strL_Data As String '取得した値 Dim n As Integer n = FreeFile    Open "c:\example.txt" For Output As #n Print #n, strL_Data Close #n End Sub よろしくお願いいたします。

その他の回答 (1)

  • 回答No.1

私もこれで悩んだことがありました。 原因は追究しませんでしたが、trim関数を使って済ませてしまいました。 Data = Trim(Data)

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • エクセルに二つのテキストファイルをインポートしたい

    エクセルのsheet1の1行目にタイトルがあります。 ボタンのクリックイベントで、テキストファイル2つをインポートしたいのですが。 ・テキストファイルの名前は、固定ではありません ・テキストファイルの保存先は、デスクトップで、ファイルの選択は自分でしたい ・テキストファイルの一行目は、タイトル行なので、二行目以降をインポートしたい 行数は固定ではありません ・タブ区切りです 複数選択はできなく、1ファイルでタイトル行も含めるのであれば下記コードできたのですが。 どなたか、ご教示いただけますでしょうか・・・・ よろしくお願いいたします。 ----------------------------------------------------- Sub ReadTextFile() 'タブ区切りファイルを全て文字列として読み込む Dim FileName As String Dim i As Long Dim Cnt As Long Dim Buf As Variant Dim FileNo As Integer Dim SplitString As Variant 'ファイルダイアログを表示 FileName = Application.GetOpenFilename("テキストファイル,*.txt") If FileName <> "False" Then '全セル選択して書式を文字列にセットする Cells.Select Selection.NumberFormatLocal = "@" Cells(1, 6).Select '空いているファイル番号を取得 FileNo = FreeFile() Buf = Space(FileLen(FileName)) 'ファイルを開いてbufに1行読み込み ' → タブで配列に分割 ' → セルに書き出し Open FileName For Input As #FileNo Do Until EOF(FileNo) Line Input #FileNo, Buf Cnt = Cnt + 1 SplitString = Split(Buf, vbTab) For i = 0 To UBound(SplitString) Cells(Cnt, i + 1) = SplitString(i) Next i Loop Close #FileNo Else End If End Sub -----------------------------------------------------

  • 【ExcelVBA】FreeFile関数とGet関数について

    最近ExcelVBAを多用する部署に配属になり、現在勉強中の初心者です。 基本的な部分は何とか理解できるのですが、以下の部分がよくわかりません。 やっていることは、(FNAME)という名前のファイルにある数百万個の数値を、 R()という配列に格納しているらしいのですが、 "FreeFile"と"Get"の使い方がよく分かりません。 漠然とした質問で申し訳ありませんが、詳しい方教えてください。 Dim i As Integer, N As Integer Dim R(1 To 1000000) As Single Dim FNAME As String N = FreeFile Open FNAME For Binary As N For i = 1 To 10000 Get N, , R Next i

  • エクセルからテキストファイルはきだし

    エクセルのひとつのシートの内容をテキスト形式で吐き出すマクロを教えてください。 エクセルでHTMLメルマガの商品名や金額を編集できるようにしたいのですが、その編集後のファイルをテキストで出すマクロのVBAの書き方を教えてください。 現在、以下で書いておりますがエクセルの中にある「$」が消えてしまいます。$が消えないような書き方を教えてください。また、""が余分についてしまう書き方は避けたいです。よろしくお願い致します。 Sub test() Dim StrFN As String StrFN = ActiveWorkbook.Path & "\data.txt" Dim i As Long, LngLoop As Long Dim IntFlNo As Integer Worksheets("HTML").Activate LngLoop = Range("a65536").End(xlUp).Row IntFlNo = FreeFile Open StrFN For Output As #IntFlNo For i = 1 To LngLoop Print #IntFlNo, Cells(i, 1) Next i Close #IntFlNo End Sub

  • エクセルのデータを大量のテキストファイルに書き込みたい。

    エクセルの縦のセルのデータ(下のCells( 4 * j + i, 4))を繰り返しで、400個のテキストファイルに書き込みたいのですが、 下の""内のjは繰り返しせずに、j.txtとなって入力されてしまいます。なにかいい方法がありませんでしょうか。 ご協力お願いします。(ちなみにvbaは初心者です。) Private Sub CommandButton2_Click() Dim n As Long n = FreeFile Dim j As Integer For j = 0 To 399 For i = 1 To 4 a = Cells( 4 * j + i, 4) f2 = ActiveWorkbook.Path & "\j.txt" Open f2 For Append As #n Print #n, a Close #n Next i Next j End Sub 例. 1 2 3 4 5 6 7 8 9 10 12 13 1,2,3,4→1.txt 5,6,7,8→2.txt 9,10,11,12→3.txt

  • VBAでバイナリエディタを作ろうとしています

    テキストファイルを内部でバイナリとして開いて 16進数のダンプファイルとして新たなテキストに保存することはできたのですが 逆がどうしてもできません。 やり方としては、 03 E3 BD 71 80… のようなテキストデータをバイナリにして16進数にして保存したテキストファイルをダイアログから呼び出してもう一度元のテキスト文章に戻すという作業です。 とりあえず、まずは以下のコードでエクセル内で16進数を元の文章データに変換しようとしています。 Sub binaryToText() Dim fname As String Dim str() As Byte Dim row As Integer row = 1 fname = "Test.txt" '16進数ファイル Open fname For Binary As #1 Do Until EOF(1) ReDim Preserve str(row) Get #1, , str(row) row = row + 1 Loop Close #1 End Sub hex関数やchr関数を使う必要があるのでしょうか? VBAは始めたばかりで根本的なところで間違っているかもしれませんがよろしくお願いします。

  • EXCELVBAでデータをテキストファイルで出力したいと

    EXCELVBAでデータをテキストファイルで出力したいと考えています。 ***************************** 作成したVBA ***************************** Sub test_Click() Dim fNAME As String fNAME = "c:\test.txt" Open fNAME For Output As #1 i = 1 Print #1, "<test=" & Cells(1, i) & "," & Cells(2, i) & "," & Cells(3, i) & "," & Cells(4, i) & "," & Cells(5, i) & ">" Close #1 '閉じる End Sub ***************************** エクセルの値 ***************************** A列 1 2 3 4 5 ***************************** 出力されたテキストファイル ***************************** <test=1,2,3,4,5> このようになっていますが、 エクセルが A列 1 2 のように、2個しかないと、 <test=1,2,,,> のようになってしまいます。 <test=1,2> ↑のようになるように、エクセルの値に応じて、 「,」が出力しないようにしたいです。 どうしたらよいのでしょうか。 よろしくおねがいします。

  • ExcelVBA テキストファイルの文字列置換え

    VBA初心者のものです。 複数のフォルダの中にある同名テキストファイル(INIファイル)の中の特定の文字列 を置換えるマクロを作成していますが、うまくいかずエラーになります。 フォルダは毎回名前が変わるのでこれを変数にしてパスの中に入れて、その下の 階層のINIファイルを文字列置換えするというものです。 文字列置換えはReplace関数を使って、テキストファイルの読み込みと別ファイルとして書き出して、元ファイルを削除、新ファイルの名前を元ファイルの名前に変更するというもので、 置換える文字列はエクセルシートのB2・B3セルを読み取ってます。 テキストを開く際にパスを変数でなくフォルダ名を指定して作ると文字列置換えは出来るので、パスへの変数の組み込み方か条件設定がおかしいのかなと思うんですが、エラーはパスが不明といった内容のものが出ます。 エクセルファイルはデスクトップにあるNew Projectフォルダの中に置いて、同階層にresultフォルダがありその中に複数のフォルダ(このフォルダ名を変数にしようとしています)、それぞれの中の2つ下層に同名テキスト(INI)ファイルがあります。 もしくは違う良い方法があるのか、浅学で稚拙なコードですがどうかご教示をお願いします。 Sub MyMacro1() Dim a As String Dim z As String Dim MyF As String Dim DirName As String Dim MyIniNo As Integer Dim YourIniNo As Integer MyIniNo = FreeFile YourIniNo = FreeFile DirName = "C:&#165;Documents and Settings&#165;AAA&#165;デスクトップ&#165;NewProject&#165;result&#165;" MyF = Dir(DirName, 16) If MyF <> "" Then Do Until MyF = "" Open "C:&#165;Documents and Settings&#165;AAA&#165;デスクトップ&#165;NewProject&#165;result&#165;" & MyF & "&#165;EzInst&#165;SETUP.INI" For Input As MyIniNo Open "C:&#165;Documents and Settings&#165;AAA&#165;デスクトップ&#165;NewProject&#165;result&#165;" & MyF & "&#165;EzInst&#165;SETUP2.INI" For Input As YourIniNo b = Range("B2") c = Range("B3") While Not EOF(1) Line Input #MyIniNo, a z = Replace(a, b, c) Print #YourIniNo, z Wend Close MyIniNo Close YourIniNo Kill "C:&#165;Documents and Settings&#165;AAA&#165;デスクトップ&#165;NewProject&#165;result&#165;" & MyF & "&#165;EzInst&#165;SETUP.INI" Name "C:&#165;Documents and Settings&#165;AAA&#165;デスクトップ&#165;NewProject&#165;result&#165;" & MyF & "&#165;EzInst&#165;SETUP2.INI" As "C:&#165;Documents and Settings&#165;AAA&#165;デスクトップ&#165;NewProject&#165;result&#165;" & MyF & "&#165;EzInst&#165;SETUP.INI" Loop End If End Sub

  • エクセル VBA テキストファイル書き出す応用?

    以下のページより、 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_040.html Option Explicit ' テキストファイル書き出すサンプル(2) Sub WRITE_TextFile2() Const cnsFILENAME = "\SAMPLE.txt" Dim intFF As Integer ' FreeFile値 Dim strREC As String ' 書き出すレコード内容 Dim GYO As Long ' 収容するセルの行 Dim GYOMAX As Long ' データが収容された最終行 ' 最終行の取得 GYOMAX = Range("A65536").End(xlUp).Row ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(出力モード) Open ThisWorkbook.Path & cnsFILENAME For Output As #intFF ' 2行目から開始 GYO = 2 ' 最終行まで繰り返す Do Until GYO > GYOMAX ' A列内容をレコードにセット(先頭は2行目) strREC = Cells(GYO, 1).Value ' レコードを出力 Print #intFF, strREC ' 行を加算 GYO = GYO + 1 Loop ' 指定ファイルをCLOSE Close #intFF End Sub ------------------------------------------------------------- これを参考にしてテキストファイル書き出すのは出来たのですが、 今回は、ちょっと応用で以下のようにしたいです。 Sheet1のA2&#65374;A20までテキストファイル名が書いてあるとします。 また、Sheet2&#65374;Sheet20ぐらいまで、各Sheetに文章が入っているとします。 テキストファイルに書きだしたいのですが、 Sheet2の内容は、Sheet1のA2のファイル名 Sheet3の内容は、Sheet1のA3のファイル名 Sheet4の内容は、Sheet1のA4のファイル名 このようにしたいのですが、どのようにすればいいのか教えてください。 よろしくお願います。

  • UTF8で作成されたHTMLファイルの表示について

    WebBrowserをフォームに貼り付け、次のようなコードを記載してたのですが、表示が文字化けしてしまいます。どうすればよいでしょうか? Private Sub Form_Load() Dim html As String Dim pDoc As Object html = ReadFileData("UTF8.html") Set pDoc = New MSHTMLCtl.HTMLDocument WebBrowser1.Navigate "about:blank" Set pDoc = WebBrowser1.Document pDoc.writeln html Set pDoc = Nothing End Sub Public Function ReadFileData(ByVal FileName As String) As String Dim bytArray() As Byte Dim intFileNo As Integer Dim lngFileLenB As Long lngFileLenB = FileLen(FileName) ReDim bytArray(lngFileLenB - 1) intFileNo = FreeFile Open FileName For Binary As #intFileNo Get #intFileNo, , bytArray Close #intFileNo ReadFileData = StrConv(bytArray, vbUnicode) End Function 環境:VB6+WinXP

  • .NETで文字列のエンコードの仕方+ファイル操作

    .NETで文字列のエンコードの仕方が知りたいです。 あと、ファイル操作についてわかりやすいホームページを探しています。 '指定したファイルに文字列を追加します Dim filename as String = "test.txt" Dim data as string = "美味ソ溝" System.IO.File.AppendAllText(filename, data, System.Text.Encoding.GetEncoding("euc-jp")) 'これと同じことを以下のStreamWriterでしたいのですが、文字のエンコードの方法がわかりません。どのようにすればうまくいきますか。 Dim filename as String = "test.txt" Dim data as string = "美味ソ溝" Dim fs As System.IO.FileStream = System.IO.File.OpenWrite(filename) Dim sw As System.IO.StreamWriter = New System.IO.StreamWriter(fs) sw.BaseStream.Seek(0, System.IO.SeekOrigin.End) '書き込む前にエンコード?? sw.WriteLine(data) sw.Flush() sw.Close() fs.Close()