プロが教える店舗&オフィスのセキュリティ対策術

はじめまして。
仕事でエクセルデータをカンマ区切り、ダブルコーテーション囲みのテキストデータにする必要があります。

例)
”111”,"222","","","","666""

このように空白のセルもあり、そのセルもダブルコーテーションで囲みたいです。
VBAで変更する方法をどこかで見かけましたが、張り付けてみましたが、上手く動きませんでした。
超初心者ですので、わかりやすく教えていただけると有り難いです。

お手数をおかけしますが、宜しくお願い致します。

質問者からの補足コメント

  • HAPPY

    皆様、沢山の方法を丁寧に教えてくださり、本当にありがとうございます(≧▽≦)
    ご親切に感動しています。
    体調不良で寝ておりましたので、試すことができておらず、申し訳ございません。
    皆様から頂いた方法を一つ一つ試していきたいと思っています。
    また、ご質問をするかもしれませんので、申し訳ございませんがもうしばらくお付き合いお願い致します。

      補足日時:2017/05/20 10:31
  • こんばんは。
    丁寧に教えてくださり、本当にありがとうございます。
    こんなことができるなんて尊敬です!
    だだ、初めからやり方がわかりません 汗)

    「できれば、以下は、個人用マクロブックに入れて、クイックツールバーのアイコンに登録すると便利かと思います。
    特に中身はいじる必要性はないと思いますが、この出力は、SJISです。
    UNICODE出力になれば、また、少し手を加えなくてはなりません。」
    ここからわからないので、手順を教えていただけますでしょうか。
    お手数をお掛けして申し訳ございません。

    No.3の回答に寄せられた補足コメントです。 補足日時:2017/05/21 21:23
  • 先回、教えてくださった通りにやったら出来ました。
    本当にありがとうございます。
    こちらは、そのマクロの後に追加で付けたらいいんでしょうか?
    こんな初心者で、世話がかかり本当に申し訳ありません。
    教えていただけると助かります。
    よろしくお願いいたします。

    No.6の回答に寄せられた補足コメントです。 補足日時:2017/05/23 03:43

A 回答 (8件)

Unicode 出力の件ですが、せっかく、個人用マクロブックに納められる(つもり)ので、それを、書き換えるよりも、後づけマクロのほうがよいかもしれません。

一緒にしてしまうと、Unicodeのみになってしまいますから、それも望まないし……
とあれこれ考えて、単独マクロで、Unicodeファイル判別するプログラムもつけました。BigEndien も LittleEndienも別けますが、出力は、BigEndienだけです。
こういうのは、余計なものかもしれません。

'//
Public Sub Convert2UNICODE()
'シフトJISをUnicodeに替えるマクロ
Dim stream As Object
Dim stream2 As Object
Dim fname As Variant
Dim buf As Variant
Dim b() As Byte
Dim i As Long
fname = Application.GetOpenFilename _
 ("File (*.*), *.*", 1, "ファイルオープン")
 If VarType(fname) = vbBoolean Then Exit Sub
 Open fname For Binary As #1
   ReDim b(1 To 6)
    Get #1, , b
  Close #1
 For i = 1 To 6
 buf = buf & Hex(b(i))
 Next
 If buf Like "FFFE*" Or buf Like "FEFF*" Then
  MsgBox "ファイルはすでにUnicodeです。", vbExclamation
  Exit Sub
 End If
 '-------変換プログラム-----------
On Error GoTo ErrHandler
Set stream = CreateObject("ADODB.Stream")
  stream.Open
  stream.Type = 2
  stream.Charset = "shift_jis"
  stream.LoadFromFile fname

Set stream2 = CreateObject("ADODB.Stream")
  stream2.Open
  stream2.Charset = "unicode"
  stream.CopyTo stream2
  stream2.SaveToFile (fname), 2
  stream2.Close
  stream.Close

Set stream2 = Nothing
Set stream = Nothing
Exit Sub
ErrHandler:
 If Err.Number <> 0 Then 
  Msgbox Err.Number & " :" & Err.Description
End If
End Sub
この回答への補足あり
    • good
    • 1

>こちらは、そのマクロの後に追加で付けたらいいんでしょうか?



この件については、私は迷いました。どうしたものかと。
私のほうが言い出した話ですし、ノウハウを公開しても、その価値と需要とは比例していません。

CSVの出力に組み込んでしまえばよいのですが、必ずしも、UNICODE CSVが必要とは限らないわけです。オプションで切り分けるには、UserFormなどで作った方がよいけれども、それほどにはないかもしれません。それが、必要なときは、Windowsをやっている時で、年に1度の頻度もないかもしれません。
例えば、テキストエディタのNotePad ++ でも、変換が利きます。

私の持論なのですが、個人用マクロブックに入れるものは、本当に厳選したものしかいれないように、また頻繁に使うものだけにする、ということにしています。あまり詰め込むと、Excelの起動が遅くなるからです。

参考にするだけで、テキストファイルにしておいて、何か思い出した時にでも、コードを貼り付けて使っていただいてもよろしいのではありませんか?

もし、Unicode CSVなどが、よく使うようでしたら、もう一度、コードを練り直すべきかもしれません。VBAでは、考えている以上の自由なことは出来ますが、汎用性がありません。新しい技術で、Excel DNAアドインなどにすれば、メモリ負担も少なく便利なのですが、未だ、私の技術は、新しい技術には伴わないのです。

なお、Excelは、Access の代わりのデータベースになります。
データベースのJet で、ADODB が使えます。
もうひとつは、本来のExcelの機能のひとつ、Ms Query です。
他にも、MySQL がありますね。

なかなか、全部が万能だとはいきませんが、新しい技術も古い技術も、使えるようになっていれば、新しい表計算スタイルの時代が来ても乗り越えられるような気がします。
    • good
    • 0
この回答へのお礼

初心者の私には、難しいことはわかりませんが、教えていただいたマクロで自分が思い描いていた通りにテキストファイルができ、感激しております。
時間を割いていただき、長い時間お付き合いいただいたこと、感謝いたします。
お陰で仕事がはかどります。
ありがとうございました(*´ω`*)

マクロを書いていただいたアンサーをベストアンサーにさせていただきますね。
ありがとうございました。

お礼日時:2017/05/23 20:41

[No.4お礼]へのコメント、


Accessでの確認が出来なかったこと、了解です。
現状の Excel でも、データに「,」が含まれている場合(例:\12,345)は「ダブルコーテーション囲みのテキストデータ」になることを申し添えておきます。
他の回答の中に、このことが弊害になるものがないことを祈っています。
    • good
    • 0
この回答へのお礼

長い時間、お付き合いいただき、ありがとうございました。
ご親切に感謝いたします。
本当にありがとうございました(*^-^*)

お礼日時:2017/05/23 20:37

#3の回答者です。


まず、このマクロは、Excel2003の時に開発されたもので、当時は、Unicodeなど問題にならなかった時代です。Unicodeの話は後にさせていただいて、私個人としては、なかなか使えるマクロだなって思っています。
(本来は、文字には、「" "」 が付き、数字には、つかないというものだったのです。)

「個人用マクロブック」は、
ここらにも書かれてありますが……
https://allabout.co.jp/gm/gc/297809/

1.記録マクロ(左下の帯の部分-準備完了や開発タブを開いて記録マクロをクリック)
2.「マクロの記録」というダイアログで、保存先を個人用マクロブックにします。

3.画面のどこでもよいので、マウスを一回クリックします。

4.マクロ終了■ で止めます。

5.Alt-F11 で、VBA Editor で画面が開きます。

6.プロジェクトエクスプローラーという画面があります。なければ、
Ctrl + R のショートカットキーで出てきます。

7.VBAProject(PERSONAL.EXLB )あるはずですから、ダブルクリックで開いてみます。

8.標準モジュールというものがあるはずで、そこに、Module1 をクリックします。

9.
Sub Macro1()
Range(**).Select
End Sub

先程の命令は、ここに記録されました。
10.後は、前回のコードをSub ~ End Sub まで、コピー&ペーストしてあげます。

ひとまず、ここで、Ctrl +S で保存
VBA Editor の右上[×]をクリックしても、Excelは終了しません。
右上[×]をクリックして閉じてください。
------------------------
クィックアクセスツールバーの絵は以下を参考にしてください。

https://allabout.co.jp/gm/gc/297722/

1.オプションから設定からです。
2.Excel のオプションの中で、[クイックアクセスツールバー]という項目がありますが、それをクリックして開けます。

3.左側に        右側に
コマンドの選択    クイックアクセスツールバーのユーザー設定
とあります。

4.左側で、マクロを選択すると、個人用マクロブック(PERSONAL.XLSB!Sub CsvOutWithQuatation()) がありますので、それを画面の真ん中のボタンで
「追加→」で右側に表示させます。

5.右側に入ったマクロ名を選択し、右側の画面の下に「変更」がありますので、それをクリックするとダイアログが出てきます。アイコンと名称を選んでつけてあげます。画像は、そのダイアログボックスです。

このアイコンは、本来は、全部で5000以上もあるのですが、このダイアログで選べるのは限定されています。
------------------------
なぜ、個人用マクロブックをおすすめするかというと、使っているブックの拡張子などには影響されずに可能だからです。

Unicode の件については、あったほうがよいかとは思いますが、今、少し長くなりすぎたので、後にさせてください。(今、PCが故障中で直りませんが、なんとか持たせられると思います)
---------------------------
お体お大事に。
「エクセルデータをカンマ区切り、ダブルコー」の回答画像5
    • good
    • 1
この回答へのお礼

できました!!!
感動です(≧▽≦)
ご親切に教えていただき、ただただ感謝です。
本当にありがとうございます。

お礼日時:2017/05/23 03:39

》 超初心者ですので、…


昔の職場の私も同様の立場で、その時の記憶では(今は手元にない)MS Access から CSV化するときは全てのデータが「"」で囲われていたような。もし Access が使えるなら試してみてください。

【独白】どうしてMSは全データを「"」で囲うCSVをオプションとして加えないのかなぁ~?
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
Accessが無いようです。
ご親切に教えてくださり、ありがとうございました(*^-^*)

お礼日時:2017/05/23 03:50

こんにちは。



できれば、以下は、個人用マクロブックに入れて、クイックツールバーのアイコンに登録すると便利かと思います。
特に中身はいじる必要性はないと思いますが、この出力は、SJISです。
UNICODE出力になれば、また、少し手を加えなくてはなりません。


'//標準モジュール
Sub CsvOutWithQuatation()
 Dim Rng As Range
 Dim r As Range
 Dim buf As String
 Dim fNo As Integer
 Dim fn As Variant
 Dim c As Variant
'*******設定欄 *********
 Const QT As String = """" 'クォーテーション
 Const sep As String = "," 'コンマ切り
 Const Ext As String = ".csv" '拡張子
'*********************
 
 If TypeName(Selection) = "Range" Then
  Set Rng = Selection
  If Rng.Count < 3 Then
   MsgBox "3セル以上の範囲を選択してください。", vbExclamation
   Exit Sub
  End If
 Else
  MsgBox "セルの範囲を選択してください。", vbExclamation: Exit Sub
 End If
 fn = Application.GetSaveAsFilename _
 (Format$(Date, "yy-mm-dd"), "CSV File (*" & Ext & "),*" & Ext & "", 1, "CSV保存")
 
 If VarType(fn) = vbBoolean Or fn = "" Then Exit Sub
 If Dir(fn) <> "" Then
  If MsgBox(Dir(fn) & "はすでにあります。上書きしますか?", vbExclamation + vbOKCancel) = vbCancel Then
   Exit Sub
  End If
 End If
 fNo = FreeFile()
 Open fn For Output As #fNo
 '********Start Export ************
 For Each r In Rng.Rows
  For Each c In Range(r.Cells(1), Cells(r.Row, Columns.Count).End(xlToLeft))
   buf = buf & sep & QT & c.Value & QT
  Next
  Print #fNo, Mid(buf, 2)
  buf = ""
 Next
 Close #fNo
 Beep
End Sub
この回答への補足あり
    • good
    • 1

関数で作る方法なら下記の内容で如何でしょうか?


前提として例に書かれているデータがA列からF列にあるとして関数を組んでます.

=""""&IF(A1<>"",A1,"""")&""","&IF(B1<>"",B1,"""")&""","&IF(C1<>"",C1,"""")&""","&IF(D1<>"",D1,"""")&""","&IF(E1<>"",E1,"""")&""","&IF(F1<>"",F1,"""")&""""
    • good
    • 1
この回答へのお礼

教えていただいた通りやったら出来ました!!
ご親切に考えてくださり、本当にありがとうございました。
皆様の温かさに感動しております。
ありがとうございました(*´▽`*)

お礼日時:2017/05/23 03:48

VBAじゃないとダメでしょうか?


いちよう簡単な方法ですが、

①CSV(カンマ区切り)で名まえを付けて保存します。
②保存したデータをテキストエディタで開きます。
③「,」カンマ → 「","」ダブルコーテーションカンマダブルコーテーション 置き換えます。
④「^」正規表現で行の先頭 → 「"」ダブルコーテーション 置き換えます。
⑤「$」正規表現で行の行末 → 「"」ダブルコーテーション 置き換えます。

以上です。正規表現で置き換えが可能なテキストエディタがあれば出来ると思います。
    • good
    • 1
この回答へのお礼

教えてくださり、ありがとうございます。
この方法を試したら、できました!!!!
本当にご親切に教えてくださり感謝です。
ありがとうございました(≧▽≦)

お礼日時:2017/05/23 03:45

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