質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.60%

CSVファイルをテキスト形式で開いた後のファイル削除

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,988
退会済みユーザー

退会済みユーザー

CSVファイルをテキスト形式で開いてから指定の位置からコピーをしたく、以下のようなコードを考えています。
ただ、これだとコピー処理後にActiveSheetがある場所に、選択したCSVと同じ名前のtextファイルが生成されるのですが
削除方法が分かりません。
killメソッドを利用すればいいのかと思うのですが、textファイルのフルパスが開けずエラーになります。操作しているテキストファイルを閉じる方法などありましたら、ご教示いただけますと幸いです。

Sub OpenCsv()
Const MAX_COLS = 256 '最大列数
Dim strFileName As String
Dim vrnFieldInfo(MAX_COLS - 1) As Variant
Dim i As Integer
Dim Path As String

strFileName = Application.GetOpenFilename( _
"テキストファイル,*.txt,CSVファイル,*.csv")
If strFileName = "False" Then
Exit Sub
End If

If Right(strFileName, 4) = ".csv" Then
Dim NewName As String
NewName = Left(strFileName, Len(strFileName) - 4) + ".txt"
FileCopy strFileName, NewName
strFileName = NewName
End If

For i = 1 To MAX_COLS
vrnFieldInfo(i - 1) = Array(i, 2)
Next

'ファイルOpen
Workbooks.OpenText Filename:=strFileName, StartRow:=1, _
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter _
:=False, Tab:=False, Semicolon:=False, Comma:=True, _
Space:=False, Other:=False, FieldInfo:=vrnFieldInfo
 

End Sub

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

Workbooks.OpenText では、拡張子がcsvでは区切り文字等の制御ができないので、
拡張子をtxtに変更したコピーファイルを生成してそれを開いている(csv以外ならそのまま開く)。
提示のコードはここまでですね。

その後、なんらかの処理をした後(指定位置からコピー?)、コピーファイルは不要なので削除したい、ということがご希望のことですね。
削除の方法は lazybones2000さんから既に回答が付いていますので、別案を。

Workbooks.OpenText だとtxtじゃないと制御できないのでコピーファイルが必要になりますが、
QueryTables.Add なら、csvでも制御可能なの、これで読み込めばどうでしょうか。
これならコピーファイルを作成する必要もないし、削除する必要もないです。

VBA CSV ファイルの読み込み (QueryTables.Add 関数を使う)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/25 11:27

    ご回答ありがとうございます!
    こちらの手法でやりたいことが実現できたのでベストアンサーにさせて頂きました。
    私の拙い説明から状況を汲み取って頂きありがとうございました!
    また、説明不足で申し訳ございませんでした。

    キャンセル

+1

問題や知りたいことがいくつかあるように読めますが、どれでしょうか。

  • ファイルを開けない
    提示されたコードで動作するように思います。
  • 開いたファイルを閉じる方法がわからない
    ブックとして開かれているはずなので、ブックのCloseメソッドでいいと思いますが、OpenTextステートメントでは開いたブックを取得できないため、別途取得する必要があります。
    *手抜きパターンActiveWorkBook.Close
    ファイルを開いた状態のまま変更がなければアクティブなブックであるはずです。
    変更される想定があるならこの方法は使えません。
    *やや手抜きパターンWorkBooks(Dir(strFileName)).Close
    ファイルが存在すればDir関数がファイル名を返す動作を利用します。無い場合は空文字列が返されますが、ファイルを開けているので無いはずがないので気にしないことにします。
  • 削除するファイル(名)の指定方法がわからない
    前段で閉じられているはずなのでkill strFileNameで良いと思います。
    ダイアログで取得したファイル名はフルパスであり、提示コードでは拡張子部分をを変更しているだけですので、フルパスになっているはずです。

もしかしたら誤解しているかも?ということで補足:
ファイルがコピーされるフォルダーはコピー元のファイルと同じになります。ActiveSheet(VBAを書いているブックのことですよね?)ではありません。もちろん、それらが同じフォルダーにあるならば結果的に同じことです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/25 09:56

    おそらく拡張子を変更してコピーしたファイルを削除したいということだと思われますので、
    コピーしたかどうかを変数に格納しておいて、コピーした時のみ kill strFileName を実行するようにしたほうがいいかもしれません。でないと、オリジナルのファイルを削除してしまう可能性があります。

    キャンセル

  • 2019/01/25 10:27

    オリジナルのファイルは.csvであり、.txtは(例えば今回のようなケースで作成された)作業用ファイルなのだと決めつけてしまっていたので考えから外れていましたが、なるほどそうかもしれませんね。

    本当に一時作業用ファイルならば、コピー先を%temp%あたりにするようなアドバイスも、と考えましたが、回答としてつけられたQueryTables.Addを使ったほうがスマートですね。

    キャンセル

  • 2019/01/25 11:25

    lazybones2000様
    私の拙い説明からここまで詳細なご説明を頂きありがとうございます!
    ちなみに、読み込むCSVやマクロを起動したExcelなどがすべて同じフォルダにあったので勘違いしてしまいました。
    非常に勉強になりました。また、説明不足の投稿となり申し訳ございませんでした。

    キャンセル

+1

(回答依頼とはなんだろう。。。。)(独り言)

解決済のようですが、一応書いてみます。

CSVファイルをテキスト形式で開いてから指定の位置からコピーをしたく

「CSVファイルの固定の位置のデータを取り込みたい」

が、やりたいことならば、難しく考えず、

1)CSVファイルをエクセルで開く
2)指定の位置のセルをコピペ
3)開いたファイルを保存せずに閉じる

の作業工程で出来ると思います。
このコードを探りたいなら、その操作を、「マクロの記録」という機能で、
VBAに記録してもらえば、参考になるコードが得られます。
このコードを参考に再利用可能な形に改変すればマクロ化出来ると思います。

ただし、データ中に、
001
というような文字列や、エクセル君が日付と読める文字列があれば、
おせっかいして、変換してくれちゃいますので、
そういう場合は、「テキストファイルのインポート」の機能を使い、
列毎にデータの型を指定して文字列をデータとして取り込めばいいです。

あんまり、CSVファイルとかTXTファイルとか気にしなくていいです。
とりあえず、1回手動でエクセルで開いてみて、結果から、対応を判断すればいいと思います。
エクセルで開いてしまえば、それはエクセル君から見たら、
「ワークブック」
なので。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/26 10:52

    mattuwanさん
    回答依頼したのに先に解決済みにしており申し訳ございません。
    (他の方の回答で解決したため、先にベストアンサーをつけさせて頂きました…本当に失礼いたしました。)
    また依頼を出すかもしれませんが、もしお時間があればご確認頂けると幸いです…

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る