昨日も質問させていただいたVBA初心者です。
いろいろ調べましたが解決しなかったので、
またまた質問させていただきます。

ファイルを読み込んで、それを別ファイルに保存したいのですが、
下記ですと、1行のみ保存されるだけでした。
この方法ですと、すべて保存されるはずと書かれていたのですが。
全くどこが悪いのか分かりません、よろしくお願いします。

Private Sub cmd_Click()
On Error GoTo Err_cmd_Click
Dim ReadFileName As String
Dim Contents As String
Dim WriteFileName As String

ReadFileName = "P:\dl_engine\logs1\service\20020223"
' ファイルを読み込む
Open ReadFileName For Input As #1
Input #1, Contents
Close #1

WriteFileName = "C:\Contents\data\Melody.csv"
' ファイルに保存
Open WriteFileName For Output As #2
Write #2, Contents
Close #2

'正常終了
Exit_cmd_Click:
Exit Sub

'エラー処理
Err_cmd_Click:
Beep
Select Case Err.Number
Case Else
MsgBox Err.Number & ":" & Err.Description
End Select
Resume Next
End Sub

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

A 回答 (1件)

こんにちは。

maruru01です。

読み込むところで、Doループでファイルの終端まで繰り返さないといけないですよ。
あと、Line Inputではダメですか?

Dim temp As String  '1行のデータの仮置き

Open ReadFileName For Input As #1
  Do Until EOF(1)
    Line Input #1, temp
    Contents = Contents & temp & vbCrLf
  Loop
Close #1
※Line Inputの場合はWriteではなくPrintを使用

それから、ファイル番号は1とか2とか自分で付けずに、FreeFile関数を使った方がいいですよ。
では。
    • good
    • 0
この回答へのお礼

さっそく試したところ、バッチリでした。
> ファイル番号は1とか2とか自分で付けずに、
> FreeFile関数を使った方がいいですよ。
そのようにしたいと思います。
よろしければ、理由など教えていただきますと助かります。

今回は本当にありがとうございました!

お礼日時:2002/04/03 16:43

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

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

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

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

Q実行時エラー'1004': アプリケーション定義またはオブジェクト定義

実行時エラー'1004': アプリケーション定義またはオブジェクト定義について
Dim code As String
Dim lastrow As Integer
Dim i As Integer
Sub calc()
Dim code As String
Dim day_s As Integer, month_s As Integer, year_s As Integer
Dim day_e As Integer, month_e As Integer, year_e As Integer
Dim row_length As Integer
code = "998407.o"
day_e = 31
month_e = 12
year_e = 2005
day_s = 1
month_ = 1
year_s = 2005
Range("B4:H65536").ClearContents
For i = 0 To 365 * 0.65 Step 50
URL = "URL;http://table.yahoo.co.jp/t?s=" & code & "&a=" & month_s & "&b=" & day_s & "&c=" & year_s & "&d=" & month_e & "&e=" & day_e & "&f=" & year_e & "&g=d&q=t&y=" & i & "&z=" & code & "&x=.csv"
If i = 0 Then
lastrow = 4
Call GETデータ
If Range("B4") = "" Then
Exit Sub
End If
Else
lastrow = Range("B4").End(xlDown).Row + 1
Call GETデータ
Range("B" & lastrow, "H" & lastrow).Delete
row_length = Range("B4").End(xlDown).Row
If row_length - lastrow < 49 Then
Exit For
End If
End If
Next
Range("B5:H65536").Sort key1:=Columns("B")
lastrow = Range("B4").End(xlDown).Row
Range("B5", "B" & lastrow).NumberFormatLocal = "yyyy/mm/dd"
Range("A1").Select
End Sub
もうひとつ
Sub GETデータ()
With ActiveSheet.QueryTables.Add(Connection:=URL, Destination:=Cells(lastrow, 2))
↑ここにデバックで黄色になります。
.Name = "t?s=998407.o&g=d"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "10"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
End Subになります。Excel2007です。

実行時エラー'1004': アプリケーション定義またはオブジェクト定義について
Dim code As String
Dim lastrow As Integer
Dim i As Integer
Sub calc()
Dim code As String
Dim day_s As Integer, month_s As Integer, year_s As Integer
Dim day_e As Integer, month_e As Integer, year_e As Integer
Dim row_length As Integer
code = "998407.o"
day_e = 31
month_e = 12
year_e = 2005
day_s = 1
month_ = 1
year_s = 2005
Range("B4:H65536").ClearContents
For i = 0 To 365 * 0.65 Step 50
URL = "URL;http...続きを読む

Aベストアンサー

多分、変数の定義がきちんとできていないと思います。

「Sub calc()」で
 URL = "URL;http://table.yahoo.co.jp/t?s="………
 を設定していますが、

「Sub GETデータ」では
 ActiveSheet.QueryTables.Add(Connection:=URL………

URL変数はどこにも定義していませんので、どちらのサブルーチンも個別の変数(ローカル変数)
になっています。
よって「Sub GETデータ」のURLは空文字のままです。
 
もしURLをモジュール変数かパブリック変数またはURLを受け渡せば良いかと思います。

【モジュール変数なら】
  Dim i As Integer
  Dim URL As String    ←追加
  Sub calc()

【パブリック変数なら】
  Dim i As Integer
  Public URL As String    ←追加
  Sub calc()

【変数の受け渡し】
  Call GETデータ(URL)
     :
     :
  Sub GETデータ(URL)

多分、変数の定義がきちんとできていないと思います。

「Sub calc()」で
 URL = "URL;http://table.yahoo.co.jp/t?s="………
 を設定していますが、

「Sub GETデータ」では
 ActiveSheet.QueryTables.Add(Connection:=URL………

URL変数はどこにも定義していませんので、どちらのサブルーチンも個別の変数(ローカル変数)
になっています。
よって「Sub GETデータ」のURLは空文字のままです。
 
もしURLをモジュール変数かパブリック変数またはURLを受け渡せば良いかと思います。

【モジュール変数なら】
  D...続きを読む

Q定数の宣言ってdimは使えないのですか?

VBAです。
標準モジュールに

Option Explicit
Public Const フォルダ名 As String = "新しいフォルダー"
Sub aaaa()
End Sub

はできるのですが、

Option Explicit
dim Const フォルダ名 As String = "新しいフォルダー"
Sub aaaa()
End Sub

は、エラーになってしまいます。

Option Explicit
Sub aaaa()
dim Const フォルダ名 As String = "新しいフォルダー"
End Sub

もダメみたいです。

定数を使うときは、必ずPublicで宣言しなけらばいけないのでしょうか?

Aベストアンサー

ちょっと意味が分からないのですが
Dim は変数
Constは定数 なので
一緒に指定することはないと解釈するのですが

Sub aaaa()
Const フォルダ名 = "新しいフォルダー"
End Sub

ではダメなのでしょうか。

QなぜString型ではだめなのか

GetOpenFilename メソッドのヘルプに記載してある

fileToOpen = Application _
.GetOpenFilename("テキスト ファイル (*.txt), *.txt")
If fileToOpen <> False Then
MsgBox "選択されたファイル : " & fileToOpen
End If

というマクロを実行したいのですが変数の宣言をしているため
「fileToOpen」の部分がエラーになってしまいます。
なので
Dim fileToOpen As String
を付け加えましたが
次は
「If fileToOpen <> False Then」
でエラーになります。
なので
Dim fileToOpen As Variant
にしたらうまくいきました。

しかしVariant型は使わないほうがいいと教わったのですが
この場合はこれしかないのでしょうか?

またなぜString型ではエラーになるのでしょうか?
よろしくお願いします。

GetOpenFilename メソッドのヘルプに記載してある

fileToOpen = Application _
.GetOpenFilename("テキスト ファイル (*.txt), *.txt")
If fileToOpen <> False Then
MsgBox "選択されたファイル : " & fileToOpen
End If

というマクロを実行したいのですが変数の宣言をしているため
「fileToOpen」の部分がエラーになってしまいます。
なので
Dim fileToOpen As String
を付け加えましたが
次は
「If fileToOpen <> False Then」
でエラーになります。
なので
Dim fileToOpen As Var...続きを読む

Aベストアンサー

GetOpenFilenameの、使用例ではなく、メソッドのヘルプの方をご覧になって下さい。(当方XL2000)
>ユーザーによって選択、または入力したファイルの名前とパス名を返します。
>引数 MultiSelect が True の場合は、選択したファイルの名前の配列が返されます。選択されたファイルが 1 つでも、配列として返されます。
>入力が取り消された場合には False が返されます。
これでは、String型では受け切れませんよね。
もともと、GetOpenFilename メソッドは、Variant型を戻すのでしょう。
Integerで十分なところにVariantを使うのは無駄なので推奨されませんが、Variantを使う必要があるケースも当然あります。
試した訳ではありませんが、String型にした場合、
If fileToOpen <> "False"
で動くかもしれません。外していたらすみません。

Qstring型よりVariant型 変数に格納

VBAで
string型よりVariant型の方が、
変数に格納できる文字数は多いですか?

Aベストアンサー

Variant型もString型も、最大長は32bit符号付き整数で表現できる範囲、すなわち2,147,483,648文字が上限。約21億文字ですか。これだとメモリが先に埋まりそう…半角文字でもこれだけ集まると、2GBありますからね。

ただ言語仕様としては同じでも、ここまでの極限の世界になると、Variant型よりもString型の方が1文字あたりの使用メモリ量が少なくて済むので、String型の方が多く格納できるという結果になりそうな予感もします。

QRunMacroメソッドではsubプロシージャーは呼び出せない?

RunMacroメソッドはvbaのsubプロシージャーのマクロ1を呼び出すことはできないのでしょうか?
DoCmd.RunMacro "マクロ1", 2
とするとエラーになってしまいます。
どうしても2回マクロを実行したい場合は
Call マクロ1
Call マクロ1
とするしかないですか?

Aベストアンサー

Excelの場合は「マクロ=モジュール(VBA)」ですが、
Accessの場合は「マクロ」と「モジュール」は別物になります。

で、ご質問の「RunMacro」は、データベースウィンドウ
(=テーブルやクエリなどの一覧が表示される画面)で、
『マクロ』選択時に表示されるもの(「マクロ」オブジェクト)を
実行する際に使用するメソッドです。

ですので、「マクロ1」がSubプロシージャの実行には
使用できません。
(実行すると、マクロオブジェクトから「マクロ1」を探すものの、
 見つからないのでエラーを返す、と)

Subプロシージャを指定回数実行する場合は、例えば
以下のように、「For Next」構文などを使用します。


'フォーム上の「コマンド1」ボタンのクリック時イベント
Private Sub コマンド1_Click()

  '回数カウント用の変数を宣言
  Dim i As Integer

  '「i」が「1」から「2」になるまで(=2回)反復
  For i = 1 To 2
    Call マクロ1
  Next

End Sub

・・・以上です。


~~~~~~~~~~~~~~~~~~~~~~~~~~

hana-hana3さんへ:
RunMacroメソッド及び「マクロの実行」アクションでも
実行回数の指定は可能ですので、参考まで:
(下記サイトはAcc2007のヘルプですが、この辺りはAcc97から
 仕様変更はなかったはずです:それ以前は使用経験なし)
http://office.microsoft.com/ja-jp/access/HA012262831041.aspx

Excelの場合は「マクロ=モジュール(VBA)」ですが、
Accessの場合は「マクロ」と「モジュール」は別物になります。

で、ご質問の「RunMacro」は、データベースウィンドウ
(=テーブルやクエリなどの一覧が表示される画面)で、
『マクロ』選択時に表示されるもの(「マクロ」オブジェクト)を
実行する際に使用するメソッドです。

ですので、「マクロ1」がSubプロシージャの実行には
使用できません。
(実行すると、マクロオブジェクトから「マクロ1」を探すものの、
 見つからないのでエラーを返す、と...続きを読む


人気Q&Aランキング

おすすめ情報