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

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

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

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

Q&A

解決済

2回答

2568閲覧

【VBA】csvの貼り付けて、ワークシート関数で集計

rt_nk

総合スコア13

VBA

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

0グッド

0クリップ

投稿2019/03/27 06:21

ここに質問の内容を詳しく書いてください。
ExcelVBAで複数のcsvファイルを読み込んでシートに貼り付けて、特定の列について集計するツールを作っています。
csvの貼り付けはネットで検索したものでうまくいきました。
現在、csvファイルの名前を取得してシートに記録して、そのセルの文字列をもとに貼り付けたcsvのシートをアクティブにして最終行にnullのセルをCOUNTBLANKで数えることを目的としています。csvの行数は10万行としました。

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

問題点1
csvファイルの名前を取得してシートに記録するプログラムがうまく動きません。エラーメッセージはでないのですが、シートに記録されていません。
問題点2
最終行にCOUNTBLANKの集計結果がうまく記入されません。
エラーメッセージ

### 該当のソースコード Sub test1()     '読み込むcsvファイル名を格納する変数 Dim bf As String Dim cnt As Integer Const Path As String = "ThisWorkbook\" 'csv 読み込みのための変数 Dim varFileName As Variant Dim FileName As Variant Dim CSVWorkSheet As Worksheet Dim NewWorkSheet As Worksheet Dim SheetName As String ' コピー範囲 Dim R1 As Integer Dim R2 As Long Dim C1 As Integer Dim C2 As Integer   'csvファイル名取得 bf = Dir(Path & "*.csv") Do While bf <> "" cnt = cnt + 1 Worksheets("Sheet2").Cells(cnt, 1).Value = bf bf = Dir() Loop ChDrive ThisWorkbook.Path varFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", Title:="CSVファイルの選択", MultiSelect:=True) If IsArray(varFileName) = False Then Exit Sub End If For Each FileName In varFileName SheetName = Dir(FileName) Set NewWorkSheet = CreateWorkSheet(SheetName) 'CSVファイルを開く Workbooks.Open FileName:=FileName Set CSVWorkSheet = ActiveSheet 'セル範囲取得 R1 = CSVWorkSheet.UsedRange.Row C1 = CSVWorkSheet.UsedRange.Column R2 = CSVWorkSheet.UsedRange.End(xlDown).Row C2 = CSVWorkSheet.UsedRange.End(xlToRight).Column 'セルの範囲のコピー CSVWorkSheet.UsedRange.Copy Destination:=NewWorkSheet.Range(NewWorkSheet.Cells(R1, C1), NewWorkSheet.Cells(R2, C2)) ActiveWorkbook.Close SaveChanges:=False 'nullチェック ActiveWorkbook.activeworksheet.Range("A100002").Value = WorksheetFunction.CountBlank(Range("A1:A100000")) End Sub Function CreateWorkSheet(WorkSheetName As String) As Worksheet Dim NewWorkSheet As Worksheet Dim ws As Worksheet Dim CheckSameName As Integer Set NewWorkSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count)) CheckSameName = 0 For Each ws In Sheets If ws.Name = WorkSheetName Then MsgBox "WorkSheetName:" + WorkSheetName + " Used Name" CheckSameName = 1 End If Next If CheckSameName = 0 Then NewWorkSheet.Name = WorkSheetName Set CreateWorkSheet = NewWorkSheet End If End Function

試したこと

・ファイルのパスをマクロと同じ場所にあるようにするために
Const Path As String = "ThisWorkbook"
としました
'nullチェックを以下のように、開いているファイルをActiveWorkbook.activeworksheet.としました。
ActiveWorkbook.activeworksheet.Range("A100002").Value = WorksheetFunction.CountBlank(Range("A1:A100000"))

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

Excel2010
OS:windows7 x64

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

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

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

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

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

guest

回答2

0

・ファイルのパスをマクロと同じ場所にあるようにするために
Const Path As String = "ThisWorkbook"

ざざっと流し読んで↑気になりました。

dim myPath as string

mypath = thisworkbook.path

ですかね?

投稿2019/03/28 12:19

mattuwan

総合スコア2136

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

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

rt_nk

2019/03/29 01:04

buf = Dir(ThisWorkbook.Path & "\" & "*.csv")とすることで対応しました。 アドバイスありがとうございます。
guest

0

ベストアンサー

問題点1

csvファイルの名前を取得してシートに記録するプログラムがうまく動きません。エラーメッセージはでないのですが、シートに記録されていません。

これは一度csvを2次元配列等で取得し、2重For文でセルに張り付けていけばいい話です。
空白はその時点でcountしておけば、問題2が動かなくても問題ないかと思います。

開発頑張って下さいね。

投稿2019/03/27 08:08

stdio

総合スコア3307

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

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

rt_nk

2019/03/29 02:39

おかげさまで、目的のものが出来上がりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問