ここから本文です

初心者ですが出力されたCSVをExcelファイルに変換したいと思っています。 手段は...

アバター

ID非公開さん

2017/12/107:14:13

初心者ですが出力されたCSVをExcelファイルに変換したいと思っています。
手段はマクロやバッチあたりで手軽に作れるものだと嬉しいです。どなたか教えて頂けませんか?よろしくお願いいたしま

す。

やりたいことは以下です。
csvで出力されたカンマ区切りのデータを指定列に入れていくと言うものです。
日付,名前,担当,番地,番号,内容
日付,名前,担当,番地,番号,内容


A列に日付、D列に名前、F列に担当、J列に番地、K列に番号、AA列に内容
行については連番で大丈夫です。

環境はExcel 2007
プログラミング環境なし

閲覧数:
457
回答数:
7
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

lin********さん

2017/12/109:36:17

「VBScript」による回答です(「Windows限定」です)。

このプログラムは、プログラムファイルに「csv」ファイルを1つだけ、ドラッグ&ドロップするだけです。

ドラッグ&ドロップしたファイルと同じフォルダ内に同じベースネーム(「abc.csv」→「abc.xlsx」)のエクセルブックを作成します。

最後に、「Finished!」と表示しますので、「OK」を押して、終了してください。

以下のプログラムを、メモ帳かテキストエディタに貼り付け、「~.vbs」という名前で保存します。

「~」の部分は、何でもかまいませんが、「.vbs」の部分は、必ず半角です。

できたプログラムファイル(「~.vbs」ファイル)に、これから処理したい「csv」ファイルを1つだけ、ドラッグ&ドロップするだけです。

Option Explicit
Dim a, bk, c, cv, ex, f, i, n, r, sh, so, wa
Set so = CreateObject("Scripting.FileSystemObject")
Set wa = WScript.Arguments
If wa.Count <> 1 or LCase(so.GetExtensionName(wa(0))) <> "csv" Then
MsgBox("ドラッグ&ドロップできるのは、csvファイル1つだけです")
WScript.Quit
End If
c = Array(1, 4, 6, 10, 11, 27)
f = so.GetParentFolderName(wa(0))
n = so.GetBaseName(wa(0))
Set ex = CreateObject("Excel.Application")
ex.Application.DisplayAlerts = False
ex.Visible = False
Set bk = ex.Workbooks.Add()
Set sh = bk.Worksheets(1)
Set cv = so.OpenTextFile(wa(0), 1)
r = 0
Do Until cv.AtEndOfStream
a = Split(cv.ReadLine, ",")
r = r + 1
For i = 0 to UBound(c)
sh.Cells(r, c(i)).NumberFormat = "@"
sh.Cells(r, c(i)).Value = a(i)
Next
Loop
cv.Close
bk.SaveAs(f & "\" & n & ".xlsx")
bk.Close
ex.Quit
Set cv = Nothing
Set sh = Nothing
Set bk = Nothing
Set ex = Nothing
Set wa = Nothing
Set so = Nothing
MsgBox("Finished!")

簡単な説明です。

Option Explicit

「厳密に」というような意味ですが、気にしないでください。

Set so = CreateObject("Scripting.FileSystemObject")

ファイルやフォルダを扱えるようにしていますが、今回は特に、「csv」ファイルという、テキストファイルを扱うのにも必要です。

Set wa = WScript.Arguments
If wa.Count <> 1 or LCase(so.GetExtensionName(wa(0))) <> "csv" Then
MsgBox("ドラッグ&ドロップできるのは、csvファイル1つだけです")
WScript.Quit
End If

ドラッグ&ドロップされるのを待っていて、ドラッグ&ドロップされると、その数や拡張子を調べて、想定外なら、メッセージを表示して、プログラムそのものを終了しています。

c = Array(1, 4, 6, 10, 11, 27)

書き込む列(「A, D, F, J, K, AA」)を配列変数に格納しています。

「Array()」は、配列変数に格納する関数で、上記の場合、「c(0) = 1」、「c(1) = 4」、「c(2) = 6」、「c(3) = 10」、「c(4) = 11」、「c(5) = 27」と記述しているのと同じです。

f = so.GetParentFolderName(wa(0))

ドラッグ&ドロップされたファイルが存在するフォルダを取得しています。

n = so.GetBaseName(wa(0))

ドラッグ&ドロップされたファイルのベースネーム(「abc.csv」→「abc」)を取得しています。

Set ex = CreateObject("Excel.Application")

エクセルを扱えるようにしています。

ex.Application.DisplayAlerts = False
ex.Visible = False

「上書きしますか?」などと聞いてこないように、また、エクセルを表示しません。

Set bk = ex.Workbooks.Add()
Set sh = bk.Worksheets(1)

ブックを新規作成し、一番左端のシートを「sh」にセットしています。

Set cv = so.OpenTextFile(wa(0), 1)

ドラッグ&ドロップされたファイルを、「読み込み専用」で開いています。

r = 0

行カウント用変数の初期化。

Do Until cv.AtEndOfStream

ドラッグ&ドロップされたファイルの終端まで処理。

a = Split(cv.ReadLine, ",")

「Split()」は、「区切り記号(今回は「,」)」を使って、配列変数に格納します。

たとえば、読み込んだ1行が、「1,2,3」の場合、「a(0) = 1」、「a(1) = 2」、「a(2) = 3」となります。

r = r + 1

1行カウント。

For i = 0 to UBound(c)

「UBound()」は、配列変数の添え字(「()」内の数字)の最大値を返します。

「c」は、上記の「c = Array(1, 4, 6, 10, 11, 27)」ですから、「c(5) = 27」の「5」です。

したがって、「For i = 0 to 5」と記述しているのと同じです。

sh.Cells(r, c(i)).NumberFormat = "@"

書き込むセルの書式を「文字列」に設定しています。

こうしておかないと、「日付」や「番地」などが正しく書き込まれない可能性があります。

sh.Cells(r, c(i)).Value = a(i)

それぞれの列に、それぞれの値を書き込んでいます。

Next
Loop

を、ファイルの終端まで繰り返しています。

cv.Close

「csv」ファイルを閉じています。

bk.SaveAs(f & "\" & n & ".xlsx")

ブックを、「csv」ファイルと同じフォルダ内に、同じ名前(「abc.csv」→「abc.xlsx」)で保存しています。

bk.Close

ブックを閉じています。

ex.Quit

エクセルそのものを終了しています。

Set cv = Nothing
Set sh = Nothing
Set bk = Nothing
Set ex = Nothing
Set wa = Nothing
Set so = Nothing
MsgBox("Finished!")

あとは、終了処理で、最後に「Finished!」と表示しています。

  • lin********さん

    2017/12/206:16:25

    追伸。

    「プログラミング環境なし」とありますが、「VBScript」は、「Windows」が標準で持っていますので、「プログラミング環境なし」でも問題なく実行できます。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

アバター

質問した人からのコメント

2017/12/7 19:54:30

必要としていた物ができました!
詳しい説明まで記載していただきありがとうございました。

ほかの方も思いつかなかった手段や別の方法を提案していただきありがとうございました。
今回はlin_nyan36さんをベストアンサーに選ばせていただきます。
皆様ほんとにご協力ありがとうございました。
重ねてお礼申し上げます。

ベストアンサー以外の回答

1〜5件/6件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

aka********さん

2017/12/611:06:38

CSVをExcelファイルに変換したい ではなく

一つのセルに 日付,名前,担当,番地,番号,内容 と なっているものを
項目ごとに 各セルに分けたいだけなら

データータブの 区切り位置を 使えば 全データー一発で 変換できます。

データーの入っている列全体を選択 データータブの区切り位置を クリック
カンマやタブにクリックをいれ 次へをクリック
区切り文字を カンマを 選択 次へ 完了で
全データーが 分けれます。

アバター

ID非公開さん

2017/12/122:25:59

プログラミング環境なし、って PowerShell も使えませんか?
PowerShell は Windows7以降のOSに標準で含まれています。

PowerShellで、

Get-Content Sample.csv | % { $_ -replace "(.*?),(.*?),(.*?),(.*?),(.*?),(.*?)" , '$1,,,$2,,$3,,,,$4,$5,,,,,,,,,,,,,,,,$6' }
> Sample2.CSV

てやってやると、

日付,名前,担当,番地,番号,内容
11/3,山田,鈴木,3,5,AAA
11/5,加藤,白井,5,8,BBB

みたいな内容の、Sample.CSV を読み込んで、

日付,,,名前,,担当,,,,番地,番号,,,,,,,,,,,,,,,,内容
11/3,,,山田,,鈴木,,,,3,5,,,,,,,,,,,,,,,,AAA
11/5,,,加藤,,白井,,,,5,8,,,,,,,,,,,,,,,,BBB

みたいな内容の、Sample2.CSV に出力出来ます。
あとはこれを Excel に読み込むだけです。

プログラミング環境なし、って PowerShell も使えませんか?
PowerShell は...

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

tak********さん

2017/12/120:47:24

文面を拝見して、Sampleを作成致しました。

ご参考になれば幸いです。

アクセスはこちらから → https://goo.gl/EVr6Fx

アクセスが出来ない時はお知らせください。

hir********さん

2017/12/120:06:11

別にマクロを使わなくてもExcelの機能の範囲で出来ると思います。
確か、データから挿入のテキストファイルだったと思います。
細かい設定は多分必要ないと思いますが、必要なら「Excel CSV インポート」あたりで調べれば出てくると思います(^▽^)/

プロフィール画像

カテゴリマスター

tai********さん

2017/12/110:08:16

エクセルで開いてB列に2列、E列に1列、G列に3列、L列に15列
挿入するだけのようだが・・・


指定列とはすでにあるファイルの指定列のこと?
そうでなければ

エクセルで開いておいて

Sub test()
Columns("B:C").Insert
Columns("E").Insert
Columns("G:I").Insert
Columns("L:Z").Insert
End Sub

を実行すればいいと思います。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる