![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
CSVファイルの内容は、
ID、値1、値2、値3
の4項目だけですが、100万行以上あるため、エクセルのワークシートには取り込めません。
値3には重複している値が多数あって、ユニーク数は40万件ほどになります。
VBAでユニーク数を算出したいだけなのですが可能でしょうか?
重複削除したCSVを生成する必要はありません。
数を出力したいだけです。
ちなみにAccessでリンク取り込みして、値3をグループ化してカウントする方法で実現はしております。
しかし誰でも使えるようにしたいというのと、ExcelVBAでそこまでできるか知りたく質問しました。
あと件数が多いのでできるだけ処理が早く終わる手法だと助かります。
よろしくお願いいたします。
A 回答 (8件)
- 最新から表示
- 回答順に表示
No.8
- 回答日時:
そのCSVって、「元になる一つ」があって、それを各人ダウンロードしたりしているんですよね?
もしそうなら
・その「元になる一つ」が置いてあるPCで、CSVを作るときに同時に重複を数えるプログラムも実行して、結果を別ファイル(例えばcount.csv)に保存する。
→ 使う人は、Data.csvとcount.csv をダウンロードする
って方法にすれば、「数えるプログラム」は1つのPCで動作させればいいので、「誰でも」である必要はありません。
他にも、Data.csvに保存するのではなく、最初からデータベースサーバーに登録するようにすれば、「SQLの結果だけをExcelに取り込む」ようにVBAでも作れば、「誰でも動かせる」ようになります。
Data.csvを誰でも動かせるプログラムで、ということに固執するのではなく、いろんな方法を考えてみては?
No.7
- 回答日時:
ADO の例です。
Sub Sanple()
Dim adoCON As Object
Dim adoRS As Object
Dim csvDir As String
Dim strSQL As String
Set adoCON = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
csvDir = ThisWorkbook.Path
strSQL = "Select Count(*) As 件数 From (Select [値3] From Data.csv Group By [値3]) As tbl"
adoCON.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & csvDir & ";" & _
"Extended Properties=""Text;" & _
"HDR=YES;" & _
"FMT=Delimited"""
adoRS.Open strSQL, adoCON
MsgBox adoRS(0) & "件です"
adoRS.Close
adoCON.Close
Set adoRS = Nothing
Set adoCON = Nothing
End Sub
Excel ファイルと同じフォルダに Data.csv がある場合です。
マシンスペックにもよるでしょうが、3,4秒位で可能です。
No.6
- 回答日時:
>あと件数が多いのでできるだけ処理が早く終わる手法だと助かります。
ならば、ExcelVBAでなく、CやC#で専用のプログラムを作成するのが良い気がします。
>しかし誰でも使えるようにしたい
「当該のCSVファイルをドラッグするだけで答えが表示される」実行形式の専用プログラムを作成すれば良いだけかと・・
私が作るとしたら、
40万x3程度のハッシュテーブルを用意して、
未使用の印をつけ、
CSVファイルを読み込み値3でハッシュテーブルに使用済みの印をつけ、
読み終わったら、使用済みの印の数を数えて表示する
な感じのプログラムになるかな。メモリ管理が面倒そうなのでC#で作成。
処理内容からして、1,2秒で結果が表示できる程度かなと思います。
No.5
- 回答日時:
No.3です。
『値3』の件数を知りたいだけなら、テキストボックス等に表示させるAccessのフォームを作成してボタンを押して実行の方が楽なのでは?
あとは頻度によりますがCSVファイルをAccessファイルにしてExcelから接続するようにするか。
Accessだと使用者が限られるってのは『Accessが使えない』のか『Accessがインストされてない』のかによりますし。
ネットワークでつながっているなら共有フォルダを作成しておき、変換したAccessファイルに接続するのも手では?
接続者数やネットワーク環境によって時間は変わるかもですけど、ただのテキスト形式の重いファイルで悩むよりかは多少マシな気もしますが。
No.4
- 回答日時:
こんばんは!
A列~D列の重複データが何件存在するか?というコトで良いのですかね。
いずれにしてもExcelで100万行となるときついと思います。
無理やりやってみました。
元データはSheet1にあり1行目は項目行でデータは2行目以降にあり
Sheet2に表示するとします。
Sub Sample1()
Dim myDic As Object
Dim i As Long, lastRow As Long
Dim wS As Worksheet, myStr As String
Dim myKey, myItem, myR, myAry
Set myDic = CreateObject("Scripting.Dictionary")
Set wS = Worksheets("Sheet2")
wS.Range("A:E").ClearContents
With Worksheets("Sheet1")
wS.Range("A1:D1").Value = .Range("A1:D1").Value
wS.Range("E1") = "件数"
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
myR = Range(.Cells(2, "A"), .Cells(lastRow, "D"))
For i = 1 To UBound(myR, 1)
myStr = myR(i, 1) & "_" & myR(i, 2) & "_" & myR(i, 3) & "_" & myR(i, 4)
If Not myDic.exists(myStr) Then
myDic.Add myStr, 1
Else
myDic(myStr) = myDic(myStr) + 1
End If
Next i
End With
myKey = myDic.keys
myItem = myDic.items
myR = Range(wS.Cells(2, "A"), wS.Cells(UBound(myKey) + 2, "E"))
For i = 0 To UBound(myKey)
myAry = Split(myKey(i), "_")
myR(i + 1, 1) = myAry(0)
myR(i + 1, 2) = myAry(1)
myR(i + 1, 3) = myAry(2)
myR(i + 1, 4) = myAry(3)
myR(i + 1, 5) = myItem(i)
Next i
Range(wS.Cells(2, "A"), wS.Cells(UBound(myKey) + 2, "E")) = myR
Set myDic = Nothing
wS.Activate
MsgBox "完了"
End Sub
※ こちらで100万行程度のサンプルでマクロを実行すると
約3分かかってしまいました。m(_ _)m
回答ありがとうございます。
移動中のスマホなので誤解なら申し訳ありませんが、
その内容で言うなら、D列の重複削除後の数が知りたいだけです。A〜C列は無視です。
更に100万行程度じゃないです。
1000万行でも対応可能なロジックじゃないと意味ありません。
すみません。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?e8efa67)
No.2
- 回答日時:
値3の重複しない件数がわかれば良いのですね。
そうであれば、Scripting.Dictionaryを使用するのが簡単かと。
以下の例は、使用例です。
例1
"A", "B", "C", "D", "E", "A", "B", "C"の重複しない件数を出力する。
結果:6
例2
1~1000000の数字の重複しない件数を出力する。
結果:1000000
実際の手順としては
1.CSVファイルを1行読み込み、値3を取得する。
2.値3をキーとしてDictionaryへ登録する。値はtrue固定
3.これを全行分(100万行)、繰り返す。
4.DictionaryのCountプロパティに件数が格納されているので、それを出力する。
ことになるかと。
追伸:例2を実行すると、さすがに重くなりますが、当マシンでは、約30秒で完了しました。
(windows7 メモリ12GB core5 )
10GB以上のメモリを積んでいれば、大丈夫かと思います。
-------------------------------------------
Public Sub sample()
Dim dict As Object
Dim i As Long
Dim val As Variant
Dim key As Variant
val = Array("A", "B", "C", "D", "E", "A", "B", "C")
Set dict = CreateObject("Scripting.Dictionary")
For i = 0 To UBound(val)
key = val(i)
dict(key) = True
Next
Debug.Print dict.Count
dict.RemoveAll '一旦、全てクリアする
For i = 1 To 1000000
dict(i) = True
Next
Debug.Print dict.Count
End Sub
No.1
- 回答日時:
ADOなどで、エクセルに接続して、SQLでselect distinct... がはやいんじゃないかな?
group byもためしてみてもよいけど、、、
https://qiita.com/EmikoKishi/items/7c5e4154cf044 …
VBAから直接CSVを操作しないといけないと思うのですが、
Excelに接続するという事は104万件の壁があるから駄目ではあませんか?
理解が追いついてなかったらすみません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- Excel(エクセル) PowerQueryで行数の指定はできますか? 2 2022/08/26 11:13
- Visual Basic(VBA) vbaマクロについて 【1.csv】をもとに【商品.csv】に有るものを【有り.csv】として名前を 1 2023/05/18 07:58
- Visual Basic(VBA) この関数と同じ処理をVBAで行うにはどうしたら良いでしょうか? これは、1列の中に同じ値が複数存在し 21 2022/07/07 07:48
- Visual Basic(VBA) vbaマクロについて 次のようなマクロを組みたいです。 自分は初心者なので全くわかりません。 詳しく 8 2023/05/18 18:38
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Excel(エクセル) Excel 散布図グラフ 外れ値 セル番地参照方法 4 2022/04/19 18:56
- Excel(エクセル) CSVファイルでVBAを動かす方法 3 2023/04/04 10:22
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
首吊りどこ締めるの
-
検便についてです。 便は取れた...
-
勃起する時って痛いんですか? ...
-
彼女のことが好きすぎて彼女の...
-
白血球が多いとどんな心配があ...
-
アクエリアスが苦く感じる
-
精子が黄色?
-
これって喉仏ですか? 私は女性...
-
精液の落とし方を教えてください
-
精子に血が・・・
-
中出しをするとお腹が痛い・・・。
-
エクセル指定した範囲からラン...
-
故意に自分で気絶する方法って...
-
聞き返しが多い人って、なんら...
-
風俗店へ行く前のご飯
-
電動のネッククーラーは空港の...
-
甲状腺が腫れているが血液検査...
-
ミルクティーが好きなのに気持...
-
ボタン電池の付いていないマザ...
-
検便の送り方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
首吊りどこ締めるの
-
白血球が多いとどんな心配があ...
-
検便についてです。 便は取れた...
-
勃起する時って痛いんですか? ...
-
彼女のことが好きすぎて彼女の...
-
腕を見たら黄色くなってる部分...
-
精子が黄色?
-
EXCELで条件付き書式で空白セル...
-
至急!尿検査前日にオナニーし...
-
これって喉仏ですか? 私は女性...
-
中出しをするとお腹が痛い・・・。
-
甲状腺が腫れているが血液検査...
-
2つの数値のうち、数値が小さい...
-
尿検査前日に自慰行為した時の...
-
EXCELで式からグラフを描くには?
-
小数点以下を繰り上げたものを...
-
ある範囲のセルから任意の値を...
-
口の中に黒い血の塊
-
【Excelで「正弦波」のグラフを...
-
エクセル指定した範囲からラン...
おすすめ情報