[[20040909150950]] 『.CSVシートの保存方法』(yu_mama) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『.CSVシートの保存方法』(yu_mama)

 あるシートの内容を(XXX.CSVで保存されたものを)メモ帳を使って
内容を確認したところ、セルの内容が「""」で囲まれ、「,」で区切られて
いました。EXCELからCSV形式で保存しても、「""」では囲まれず、「,」で
区切られるだけです。どのような方法で保存するとセルの内容が「""」で囲まれ、
「,」で区切られるようになるのでしょうか。

 例)
 EXCELシートで
 A B  C    D
 0  C17 C6
 と入っているのもを下のように保存したいのですが。

 "0","   ","C17","C6"


 文字列は "" で囲まれます。

 「,」で区切られるのは、セルごとでしょう。

  (INA)


 セルの書式を文字に直してもCSV形式で保存後、メモ帳で確認すると
[""]では区切られず、[,]区切りだけになってしまします。

EXCEL2000、Windows2000です。


 ↓こちらが参考になると思います。(Yosh!)
[[20031023104406]] 『テキストの出力』(石川)


 1セルに , が含まれると、""で囲まれますね。

  (INA)


 皆さんアドバイスありがとうございます。
[[20021201112102]] 『ファイルの種類CSVで保存の時・・・』(だん) 
も参考にさせていただきました。Accessでエクスポートしてみますと
すべてのセルが""で囲まれました。希望としては、文字は""で囲み、数字は
""で囲まず、でした。(セルの書式で文字列は囲む、数値は囲まず)
マクロで出力するしか方法は無いようですね。(yu_mama)

 マクロを使わない方法です。
 少し面倒かもしれません(^_^A;
 1.まず、CSVファイルに保存したいシートをすべてコピーして別のシートに値の貼り付けをします。

 2.次に、新しいシート側で 編集−ジャンプ−セル選択−定数で OK
  そのままの状態で、数式バーに =IF(ISNUMBER(sheet1!A1),sheet1!A1,sheet1!A1&"@@@")と入力して、
  Ctrlキーを押しながらEnterキーを゙(*・・)σ【Enter】ぽちっとな♪
  sheet1はそちらの環境に合わせて名前を変えてください。
  A1セルかどうかは、アクティブセルがどこかで変わります。
  @@@は何でも良いんですが、そのシートで絶対に使われてない文字列とする。
  これで、新しいシートのセルが全て、新しい文字で置き換えられてると思います。

 3.全て選択して、形式を選択してコピーで値

 4.元々あるシートを削除

 5.CSVファイルでカンマつきを選んで保存

 6.メモ帳で該当ファイルを開く

 7.編集−置換えで 検索する文字列に @@@ 置換後の文字列は何もいれないで゙(*・・)σ【全て置換】ぽちっとな♪

 (川野鮎太郎)

 ( ̄0 ̄;アッごめんなさい・・・・@@@じゃ駄目だったんだ_/ ̄|○ il||li
 @@@の部分を ,@@@ カンマ付きに変えてください。少し修正(^_^A;
 (川野鮎太郎)

 ありがとうございました。試してみました。確かに出来ました。内容がまだ理解できて
いないので、これから考えようと思います。m(__)m (yu_mama)

 その後色々試して不具合を発見しました。川野さんに教えて頂いた手順で、2番の
数式に変換する範囲ですが、数字以外はすべて",@@@"にしたいと思います。空白セル
についても処理をしたいのです。従いまして、A1からK最終行までの範囲で数式を
入れたい場合の範囲指定はどうすれば良いのでしょうか。
 結局マクロを組もうと思います。マクロを組む場合は、はじめから""をセルに入力
したほうが良いのでしょうか。なるべくならテキストでの編集をせず、Excelだけで
処理を終わらせたいと思います。良いアドバイスがありましたらお願いします(yu_mama)

 マクロでK列の最終行までの範囲を取得したい場合は、K65534からA1を選択して、Shift+Ctrl+↑キーで出来ると思います。
 マクロの記録で行うと下記の様になります。
    Range("A1:K65534").Select
    Range("K1").Activate
    Range(Selection, Selection.End(xlUp)).Select
 選択範囲のセルデータを For Each で繰り返し処理して、""を付け加えていくマクロを組んだほうが良いかもしれませんね。
 ※Shiftが抜けていました。
 (川野鮎太郎)

 とりあえず作ってみました。
 ""を付けてCSVで保存しても、TXT形式で読み込んだらカンマで区切られませんでした。
 1から3までの手順をマクロ化してみました。
 Sub CSV書き出し用()

 Sub CSV書き出し用()
 Dim Mycell As Range
 RE = Range("K65534").End(xlUp).Row
    Range(Cells(1, 1), Cells(RE, 11)).Select

    For Each Mycell In Selection
            If IsNumeric(Mycell) = False Or Mycell = "" Then
                Mycell = Mycell & ",@@@"
            Else
            End If
    Next
 End Sub

 本当ならTXT形式への直接書き込みまですれば良いんですけど、あまり時間が無かった(^_^A;
 (川野鮎太郎)

 あまり良い出来ではないかと思いますが一応動きました。
 ※yu_mama.txt ←このファイル名のものを、該当するエクセルファイルと同じフォルダーに作ってから試してください。

  Sub TEXT書き出し()
  Dim TextFileName As String
  Dim rg As Range
  Dim Mycell As Range

  RE = Range("K65534").End(xlUp).Row
  Range(Cells(1, 1), Cells(RE, 11)).Select

    For Each Mycell In Selection
            If IsNumeric(Mycell) = False Or Mycell = "" Then
                Mycell = """" & Mycell & """"
            Else
            End If
    Next

  TextFileName = ActiveWorkbook.Path & "\yu_mama.txt"
  Open TextFileName For Output As #1
  For i = 1 To RE             'ここから
        Print #1, Cells(i, 1) _     
        & "," & Cells(i, 2) _
        & "," & Cells(i, 3) _
        & "," & Cells(i, 4) _
        & "," & Cells(i, 5) _
        & "," & Cells(i, 6) _
        & "," & Cells(i, 7) _
        & "," & Cells(i, 8) _
        & "," & Cells(i, 9) _
        & "," & Cells(i, 10) _
        & "," & Cells(i, 11)
  Next                   'ここまでも繰り返し処理で出来るのでしょうが、
  Close #1                 '余計に判りづらいので分けました。
  End Sub

 (川野鮎太郎)


 少しだけ…

 >※yu_mama.txt ←このファイル名のものを、該当するエクセルファイルと同じフォルダーに作ってから試してください。

 これについては、Openで開く段階で無い場合でも勝手にファイルを作るはずです。
 また、For Outputで開く場合は問答無用で上書きになるので注意。

 あと、文字列が空欄の場合はIsNumericで引っかかるので、
            If IsNumeric(Mycell) = False Or Mycell = "" Then
というように別個に判断する必要はありません。
(明示的で分かりやすくはありますね)

 で、川野さんの行っている処理を、もうちょっとまとめて見ました。
                Mycell = """" & Mycell & """"
とやっちゃうと、エクセルの元データがいじられちゃって、
二度三度と実行した場合に不都合があると思いましたので…
以下に私が勝手に手を入れさせてもらったものを記載して見ます。
出力されるテキストの結果は同じです。

 (一応動作確認バージョン Windows2000 Excel2000)

 Sub TEXT書き出し()
    '********************
    '変数宣言
    '********************
    Dim strTextFileName As String
    Dim lngRow As Long
    Dim lngCol As Long
    Dim lngMaxRow As Long
    Dim lngMaxCol As Long
    Dim intFNo As Integer
    Dim strLine As String
    Dim strWk As String

    '********************
    '処理開始
    '********************

    '出力テキストファイル名を設定
    strTextFileName = ActiveWorkbook.Path & "\yu_mama.txt"

    'ファイル番号取得
    intFNo = FreeFile
    '上書きでファイルを開く
    Open strTextFileName For Output As #intFNo

    'K列に入力されたデータを元に最大行を取得
    lngMaxRow = Range("K65534").End(xlUp).Row
    '最大列を固定で11列とする
    lngMaxCol = 11

    '1行目から最大行まで処理
    For lngRow = 1 To lngMaxRow
        '1行分のデータを保持する変数初期化
        strLine = ""
        '1列目から最大列まで処理
        For lngCol = 1 To lngMaxCol
            'セルの値を取得
            strWk = Cells(lngRow, lngCol)
            '数値ではなかったら""でくくる
            If Not IsNumeric(strWk) Then
                strWk = """" & strWk & """"
            End If
            '1行分のデータを保持
            strLine = strLine & strWk & ","
        Next
        '(一応確認の上)書き出すデータがあるなら書き出し
        If strLine <> "" Then 
            Print #intFNo, Left(strLine, Len(strLine) - 1)
        End If
    Next

    '開いたファイルを閉じる
    Close #intFNo

    MsgBox "処理終了"
 End Sub

 (近所で時々見かけるPG)←いい加減長いから改名するかな…

 近所で時々見かけるPGさん、いつもご指導ありがとうございます。
 ↑確かに長いです(^_^A;
 朝から一生懸命ステップインで確認しながら勉強しました。(クリックしすぎで腱鞘炎になりそう(^_^A;
 そして、私なりに少し追加しました。

 Sub TEXT書き出し改()
    '********************
    '変数宣言
    '********************
    Dim strTextFileName As String
    Dim lngRow As Long
    Dim lngCol As Long
    Dim lngMaxRow As Long
    Dim lastCell As String
    Dim lngMaxCol As Long
    Dim intFNo As Integer
    Dim strLine As String
    Dim strWk As String
    Dim bName As String

    '********************
    '処理開始
    '********************

    '最終列をマウスで指定する
    lastCell = Application.InputBox( _
        prompt:="最終セル(列)を選択してください。", _
        Default:=Cells(1, 256).End(xlToLeft).Address)
    'キャンセルの場合処理を中止
    If lastCell = "False" Then Exit Sub
    '最終列を取得
    lngMaxCol = Range(lastCell).Column
    '最終列に入力されたデータを元に最大行を取得
    lngMaxRow = Cells(65534, lngMaxCol).End(xlUp).Row

    '出力テキストファイル名を決める
    strTextFileName = Application.InputBox( _
        prompt:="書き出すファイル名を入力してね♪", _
        Default:=Default:=Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 4))
    'キャンセルの場合処理を中止
    If strTextFileName = "False" Then Exit Sub
    'テキストファイル名を設定
    strTextFileName = ActiveWorkbook.Path & "\" & strTextFileName & ".txt"

    'ファイル番号取得
    intFNo = FreeFile
    '上書きでファイルを開く
    Open strTextFileName For Output As #intFNo

    '1行目から最大行まで処理
    For lngRow = 1 To lngMaxRow
        '1行分のデータを保持する変数初期化
        strLine = ""
        '1列目から最大列まで処理
        For lngCol = 1 To lngMaxCol
            'セルの値を取得
            strWk = Cells(lngRow, lngCol)
            '数値ではなかったら""でくくる
            If Not IsNumeric(strWk) Then
                strWk = """" & strWk & """"
            End If
            '1行分のデータを保持
            strLine = strLine & strWk & ","
        Next
        '(一応確認の上)書き出すデータがあるなら書き出し
        If strLine <> "" Then
            Print #intFNo, Left(strLine, Len(strLine) - 1)
        End If
    Next

    '開いたファイルを閉じる
    Close #intFNo

    MsgBox "処理終了"
 End Sub
 ε-(´o`) フー

 >Openで開く段階で無い場合でも勝手にファイルを作るはずです。
 >また、For Outputで開く場合は問答無用で上書きになるので注意。
 動いたのでわけもわからず使ってしまいました。(/-\*) ハジュカチ…
 ※参考までに、追加処理の場合はどのようになるのでしょうか。
 お暇なときにでも、ご教示いただけませんでしょうか。

 >あと、文字列が空欄の場合はIsNumericで引っかかるので、
            If IsNumeric(Mycell) = False Or Mycell = "" Then
 というように別個に判断する必要はありません。
 この部分は、私のコードで実行すると、空白セルに""が付かなかったので入れてました。
 う〜ん(/-_-\) =False っていう使い方が悪かったんですかね・・(^_^A;

 今回は自分のためにも非常に勉強になりましたm(._.)m ペコッ
 (川野鮎太郎)


 皆さんありがとうございます。私も朝8:00から動作確認していました。その間にも
更新されていたのですね。感激です。私のほうもどうにか思うようにちょっと細工して
今終了しました。ありがとうございます。
 ところで、見た目は思うとおりに変換したのに、このファイルを入力とするプログラムに
かけるとFORMATが違います。となります。見た目同じのテキストファイルを比較する
方法をありますでしょうか?(Excelの学校からはずれちゃいますね?)(yu_mama)

 その元となるテキストデータを1行だけでもここに貼り付け出来ませんでしょうか。
 (川野鮎太郎)

 元の aaa.CSV
" "," "," ","040802","X0123-12345-000"
"0","   ","C1","C6006020","C65139103KHN0","CKCP","GCM188R11H103KA01D","MURATA",2,"   ",""
"0","   ","C10","C6005980","C65139102KHN0","CKCP","GCM188R11H102KA01D","MURATA",3,"   ",""
"0","   ","C11","C6005980","C65139102KHN0","CKCP","GCM188R11H102KA01D","MURATA",0,"C10","" 

 このAAA.CSVをExcelで開いて修正したいのです。
例えば、2行目の 数字で 2 とある所を 0にする。 等
修正の終わったAAA1.CSVファイルを元のAAA.CSVと同じ形式の文字は""出囲み数字は
そのまま(1番はじめの0だけは""で囲みます:これは自分で細工しました)
修正の終わったAAA1.CSVをファイルの名前を変更し(AAA1.DAT)他のシステムの入力ファイル
にします。
ご教授頂いたマクロでつくったAAA1.CSVは 次のようになります。
" "," "," ",40802,"X0123-12345-000"
"0","   ","C1","C6006020","C65139103KHN0","CKCP","GCM188R11H103KA01D","MURATA",0,"   ",""
"0","   ","C10","C6005980","C65139102KHN0","CKCP","GCM188R11H102KA01D","MURATA",3,"   ",""
"0","   ","C11","C6005980","C65139102KHN0","CKCP","GCM188R11H102KA01D","MURATA",0,"C10",""

 同じですよね。隠れコードでもあるのかな?  (yu_mama)

 最初の行が違いますけど。

 " "," "," ","040802","X0123-12345-000" ←  元の aaa.CSV 040802が""で囲まれてます。
 " "," "," ",40802,"X0123-12345-000"  ← つくったAAA1.CSV
 他は=EXACT関数で比較しても同じでした。
 (川野鮎太郎)


 そうでした。修正するのを忘れていました。1行目は実行後に直すしかないですね。
ありがとうございました。うまくいきました。本当にいつもながらありがたいです。
=EXACT関数も次回から使ってみます。(yu_mama)

 どうにか1行目の処理もマクロに入れました。おかげさまです。ありがとうございました。(yu_mama)


 長い余談をば一つ…

 >※参考までに、追加処理の場合はどのようになるのでしょうか。

 For Output の部分を For Append とすれば、追加となります。
詳しくは「Open ステートメント」のヘルプを参照ください。
(多分あるはず…)

 >う〜ん(/-_-\) =False っていう使い方が悪かったんですかね・・(^_^A;

 それでも同様の結果になるはずですが、何でだろう。

 ちなみにですが、
結果がTrue,Falseで返ってくる関数に対して「= True」や「= False」とすると
「個人的には」コードを解釈しにくくなるのであまりつけません。
(本当に十人十色な部分なので…個人的にはというだけです)
例えば
    If IsNumeric(値) Then
    If Not IsNumeric(値) Then
という表記と、
    If IsNumeric(値) = True Then
    If IsNumeric(値) = False Then
という表記は、動き的には全く同じです。
個人ならば「そのマクロの作成者」にとって「どっちが見やすいと感じるか」というだけです。

 私の頭は融通が利きませんで、
 「If IsNumeric(値) Then」→「もし数値なら」
 という具合に脳内変換しやすいのですが、
「If IsNumeric(値) = True Then」→「もし数値と判断する関数がTrueという結果を返すなら」
というように脳内変換してしまい、思考の流れが止まるんです(笑)

 複数人で開発する場合になると、
こういった書式を「どっちに統一するか」という約束を事前に行わないと、
コーディングに統一感が無くなり、作った人以外が見た時に見づらくなる、と。
弊害があるとすればそれくらいの事です。

 (近所で時々見かけるPG)改め(ご近所PG)←短くしてみました

 ご教示ありがとうございます。
 朝ヘルプをみたら、Append、Binary、Input、Output、または Randomと項目はあったのですが、
 その内容についてが判らなかったんですが、ヘルプを下のほうにずずずーと降ろしたら
 ありました(^_^A;
 やはりマクロは難しいです(;^_^A アセアセ
 これからも、よろしくお願いしますm(._.)m ペコッ
 ※ご近所PGさん ←良いですね^^
 (川野鮎太郎)

 忘れてた。
ステップ実行は「F8」がショートカットキーです。
Debug時には活用ください。
(ご近所PG)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.