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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

11771閲覧

VB.net CSVで読み込んだ値をExcel(.xlsx)に書き出す

退会済みユーザー

退会済みユーザー

総合スコア0

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2020/03/18 05:42

編集2020/03/18 07:18

■実現したいこと
VB.netでプログラムを開発中。
CSVファイルを読み込んで、新たに作成したExcelファイル(.xlsx)に書き出したい。

<フロー>
1.処理ボタンクリック
2.該当のCSVファイルを読み込む(1行目だけ)
3.新規Excelファイルを作成(output.xlsxを作成)
4.CSVで読み込んだ値が新規で作成したExcelファイルに書き込まれる
5.処理終了

<CSVの内容>
1, A, B, C
2, D, E, F
3, G, H, I

■困っていること
試しにCSVを読み込んでテキストに書き出すことは実現できました。
ですが、CSV→Excelに書き出す作業が分からず困っています。
(具体的に言うと、どういうコードを書けば良いか分からない)

色々ググってはいるものの、CSV→Excelに書き出す方法の情報が少ないので質問させていただきました。

配列等を使って処理したいのですが、ご教授頂きたいです。

■ソースコード

Imports

1Imports System.Runtime.InteropServices 2Imports System.IO 3Imports System.Text 4 5Public Class Form1 6    7Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 8 9 10 11 End Sub 12 13 14 '処理ボタンクリックイベント 15 Private Sub ShoriBtn_Click(sender As Object, e As EventArgs) Handles ShoriBtn.Click 16 17'入力ファイル(input.csv) 18Dim inputFile As String = "C:\Usersプログラミング\input.csv" 19 20'出力ファイル(output.csv) 21 Dim outputFile As String = "C:\Users\プログラミング\output.xlsx" 22 23 'output.xlsxを新規作成 24 Dim excelApp As New Excel.Application() 25 Dim excelBooks As Excel.Workbooks = excelApp.Workbooks 26 Dim excelBook As Excel.Workbook = excelBooks.Add() 27 28 'excelを見えるように表示する 29 excelApp.Visible = True 30 31 '名前を付けて保存 32 excelBook.SaveAs("C:\Users\プログラミング\output.xlsx") 33 34 '出力ファイルをオープンする 35 Using writer As New StreamWriter(outputFile, False, Encoding.Default) 36 37 '入力ファイルをオープンする 38 Using reader As New StreamReader(inputFile, Encoding.Default) 39 40 '読み取り可能文字が存在しない(ファイルの末尾に到着)すると -1が返される 41 While (reader.Peek() > -1) 42 43 '1行ずつ読み込み、出力ファイルに書き込む 44 writer.WriteLine(reader.ReadLine()) 45 46 End While 47 48 'ファイルを閉じる 49 reader.Close() 50 51 End Using 52 53 'ファイルを閉じる 54 writer.Close() 55 56 End Using 57 58 59 End Sub 60 61End Class

※上記のコードはCSVの1行目のみを読み込んで書き出す処理ですが、エラーが発生します。

■エラーメッセージ

’出力ファイルをオープンする
Using writer As New StreamWriter(outputFile, False, Encoding.Default)
を指して

「System.IO.IOException: '別のプロセスで使用されているため、プロセスはファイル 'C:\Users\プログラミング\output.xlsx' にアクセスできません。'」というメッセージが出てきます。

■補足
開発環境:Visual Studio2019
OS:Windows10
.NETFrame4.8
参照設定にて、Microsoft.Office.Interrop.Excel関連のモジュールは追加済み

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/03/18 06:16

コードは ``` と ``` で囲ってください。インデントされて見やすくなりますので。インデントされてないコードは質問者さん自身も読む気がしないのでは? 開発環境(OS, .NET Framework, Visual Studio のバージョンなど)を書いてください。
退会済みユーザー

退会済みユーザー

2020/03/18 07:12

''' ではなくて、バッククォート 3 つ ``` です。
退会済みユーザー

退会済みユーザー

2020/03/18 07:18

失礼しました。 修正いたしました。
Zuishin

2020/03/18 23:38

実務と課題では方法が違うんですよ。みなさん実務としての回答をしていますが、あなたが欲しているのは課題の答えですよね? 情報の探し方が悪い、の一言に尽きます。 CSV から Excel への変換方法について探したんでしょ? それは課題なのでそのまま探してもありません。課題を作った方も出す前に一度検索して簡単に見つからないことを確かめてから出したはずです。 探すべきは次の三つ。CSV の読み込み方、読み込んだデータの解析の仕方、解析したデータの出力の仕方です。このうち、読み込みについては(おそらく前の課題で)できています。 あとの二つですが、このレベルの人に出す課題ということから考えると、探すまでもなく習っているはずです。つまりあなた自身の応用がきかないというだけ。他の人はできています。じゃあ情報がどこにあるかわかりますよね?
guest

回答3

0

一例ですが、(1) TextFieldParser などの CSV パーサーを利用して DataTable を作成し、(2) ACE + ADO.NET で Excel ブックを作ってそれに書き込むという方法はいかがですか?

(1) の具体例は下記の記事を、

CSV パーサー
http://surferonwww.info/BlogEngine/post/2010/10/28/CSV-parser.aspx

(2) の具体例は下記の記事を見てください。

ACE OleDb で Excel のブック作成
http://surferonwww.info/BlogEngine/post/2012/01/26/Creating-Excel-workbook-by-using-ACE-OleDb-provider.aspx

追記: Microsoft.Office.Interrop.Excel 関連のモジュールとかは不要です。ACE だけダウンロードしてきてインストールすれば良いです。古い形式 .xls なら OS に同梱されている JET でもできます。

投稿2020/03/18 06:25

編集2020/03/18 23:04
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

恐らく色々なページのコードを切り貼りしてどのようなことをやっているのか
分からなまま作成したプログラムなのではないでしょうか?
ですので、物凄くちぐはぐなプログラムになっています。

まずエラーメッセージの説明について、T_Fさんが作成したプログラムでは
以下の部分でエクセルファイルを新規作成していますが、
StreamWriterで開こうとした時点でexcelBookがまだ掴んだ状態のままなので、
アクセス出来ず、エラーとなっています。

VB

1 'output.xlsxを新規作成 2 Dim excelApp As New Excel.Application() 3 Dim excelBooks As Excel.Workbooks = excelApp.Workbooks 4 Dim excelBook As Excel.Workbook = excelBooks.Add() 5 6 'excelを見えるように表示する 7 excelApp.Visible = True 8 9 '名前を付けて保存 10 excelBook.SaveAs("C:\Users\プログラミング\output.xlsx")

ではどうすればよいかというと、まずStreamWriterは必要ありません。
通常StreamWriterはテキストファイルへの書き込みするのに使用するもので
Excelファイルへの書き込みは別の方法で行う必要があります。

配列を用いて作るように指示があったということですので、
[VB.NET] Excelを新規に生成して保存するにあるExcel書き込みの基本的な流れが分かるプログラムを
参考に配列に格納したCSVファイルの内容をループで回して書き込みしてみましょう。

CSVファイルの読み込みについては、StreamReaderだとCSVファイルの内容を
配列に格納するのに適していないので、SurferOnWwwさんも紹介している
TextFieldParserを使用して読み込むのが良いと思います。
検索すれば参考となるページはたくさん出てきますが、こことか参考になるかと思います。

最後にWebで参考となるページを探してコピペするのはダメとは言いませんが、
コードがやっている意味を自分なりに調べてから使用するようにしましょう。

投稿2020/03/18 07:45

kaina

総合スコア418

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/03/23 01:14

なるほどですね。 非常に丁寧で詳しいご説明ありがとうございます。 プログラミング初心者なので、これからもちゃんと理解を深めて進めていこうと思います。 ありがとうございました。
guest

0

律儀にCSVファイルを読み込まなくてもExcelに任せてしまえばよいのでは。
試してませんが、こんな感じでできると思います。

VBNET

1'入力ファイル(input.csv) 2Dim inputFile As String = "C:\Usersプログラミング\input.csv" 3 4'出力ファイル(output.csv) 5Dim outputFile As String = "C:\Users\プログラミング\output.xlsx" 6 7'output.csvを読み込む 8Dim excelApp As New Excel.Application() 9Dim excelBooks As Excel.Workbooks = excelApp.Workbooks 10Dim excelBook As Excel.Workbook = excelBooks.Open(inputFile) 11 12'excelを見えるように表示する 13excelApp.Visible = True 14 15'名前を付けて保存 16excelBook.SaveAs(outputFile)

追記
「配列」という定義が曖昧ですが、1行読んで、配列に展開して、それをExcelに貼り付けるという愚直な処理を書いてみました。

VBNET

1 '入力ファイル(input.csv) 2 Dim inputFile As String = "C:\Usersプログラミング\input.csv" 3 4 '出力ファイル(output.csv) 5 Dim outputFile As String = "C:\Users\プログラミング\output.xlsx" 6 7 'output.xlsxを新規作成 8 Dim excelApp As New Excel.Application() 9 Dim excelBooks As Excel.Workbooks = excelApp.Workbooks 10 Dim excelBook As Excel.Workbook = excelBooks.Add() 11 Dim excelSheet As Excel.Worksheet = excelBook.Worksheets(1) 12 13 Dim row As Long 14 15 row = 1 16 17 '出力ファイルをオープンする 18 Using writer As New StreamWriter(outputFile, False, Encoding.Default) 19 20 '入力ファイルをオープンする 21 Using reader As New StreamReader(inputFile, Encoding.Default) 22 23 '読み取り可能文字が存在しない(ファイルの末尾に到着)すると -1が返される 24 While (reader.Peek() > -1) 25 26 '1行ずつ読み込み、出力ファイルに書き込む 27 Dim line As String = reader.ReadLine() 28 Dim cols() = line.Split(",") 29 Dim col As Long 30 For col = 1 To cols.GetLength(0) 31 excelSheet.Cells(row, col) = cols(col - 1) 32 Next 33 row = row + 1 34 35 End While 36 37 'ファイルを閉じる 38 reader.Close() 39 40 End Using 41 42 'ファイルを閉じる 43 writer.Close() 44 45 End Using 46 47 'excelを見えるように表示する 48 ' excelApp.Visible = True 49 50 '名前を付けて保存 51 excelBook.SaveAs(outputFile) 52 excelBook.Close()

投稿2020/03/18 06:29

編集2020/03/18 07:23
ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/03/18 06:55

回答ありがとうございます。 意図通り動くことが確認できました。 もちろん、こちらのほうが簡単で楽なのですが、できれば配列を用いたバージョンも教えて頂けないでしょうか。(値を配列で取得せよと指示がありましたもので...)
ttyp03

2020/03/18 07:26

とりあえず愚直に処理するのを追記しましたので確認してみてください。 余談 「値を配列で取得」というのは実に曖昧すぎます。 CSVファイル全体を配列化するのか、行単位なのか、 また配列化するにしても、自力でやるのか、便利な機能を使うのか、 仕事でやっているのか課題か何かなのかわかりませんが、もう少し明確な指示を仰いだ方がよいでしょう。
退会済みユーザー

退会済みユーザー

2020/03/18 07:33

指示としては、CSVファイルを読み込み、カンマ区切りで値を配列として取得し、そのままセルに値を展開する。と聞いています。
退会済みユーザー

退会済みユーザー

2020/03/18 07:47 編集

横レス失礼します。 質問者さん> そうしなければならないというやり方が決まっていて、それ以外は回答として NG なら、それを質問の一行目に明記しましょうよ。回答者の時間と労力を無駄にしないよう考えてください。 ところで、指示ということは上司の指示とか、研修などでの講師の指示ですか? そうであれば、上司・講師に聞くべき話と思うのですが・・・
Y.H.

2020/03/18 08:03

writer が何のためにあるのかわからない・・・^^;
ttyp03

2020/03/18 08:32

おっと、writer残ってましたね。 鼻から必要としてなかったので全く目に入ってませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問