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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

2418閲覧

CSV、エクセルの取り込み、2つを比較して対象データを取り出したい

Task_0513

総合スコア1

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2020/07/08 05:42

編集2020/07/08 05:51

前提・実現したいこと

ツールにCSVの住所データ(都道府県、市町村番地)とエクセルのデータ(都道府県、市、町村)の
2つを取り込み、ボタンを押すと、該当するデータA、前回対象だった(CSVにフラグがある)データB、エクセルに対象外と記載のあるデータC、エクセルに確認事項ありとなったデータDを吐き出すツールを作成しています。

CSV側のデータが大き目(6万件前後)で、両方のデータが使用毎(年1度)に変わる可能性があるものです。
ほぼ初心者で今までも簡単なものは触っていたのですが、少し期間が空いてしまい手詰まりになっています。
お知恵を拝借したく、よろしくお願いします。

発生している問題・エラーメッセージ

CSV側
実行時エラー1004
アプリケーション定義、またはオブジェクト定義のエラーです。

Excel側
ファイル名、または番号が不正です。

該当のソースコード

VBA Sub CSV入力1() '--CSV出力用_開始 Dim varFileName As Variant Dim intFree As Integer Dim strRec As String Dim strSplit() As String Dim i As Long, j As Long varFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _ Title:="CSVファイルの選択") If varFileName <> False Then Workbooks.Open varFileName Else MsgBox "キャンセルされました" 'Exit Sub End If intFree = FreeFile '空番号を取得 Open varFileName For Input As #intFree 'CSVファィルをオープン '既存の記載内容を削除する Worksheets("顧客").Range("A2", "ActiveCell.SpecialCells(xlLastCell)").ClearContents '一行ずつ、エクセルに書き出し i = 0 Do Until EOF(intFree) Line Input #intFree, strRec '1行読み込み i = i + 1 strSplit = Split(Replace(strRec, """", ""), ",") 'カンマ区切りで配列へ For j = 0 To UBound(strSplit) Cells(i, j + 1) = strSplit(j) Next 'エラーメッセージに関しては26行目(Z列に出力) Cells(i, 26).Value = ErrMsg_1 Loop Close #intFree '--CSV出力用_終了 InputRowcount = i End Sub Sub excelcopy() Dim ExcFileName As Variant Dim ExcintFree As Integer Dim ExcstrRec As String Dim ExcstrSplit() As String Dim k As Long, j As Long ExcFileName = Application.GetOpenFilename(FileFilter:="Excel ワークシート (*.xlsx),*.xlsx", _ Title:="Excelファイルの選択") If ExcFileName <> False Then Workbooks.Open ExcFileName Else MsgBox "キャンセルされました" 'Exit Sub End If ExcintFree = FreeFile '空番号を取得 Open ExcFileName For Input As #intFree 'Excelファィルをオープン '既存の記載内容を削除する Worksheets("対象エリア").Range("A2", "G2000").ClearContents End Sub

試したこと

Excelの神髄さんなどで検索しながらやっていますがなにぶん基礎の理解もちょっと怪しくなっている気がします。

補足情報(FW/ツールのバージョンなど)

Excel2013を使用しています。
過去に他の方が作成されたものをコピーして改変してます。
当時の担当者がもういないので、確認ができません。

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

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

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

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

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

Task_0513

2020/07/08 05:52

修正させていただきました。指摘ありがとうございます。
mdj

2020/07/08 06:06 編集

csvは Worksheets("顧客").Range("A2", "ActiveCell.SpecialCells(xlLastCell)").ClearContents ⇒ Worksheets("顧客").Range("A2", ActiveCell.SpecialCells(xlLastCell)).ClearContents で良いかと。入力データがどういうものなのかわからないので、A2~xlLastCellで良いのかは知りませんけど。 とりあえず ActiveCell.SpecialCells(xlLastCell) でぐるって意味を調べてください。デバッグして、止まった箇所を調べてください
guest

回答2

0

CSV側
実行時エラー1004
アプリケーション定義、またはオブジェクト定義のエラーです。

tosiさんの回答参照。

Excel側
ファイル名、または番号が不正です。

Diff

1 ExcintFree = FreeFile '空番号を取得 2- Open ExcFileName For Input As #intFree 'Excelファィルをオープン 3+ Open ExcFileName For Input As #ExcintFree 'Excelファィルをオープン

たぶんエラーが出ている箇所はこれである程度動くようになると思いますが、根本的にCSVファイルの扱いとExcelファイルの扱いをわかってらっしゃらないように感じます。
というのもどちらのファイルもワークブックとしてオープンしつつ、更にテキストファイルとしてもオープンしています。
CSVファイルはワークブックとしてオープンすると、Excelシートと同様に扱えるので読み込み処理が楽です。
1行読み込んでカンマ区切りで分割とかそういう処理は不要になります。
代わりにExcelシートの行数には限界がありますから、非常に大きなCSVファイルの場合はテキストファイルとして処理した方がよいでしょう。
逆にExcelファイルはテキストファイルとしては扱えません。
ワークブックとしてオープンする一択です。
そこらへんどのように処理するかは質問者さんが決めることなので、ここでこうすべき、とは言いませんのであとは色々調べながら修正してみてください。

投稿2020/07/08 06:15

ttyp03

総合スコア17000

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

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

Task_0513

2020/07/08 06:37

Excelの分はこれで開くようになりました。その後の処理はまた考えようと思います。 ExcelとCSVについてですが正直のところ尾恥ずかしながら確かによくわかっていません。 ただ今回処理するCSVで顧客を特定するために使用する部分が20桁以上の数字でなっており、頭にもお尻にも0がいくつかつくようなものです。 それを文字化けさせないためにCSVを使用している節があります。
ttyp03

2020/07/08 06:53

CSVを使用するのは全然かまわないのですが、いわゆるテキストファイルとして開くのか、ブックとして開くのか、どちらかにしましょうという話です。
Task_0513

2020/07/08 07:01

ちゃんと理解ができていなくてすみません。 独学で触っているせいかなかなか理解が及ばず。 もう少しいろんな資料などで勉強します。
guest

0

ベストアンサー


"ActiveCell.SpecialCells(xlLastCell)"

ActiveCell.SpecialCells(xlLastCell)
及び、Workbooks.Open varFileNameを削除する。

(理由)
ttyp03様が言われています様に、この度のエラーはCSVファイルをWorkbooks.OpenとOpen varFileName(Text)の両方を開いている事に起因すると思われます。
オープン後の処理はLine Inputで行われているので、元々Open varFileName(Text)が正しく、
Workbooks.Openは後で付け加えられたと思われます。

エラー部ではActiveCell.SpecialCellsを使っている為、アクティブなシートからセルを取得します。
しかし、Workbooks.Openがあることで読み込んだシートが前面に出てしまい、こちらがActiveシートとなります。
エラー部では、Worksheets("顧客")で処理しようとしていますが、その操作対象となるセルが別ブックのシートのセルであるため、見つける事ができずに処理エラーとなります。

投稿2020/07/08 05:56

編集2020/07/08 07:29
tosi

総合スコア553

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

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

Task_0513

2020/07/08 06:02

ご指摘いただいた点修正して試しましたが同じエラーが出ました。
tosi

2020/07/08 06:33 編集

エラー位置を教えて下さい。 VBAコード画面からF8を押すと一行ずつステップ実行されますでの、 どの行か分かります。 ------------------------------------------ (追記) 顧客という名称シートはありますか、変更されていませんか。
Task_0513

2020/07/08 06:34

varFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _ Title:="CSVファイルの選択") これを実行した後、ファイルをDLして開くまでは動いてるんですがその後に CSV側 実行時エラー1004 アプリケーション定義、またはオブジェクト定義のエラーです。 のエラーが出ました
tosi

2020/07/08 06:51 編集

>ファイルをDLして開くまでは動いてるんですが Open varFileName For Input As #intFreeまではOKと言うことですか。 ならば、 ThisWorkbook.Activate Worksheets("顧客").Select の2行をWorksheets("顧客").Range("A2", ActiveCell・・・・・・の前に付けてどうでしょうか。
Task_0513

2020/07/08 06:59

! ありがとうございます!動きました! シートがアクティブになっていなかったから動かなかった、という理解で大丈夫でしょうか? ここが動けば作業が一気に進められます。 本当にありがとうございました。
tosi

2020/07/08 07:04

申し訳けありません。良く見ましたら Workbooks.Open varFileName を削除しただけで動くかも知れません。 (理由は回答欄へ追記致します)
Task_0513

2020/07/08 07:49

追記いただいた分で試しても動きました。WorkBookが引っかかってたんですね。 ttyp03さまにもコメントいただいてました点ようやく合点がいきました。 みなさまありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問