Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7741 / 13645 ツリー ←次へ | 前へ→

【37139】textファイルへの書き込みについて maki 06/4/23(日) 13:16 質問[未読]
【37141】Re:textファイルへの書き込みについて Hirofumi 06/4/23(日) 13:45 発言[未読]
【37142】Re:textファイルへの書き込みについて maki 06/4/23(日) 13:57 質問[未読]
【37149】Re:textファイルへの書き込みについて Hirofumi 06/4/23(日) 15:43 回答[未読]
【37156】Re:textファイルへの書き込みについて maki 06/4/23(日) 17:32 お礼[未読]
【37143】Re:textファイルへの書き込みについて Kein 06/4/23(日) 14:10 発言[未読]
【37144】Re:textファイルへの書き込みについて maki 06/4/23(日) 14:26 質問[未読]
【37146】Re:textファイルへの書き込みについて Kein 06/4/23(日) 15:03 発言[未読]
【37147】Re:textファイルへの書き込みについて maki 06/4/23(日) 15:19 質問[未読]
【37152】Re:textファイルへの書き込みについて Kein 06/4/23(日) 16:54 発言[未読]
【37153】Re:textファイルへの書き込みについて maki 06/4/23(日) 16:58 質問[未読]
【37158】Re:textファイルへの書き込みについて Kein 06/4/23(日) 17:57 発言[未読]
【37159】Re:textファイルへの書き込みについて maki 06/4/23(日) 18:07 お礼[未読]
【37157】Re:textファイルへの書き込みについて maki 06/4/23(日) 17:34 お礼[未読]

【37139】textファイルへの書き込みについて
質問  maki  - 06/4/23(日) 13:16 -

引用なし
パスワード
   まずはこのマクロを見てください。

'○結果をテキストファイルに書き込み
       Dim myfso As New FileSystemObject
       Dim mytext As TextStream
       '○結果ファイルが存在してる
       Dim 結果ファイル1 As String
       結果ファイル1 = Dir("c:\documents and settings\maki\デスクトップ\" _
                       & 製番1 & ActiveSheet.Name, Attributes:=vbNormal)
       If 結果ファイル1 = "結果.txt" Then
       'myfso.CreateTextFile ("c:\documents and settings\maki\デスクトップ\" _
                       & 製番1 & ActiveSheet.Name & "\結果.txt")
                      
       OldF = myfso.GetFileName("c:\加工図\" & Selection.Value & ".dwg")
       NewF = myfso.GetFileName("c:\documents and settings\maki\デスクトップ\" & 製番1 & ActiveSheet.Name _
                & "\" & 番号 & 材料名 & "×" & サイズ & "×" & 長さ & "-" & 数量 & "s.dwg")
       Set mytext = myfso.OpenTextFile("c:\documents and settings\maki\デスクトップ\" _
                       & 製番1 & ActiveSheet.Name & "\結果.txt", ForAppending)
       mytext.Write (OldF & "→" & NewF)
       mytext.Close
       
       '○結果ファイルが存在していない
       ElseIf 結果ファイル1 <> "結果.txt" Then
      myfso.CreateTextFile ("c:\documents and settings\maki\デスクトップ\" _
                       & 製番1 & ActiveSheet.Name & "\結果.txt")
       OldF = myfso.GetFileName("c:\加工図\" & Selection.Value & ".dwg")
       NewF = myfso.GetFileName("c:\documents and settings\maki\デスクトップ\" & 製番1 & ActiveSheet.Name _
                & "\" & 番号 & 材料名 & "×" & サイズ & "×" & 長さ & "-" & 数量 & "s.dwg")
       Set mytext = myfso.OpenTextFile("c:\documents and settings\maki\デスクトップ\" _
                       & 製番1 & ActiveSheet.Name & "\結果.txt", ForWriting)
       mytext.Write (OldF & "→" & NewF)
       mytext.Close
       End If

上記のように、色々調べながらやってみましたが
どうしても、同じファイルに上書きで保存されて
しまいます。
ファイルの有無を確認して、結果を上記のように
繰り返して保存したいのですが、良い方法がないでしょうか?

【37141】Re:textファイルへの書き込みについて
発言  Hirofumi  - 06/4/23(日) 13:45 -

引用なし
パスワード
   定数宣言が無いのでは・

  Const ForAppending As Long = 8 '★この行が、抜けているのでは?
  Const ForWriting As Long = 2 '★この行が、抜けているのでは?

【37142】Re:textファイルへの書き込みについて
質問  maki  - 06/4/23(日) 13:57 -

引用なし
パスワード
   Hirofumiさん

プロシージャ内で宣言してみましたが、
やっぱり上書きされてしまいます。
どうしたらよいでしょうか??
ご迷惑をおかけします。

【37143】Re:textファイルへの書き込みについて
発言  Kein  - 06/4/23(日) 14:10 -

引用なし
パスワード
   OpenTextFile のヘルプを抜粋しておきます。
引数の「位置と意味」を、しっかり理解して使いましょう。

-----------------------------------------------------------------------
OpenTextFile メソッド

対象: FileSystemObject オブジェクト
言語: JScript, VBScript

指定したファイルを開き、開いたファイルの読み取り、または追加書き込みに
使用できる TextStream オブジェクトを返します。

object.OpenTextFile(filename[, iomode[, create[, format]]])

引数
object
必ず指定します。FileSystemObject オブジェクトの名前を指定します。
filename
必ず指定します。作成するファイルの名前を表す文字列式を指定します。
iomode
省略可能です。指定する値については、次の「設定値」を参照してください。
create
省略可能です。引数 filename で指定したファイルが存在しなかった場合に
新しいファイルを作成するかどうかを示すブール値を指定します。
新しいファイルを作成する場合は真 (true) を、ファイルを作成しない場合は
偽 (false) を指定します。省略した場合、新しくファイルは作成されません。
format
省略可能です。開くファイルの形式を示す値を指定します。指定する値については、
次の「設定値」を参照してください。省略した場合、ASCII ファイルとして
ファイルが開かれます。

設定値

引数 iomode の設定値は次のとおりです。

定数     値   内容
ForReading  1  ファイルを読み取り専用として開きます。
         このファイルには書き込むことができません。
ForWriting  2  ファイルを書き込み専用として開きます。
ForAppending 8  ファイルを開き、ファイルの最後に追加して書き込みます。

引数 format の設定値は次のとおりです。

値          内容
TristateTrue   ファイルを Unicode ファイルとして開きます。
TristateFalse   ファイルを ASCII ファイルとして開きます。
TristateUseDefault システム デフォルトを使ってファイルを開きます。

【37144】Re:textファイルへの書き込みについて
質問  maki  - 06/4/23(日) 14:26 -

引用なし
パスワード
   ▼Kein さん:
>OpenTextFile のヘルプを抜粋しておきます。
>引数の「位置と意味」を、しっかり理解して使いましょう。
>
>-----------------------------------------------------------------------
>OpenTextFile メソッド
>
>対象: FileSystemObject オブジェクト
>言語: JScript, VBScript
>
>指定したファイルを開き、開いたファイルの読み取り、または追加書き込みに
>使用できる TextStream オブジェクトを返します。
>
>object.OpenTextFile(filename[, iomode[, create[, format]]])
>
>引数
>object
>必ず指定します。FileSystemObject オブジェクトの名前を指定します。
>filename
>必ず指定します。作成するファイルの名前を表す文字列式を指定します。
>iomode
>省略可能です。指定する値については、次の「設定値」を参照してください。
>create
>省略可能です。引数 filename で指定したファイルが存在しなかった場合に
>新しいファイルを作成するかどうかを示すブール値を指定します。
>新しいファイルを作成する場合は真 (true) を、ファイルを作成しない場合は
>偽 (false) を指定します。省略した場合、新しくファイルは作成されません。
>format
>省略可能です。開くファイルの形式を示す値を指定します。指定する値については、
>次の「設定値」を参照してください。省略した場合、ASCII ファイルとして
>ファイルが開かれます。
>
>設定値
>
>引数 iomode の設定値は次のとおりです。
>
>定数     値   内容
>ForReading  1  ファイルを読み取り専用として開きます。
>         このファイルには書き込むことができません。
>ForWriting  2  ファイルを書き込み専用として開きます。
>ForAppending 8  ファイルを開き、ファイルの最後に追加して書き込みます。
>
>引数 format の設定値は次のとおりです。
>
>値          内容
>TristateTrue   ファイルを Unicode ファイルとして開きます。
>TristateFalse   ファイルを ASCII ファイルとして開きます。
>TristateUseDefault システム デフォルトを使ってファイルを開きます。

makiです。
すみません、色々やってみたのですがうまくいきません・・・・
せっかく教えてくださったのに申し訳ないです。

【37146】Re:textファイルへの書き込みについて
発言  Kein  - 06/4/23(日) 15:03 -

引用なし
パスワード
   >色々やってみた
具体的に何を ?
各引数の意味は理解できましたか ? 指定位置がわからないうちは、引数名を指定した
書き方を習慣づけた方がいいですよ。

【37147】Re:textファイルへの書き込みについて
質問  maki  - 06/4/23(日) 15:19 -

引用なし
パスワード
   ▼Kein さん:
'○結果をテキストファイルに書き込み
       Dim myfso As New FileSystemObject
       Dim mytext As TextStream

       '○結果ファイルが存在してる
       Dim 結果ファイル1 As String
       結果ファイル1 = Dir("c:\documents and settings\daisuke\デスクトップ\" _
                       & 製番1 & ActiveSheet.Name, Attributes:=vbNormal)
       If 結果ファイル1 = "結果.txt" Then
       'myfso.CreateTextFile ("c:\documents and settings\daisuke\デスクトップ\" _
                       & 製番1 & ActiveSheet.Name & "\結果.txt")
                      
       OldF = myfso.GetFileName("c:\加工図\" & Selection.Value & ".dwg")
       NewF = myfso.GetFileName("c:\documents and settings\daisuke\デスクトップ\" & 製番1 & ActiveSheet.Name _
                & "\" & 番号 & 材料名 & "×" & サイズ & "×" & 長さ & "-" & 数量 & "s.dwg")
       Set mytext = myfso.OpenTextFile(Filename:="c:\documents and settings\daisuke\デスクトップ\" _
                       & 製番1 & ActiveSheet.Name & "\結果.txt", IOMode:=8, create:=False)
       mytext.Write (OldF & "→" & NewF)
       mytext.Close
       
       '○結果ファイルが存在していない
       ElseIf 結果ファイル1 <> "結果.txt" Then
      myfso.CreateTextFile ("c:\documents and settings\daisuke\デスクトップ\" _
                       & 製番1 & ActiveSheet.Name & "\結果.txt")
       OldF = myfso.GetFileName("c:\加工図\" & Selection.Value & ".dwg")
       NewF = myfso.GetFileName("c:\documents and settings\daisuke\デスクトップ\" & 製番1 & ActiveSheet.Name _
                & "\" & 番号 & 材料名 & "×" & サイズ & "×" & 長さ & "-" & 数量 & "s.dwg")
       Set mytext = myfso.OpenTextFile(Filename:="c:\documents and settings\daisuke\デスクトップ\" _
                       & 製番1 & ActiveSheet.Name & "\結果.txt", IOMode:=8)
       mytext.Write (OldF & "→" & NewF)
       mytext.Close
       End If

と、こんな感じにやりましたが、
やっぱりよくわかりません・・・・
keinさん、申し訳ございません。

【37149】Re:textファイルへの書き込みについて
回答  Hirofumi  - 06/4/23(日) 15:43 -

引用なし
パスワード
   善く見ると、OpenTextFileの引数の関係ではない様です
ForWriting、ForAppendingは参照設定で実行する場合、
定数宣言は要らないみたいですね?(参照設定で使った事が無いのでゴメン)
多分この不備は、Dirの使い方が悪い様です

       結果ファイル1 = Dir("c:\documents and settings\maki\デスクトップ\" _
                       & 製番1 & ActiveSheet.Name, Attributes:=vbNormal)

で、ファイルの存在確認を行って居る様ですが、此れではFolderの存在確認で
結果ファイル1 に "結果.txt"は、返りませんので常に、Else節が実行されます

Option Explicit

Public Sub Test()

  Const clngForWriting As Long = 2
  Const clngForAppending As Long = 8
  
  '?不明な変数若しくはリテラル
  Dim 製番1 As String
  Dim 番号 As String
  Dim 材料名 As String
  Dim サイズ As String
  Dim 長さ As String
  Dim 数量 As String
  
  Dim OldF As String
  Dim NewF As String
  Dim lngIOmode As Long
  Dim strOutPath As String
  Dim strFileName As String
  
  '○結果をテキストファイルに書き込み
  Dim myfso As New FileSystemObject
  Dim mytext As TextStream
  
  strOutPath = "c:\documents and settings\maki\デスクトップ\" _
                      & 製番1 & ActiveSheet.Name
  strFileName = "結果.txt"
  
  With myfso
    OldF = .GetFileName("c:\加工図\" & Selection.Value & ".dwg")
    NewF = .GetFileName(strOutPath & "\" & 番号 & 材料名 & "×" _
                & サイズ & "×" & 長さ & "-" & 数量 & "s.dwg")
    'ファイルの存在確認
    If .FileExists(strOutPath & "\" & strFileName) Then
      lngIOmode = clngForAppending
    Else
      lngIOmode = clngForWriting
    End If
    Set mytext = .OpenTextFile(strOutPath & "\" & strFileName, lngIOmode)
  End With
  
  With mytext
    .Write OldF & "→" & NewF
    .Close
  End With
  
  Set mytext = Nothing
  Set myfso = Nothing

End Sub

【37152】Re:textファイルへの書き込みについて
発言  Kein  - 06/4/23(日) 16:54 -

引用なし
パスワード
   >同じファイルに上書きで
保存されてしまうのは、どのファイルでしょーか ?
関係ないですが、長いファイルパスは一度変数に格納してから、使うようにして下さい。

【37153】Re:textファイルへの書き込みについて
質問  maki  - 06/4/23(日) 16:58 -

引用なし
パスワード
   ▼Kein さん:
>>同じファイルに上書きで
>保存されてしまうのは、どのファイルでしょーか ?
>関係ないですが、長いファイルパスは一度変数に格納してから、使うようにして下さい。

申し訳ないです・・・
c:\documents and settings\daisuke\デスクトップ\"& 製番1 & ActiveSheet.Name & "\結果.txt"

このファイルです。
このファイルに追記したいとおもっております。

【37156】Re:textファイルへの書き込みについて
お礼  maki  - 06/4/23(日) 17:32 -

引用なし
パスワード
   Hirofumiさんへ

大変ご尽力していただきまして
ありがとうございました!

うまく作動いたしました。
ホントに感謝です!ありがとうございました^^

【37157】Re:textファイルへの書き込みについて
お礼  maki  - 06/4/23(日) 17:34 -

引用なし
パスワード
   Kein さんへ

うまく作動しました!
おっしゃって頂いたことを活かせて
いけるようにします。ホントにありがとう御座いました!

【37158】Re:textファイルへの書き込みについて
発言  Kein  - 06/4/23(日) 17:57 -

引用なし
パスワード
   まずコーデングの定石として、何度も使う長いパスは定数で宣言します。

Const DskTop As String = _
"C:\Documents And Settings\Daisuke\デスクトップ\"

で本題ですが、そのコードには決定的なミスがあります。
>結果ファイル1 = Dir("c:\documents and settings\daisuke\デスクトップ\" _
> & 製番1 & ActiveSheet.Name, Attributes:=vbNormal)
>If 結果ファイル1 = "結果.txt" Then

この部分のコードは「製番1 & ActiveSheet.Name」の文字列が "結果.txt"
になっていれば・・という条件判定をしています。だから、もしここが True なら

>c:\documents and settings\daisuke\デスクトップ\"& 製番1 & _
>ActiveSheet.Name & "\結果.txt"

の文字列は、

c:\documents and settings\daisuke\デスクトップ\結果.txt\結果.txt"

と、等価である。ということになります。どう見てもおかしいでしょ ?
そーいうミスを避ける意味でも、長い文字列は文字列型の変数に格納して、
使った方がいいのです。あと、FSO.GetFileName 〜 の部分は、単に

Dim OldF As String, NewF As String '←この宣言も抜けています。

OldF = Selection.Value & ".dwg"
NewF = 製番1 & ActiveSheet.Name & "\" & 番号 & 材料名 & _
"×" & サイズ & "×" & 長さ & "-" & 数量 & "s.dwg"

と、するだけでいいです。実は全く同じ意味ではなく、GetFileNameを使うと
ファイルの存在チェックか出来るのですが、存在しなければ実行時エラーに
なるはずだから、それをトラップするコードがないと意味なしになります。
それから、Selection を使うのは出来るかぎり避けること。そこには値だけ
でなく「現在選択されている、あらゆるもの」が入ってしまうので、とても
危険です。

>myfso.CreateTextFile 〜
↑これは無意味なようですが・・。

以上のようなことに気をつけて、再度書き直してみて下さい。

【37159】Re:textファイルへの書き込みについて
お礼  maki  - 06/4/23(日) 18:07 -

引用なし
パスワード
   keinさんへ

ご指導ありがとうございました!
参考にさせて頂き、一度書き換えてみます。
本当に助かりました。

7741 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free