![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
No.8ベストアンサー
- 回答日時:
#7です。
結果を補足願います。結果の計数はアクチブシートA,B列に出ます。
下記に変えて実行。ファイル名は自分の物に修正のこと。
Sub test01()
Close #1
Dim tb(100), ks(100)
'--
k = 0
Open "C:\Documents and Settings\xxxx\My Documents\text13.txt" For Input As #1
While Not EOF(1)
Line Input #1, a
' MsgBox a
If k > 100000 Then GoTo end1 '10万レコードまで
k = k + 1
S = Split(a, " ")
For i = 1 To 100
If S(0) = tb(i) Then
ks(i) = ks(i) + Val(S(1))
GoTo p1
Else
End If
Next i
l = l + 1
tb(l) = S(0)
ks(l) = Val(S(1))
p1:
Wend
end1:
Close #1
'--
For i = 1 To l
Cells(i, "A") = tb(i)
Cells(i, "B") = ks(i)
Next i
MsgBox "処理終了"
End Sub
に変えてやってみてください。
10万件にとりあえず制限してます。
●途中で止まらないか。
aaaについて、100種類の配列オーバーやその他の原因などで。
●実行時間は何時間何分ぐらいかかかるか。
●上記2点うまくいくなら
If k > 100000 Then GoTo end1 '10万レコードまで、の行
を削除してみての実行で上記2点はどうか。
ありがとうございます。
処理終了のメッセージが出て、それぞれA列毎の合計がB列に出ました。そのあと、少ない件数でテストして、合計の数字が正しいことを確認しました。
実行時間は、10万レコードの制限を付けてもはずしても一瞬でした。
長々とお付き合いいただきありがとうございました。
今回お教えいただいたコードをベースに、勉強に励みたいと思います。
No.7
- 回答日時:
#4、#6です。
補足依頼
下記●の部分に答えてください
ーーー
第1レコードが
aaa 1
であるとして、1の部分はレコードごとに当然変わるとして、
●aaaの部分はレコードごとに変わるのですか。<=下記VBA実行して
みての結果
●予想でaaaの変化は何種類ぐらいあるのですか。
●ついでにC列以右も含めて、何列にデータが出てきましたか。
ーー
#4のコードを下記に変えて実行してaaaの列の変化を見てください。
そして適当数やったら、CTRLキー+PausBreakキーの2つを同時押ししてください。中断します。
下記コードのファイル名は自分のものに置き換えることを忘れないように。
Sub test01()
Close #1
Open "C:\Documents and Settings\xxxx\My Documents\test01.txt" For Input As #1
While Not EOF(1)
Line Input #1, a
s = Split(a, " ")
Cells(1, "A") = a
MsgBox s(0) & " " & (1)
Wend
Close #1
End Sub
--
●aaa列はまとまっていて、変化するようですか。ばらばらに出てきますか。いわゆるソート後(並べ替えてある)らしいかどうか。
aaa 12
aaa 23
aaa 11
bbbb 34
bbbb 54
cc 25
cc 76
のようにまとまっているとやりやすい。
ありがとうございます。やってみました。
aaa部分はレコードごとに変わりました。
aaa部分は4,5種類です。件数の割には少ないです。
コードを実行したところ、
A列に AとB列の値が、B列には1と表示されました。C~右は何もないです。
メッセージボックスで、
aaa 1
bbb 1
ccc 1
といった具合に表示されました。
どうやらデータはソートされていません。
No.6
- 回答日時:
#4です。
だいぶん、私の意図に近づいてきたようです。
(問1)A1の文字列・数字、またはA,B,C列の値の内容を補足してみてください。それを知りたい。どこ(どの列)に合計する数値があるか、それが判らないとプログラムが組めない。
例 aa 123 2345 cv など。これだと1レコードに4項目あることになる。
(問2)区切りは何文字(スペースかコンマか)でしたか。
お付き合いいただいてありがとうございます。
レコード構成は、
(A1)aaa 1 で、B列の合計を出したいです。
(A2)区切りは1文字でスペースです。C列以降は使用しません。
よろしくお願いいたします。
No.5
- 回答日時:
Access にインポートするのが簡単ですが、Access が無くても Excel VBA
でも計算できます。
標準モジュールに下記ソースコードを貼り付け、
Microsoft ActiveX 2.x Object Library
を参照設定します。
マクロ「CreateSampleData」を実行すると、C:\ に test.txt という
100万レコードのサンプルデータファイルを作成します。
次に、マクロ「Calc」を実行すると、金額合計や、レコード件数を
計算し、結果を表示します。
# Excel2000 以降で動作すると思います
多少 SQL に関する知識が必要になりますが、高速(~数秒程度)で
計算できますよ。(ただし、PC スペックに依存します)
Option Explicit
' // テキストファイルのフォルダパス
Private Const DIR_PATH As String = "C:\"
' // テキストファイル名
Private Const FILENAME As String = "test.txt"
' // 一行目が「見出し」かどうか
Private Const HEADER As String = "True"
' // 100万レコードのサンプルデータ[1行目見出し]作成
Sub CreateSampleData()
Dim Sex(1) As String
Dim Addr(4) As String
Dim vItem(4) As Variant
Dim vLine(1 To 1000) As String
Dim fn As String
Dim n As Integer
Dim i As Long
Dim j As Long
Dim k As Long
fn = DIR_PATH & "\" & FILENAME
' // 性別
Sex(0) = "男": Sex(1) = "女"
' // 住所
Addr(0) = "東京": Addr(1) = "名古屋"
Addr(2) = "京都": Addr(3) = "大阪"
Addr(4) = "福岡"
n = FreeFile()
Open fn For Output As #n
If CBool(HEADER) Then
Print #n, "ID,性別,住所,年齢,金額"
End If
k = 1
For j = 1 To 1000
For i = 1 To 1000
Randomize
vItem(0) = k ' // ID連番
vItem(1) = Sex(Int(2 * Rnd)) ' // 性別ランダム
vItem(2) = Addr(Int(5 * Rnd)) ' // 住所ランダム
vItem(3) = Int((80 - 15 + 1) * Rnd + 15) ' // 年齢15-80歳ランダム
vItem(4) = Int((200000 - 10 + 1) * Rnd + 10) ' // 金額10円-20万円ランダム
vLine(i) = Join$(vItem, ",")
k = k + 1
Next i
Print #n, Join$(vLine, vbCrLf)
Erase vLine
Next j
Close #n
MsgBox "サンプルファイル作成完了", vbInformation
End Sub
' // 集計
Sub Calc()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim Sql As String
' // テキストファイルに接続します
Set cn = New ADODB.Connection
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & DIR_PATH & ";" & _
"Extended Properties=""text;" & _
"HDR=" & HEADER & ";FMT=Delimited;"";"
cn.Open
' // サンプル1: 住所が「東京」の金額を集計
Sql = ""
Sql = Sql & "SELECT SUM([金額]) AS [金額集計]"
Sql = Sql & " FROM " & FILENAME
Sql = Sql & " WHERE [住所] = '東京'"
Set rs = New ADODB.Recordset
rs.Open Sql, cn, adOpenForwardOnly
MsgBox "住所が「東京」であるレコードの金額集計額:=" & _
CStr(rs.Fields("金額集計").Value)
rs.Close: Set rs = Nothing
' // サンプル2: 住所が「東京」かつ性別が「男」のレコード件数
Sql = ""
Sql = Sql & "SELECT COUNT(*) AS [件数]"
Sql = Sql & " FROM " & FILENAME
Sql = Sql & " WHERE ([住所] = '東京' AND [性別] = '男')"
Set rs = New ADODB.Recordset
rs.Open Sql, cn, adOpenForwardOnly
MsgBox "住所が「東京」かつ「男」であるレコード件数:=" & _
CStr(rs.Fields("件数").Value)
' // データベース接続を切ります
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
End Sub
回答ありがとうございます。
すみません。EXCELがあるといってもVBAを使ったことがなく、
標準モジュールに下記ソースコードを貼り付け、
Microsoft ActiveX 2.x Object Library
を参照設定します。
のところで挫折しました(^^;)
No.4
- 回答日時:
>ツール等あればお教えいただけないでしょうか
これだけの目的だけをツールとしてソフトを発表するのは、おこがましい内容ですから,多分無いでしょう。(単一目的で、プログラムを組める人にとっては数行のものだから。)
ーー
エクセル(オフィス)2007では100万ちょっとまで読み込める設計になってますが、エクセルで使えるメモリとの兼ね合いで、経験しないと、開く途中で止まらないか、わからない。
ーー
>テキストデータのある数値項目
これが具体的に判らないとVBAが組めない。
--
やる気があるなら、下記をやってみてください。
その前にテキストデータのある場所のフルパス、(ファイル名はわかるだろうから)拡張子を正確に1字1字書き留めること。
このやり方も判らないと、下記をやるのは難しいレベルかと思うが。
ーー
ツールーマクローVBEー>VBE画面が出る
そのVBE画面のメニューで、
挿入ー標準モジュールー>白紙の画面が出る
そこへ下記のコードをコピペ。
ーー
そして
C:\Documents and Settings\xxxx\My Documents\test01.txt
の部分を自分にあわせて書き換える。
ーー
そして、コピペしたコードの(どこでも良い)途中にカーソルを持っていってクリックし、F5キー(実行の意味)を押す。
ーー
結果シート(アクチブシート)のA1セル(1セルだけしかでないはず)にどう出るか、報告してみてください。
エラーが出て動かない場合も報告してみてください。その場合は
このやり方はあきらめましょう。
ーー
うまく読み込んでおれば、
データー区切り位置ーカンマやタブ・・ー次ぎへースペースー完了
でどうなるか。カンマで区切りなら、スペースの変わりにカンマを指定してみてください。
各列にどう分離されたか。
ーー
コード
Sub test01()
Open "C:\Documents and Settings\xxxx\My Documents\test01.txt" For Input As #1
Line Input #1, a
Cells(1, "A") = a
Close #1
End Sub
もしうまくいけば、残る課題である、100万回の繰り返し方法と集計方法の数行のコードを回答します。ただ100万レコード(100万行)を読む時間は、相当かかるかもしれないので覚悟が必要です。
ーー
また上記の方法では、明細はエクセルには出ません(出せません)合計が出せるだけです。それでよければのはなし。
ーー
ちょっとさらに勉強すれば6万レコードずつに分割するプログラムに変えられる。
No.3
- 回答日時:
EXCELは2007から、行数の制限が約100万行になりました(2の20乗です)。
Accessを使ってはいかがですかhttp://www.relief.jp/itnote/archives/001844.php
OpenOfficeのCALCはVer2.0で行数制限が65000行(2の16乗)ですから、現在の2.3でも多分同じでしょう、Googleのスプレッドシートもこの偽十を使っていますから無理ではないかと想像します。
ということで、OpenOfficeBase(データベース)しか対応策はなさそうです。
http://www.excel7.com/calc/calc_basic1.htm
表計算ソフトで確実に100万行扱えたのはCorelのQuattroProですが、現在、日本語版は現在発売されていませんので、英語版のWordPerfect Officeに含まれています。
http://www.corel.com/servlet/Satellite?c=Product …
他に三四郎や1-2-3がありますが、確か同じくらいの制限(65000行程度)です。
100万行のデータとなると、データベースを使うか簡単なプログラムで集計しないと厳しいと思いますよ(ファイルサイズ的にも)。
No.2
- 回答日時:
フリーのオフィスソフトであるOpenOfficeや、無料のGoogleアカウントを取得すれば使えるGoogleSpreadSheetなどではだめでしょうか?
試していないので、100万件程度のデータに対応できるかどうかわかりませんが。
http://ja.openoffice.org/
http://www.google.com/google-d-s/hpp/hpp_co_jp.h …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Excel(エクセル) Excelで全クラスのランキング表を作成したい 4 2022/05/24 15:28
- Excel(エクセル) VBA ふたつの同じ様式シートのセルをコピーしたい 2 2023/03/08 15:28
- Excel(エクセル) 別シートに毎回異なるデータをコピーする 7 2022/06/24 09:02
- 統計学 前回イベントと今回イベントのデータ集計について 質問させてください。 イベント参加者の内アンケートを 3 2022/09/30 22:23
- Visual Basic(VBA) VBAで自動集計(特定セルコピー月ごとに値貼り付け)したい。 6 2023/06/25 11:37
- Excel(エクセル) EXCEL値貼り付け(ある条件のもと自動化) 5 2023/06/06 12:21
- Excel(エクセル) Excel、同じフォルダ内のExcelファイルの特定シートのみを1つのファイルに集約したい 8 2022/09/07 15:12
- PowerPoint(パワーポイント) パワーポイントで資料を作る時 エクセルで集計したデータなどを貼り付けています。 そうすると パワーポ 3 2023/05/23 09:51
- 会計ソフト・業務用ソフト Excelで売上げデータの中の任意の商品の合計を出したい 3 2023/01/18 18:19
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ADO VBA 実行時エラー3021
-
ACCESSで大量の更新を行うと「...
-
ファイル書込みで一行もしくは...
-
レコードが存在しなかった場合
-
JSPのNULLレコード表示について...
-
差し込み印刷のレコード数について
-
DataGridViewの、選択されてい...
-
アクセスでレポートの1印刷内...
-
ヘッダレコードとトレーラレコ...
-
DataGridViewの内容をDBに反映...
-
Access でレコードセレクタが押...
-
【ExcelVBA】Powerクエリーでい...
-
データベースの内容を変数に入...
-
Accessデータシートビューの行...
-
DetailsViewで指定されたレコー...
-
サブレンジ分割されたNDB(富士...
-
カレントレコードが無い事を判...
-
ワードの差込印刷で教えて下さ...
-
データセットのレコード更新が...
-
VB.netでmdbのレコードを取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ADO VBA 実行時エラー3021
-
ファイル書込みで一行もしくは...
-
JSPのNULLレコード表示について...
-
レコードが存在しなかった場合
-
DataGridViewの、選択されてい...
-
カレントレコードが無い事を判...
-
DataGridViewの内容をDBに反映...
-
Access を×ボタンで閉じ...
-
アクセスでレポートの1印刷内...
-
ヘッダレコードとトレーラレコ...
-
Access でレコードセレクタが押...
-
レコードセット(ADO.Recordset)...
-
ACCESSで大量の更新を行うと「...
-
差し込み印刷のレコード数について
-
DataGridViewにてセル以外をク...
-
サブレンジ分割されたNDB(富士...
-
Line Inputで文字化け(助けて...
-
固有レコード識別子の選択とは
-
[VBA] ADOの Clone と AddNew
-
ワードの差込印刷で教えて下さ...
おすすめ情報