プロが教えるわが家の防犯対策術!

ExcelCSV Access クエリ

仕事で使うCSVについてです。

あるデータをExcelCSVでシステム抽出した際、
使い勝手が悪い状態でCSVが出てきました…。

関数でいじりたいのですがデータは20万行あるようなデータで、
動かすのにいちいちExcelが止まります。

ちなみにその変えたいデータというのが、
アンケートのようなもので

 A      B
1田中太郎 質問1の答え
2田中太郎 質問2の答え
3田中太郎 質問3の答え
4鈴木花子 質問1の答え
5鈴木花子 質問2の答え
6鈴木花子 質問3の答え

というような形で出てしまっており、

これを
 A      B C D
1田中太郎 質問1の答え 質問2の答え 質問3の答え
2鈴木花子 質問1の答え 質問2の答え 質問3の答え

と3つの質問の答えを回答者の行の列ごとにいれて使用したいという感じです。
この作業をしたく、関数を組んで作業をしたいのですが
20万行あるデータなので全く動いてくれず途方に暮れています。

ちなみに自分は関数とVBAを少しかじったくらいで
Accessやクエリは使ったことがないのですが
それらを使用すれば可能でしょうか…?

有識者の方、大変お手数お掛け致しますが、
アドバイスをいただけますと嬉しいです。

よろしくお願い致します。

A 回答 (2件)

こんにちは



>関数でいじりたいのですがデータは20万行あるようなデータで、
>動かすのにいちいちExcelが止まります。
メモリ不足でなければ、No1様の回答にあるように自動計算と操作が相まって時間が掛かっている可能性がありますね。

とは言え、20万行だと関数をフィルコピーするのもちょっと面倒かなと。
(ダブルクリックでフィル入力する方法をご存じならどうということも無いですが・・)
(計算を止めても、ダブルクリックでフィルコピーするのには約20秒程度かかりますね)

3行ずつがセットの決め打ちで良いものとして、当方で21万行で試してみました。
環境が異なるので、時間そのものはあくまでも目安ですが・・・
 ・マクロで関数を設定する方法で約3秒
 ・マクロで全体を配列に読み込んで処理する方法で約2秒
でした。
オーソドックスに直接CSVを読み込んで変換して出力する方法も考えられますが、条件や内容が違うので比較しにくいため、こちらは試してはいません。


以下は、メモリの使用量は多いですが、上記の2番目の方法での例です。
※ A:B列に元のデータがあるとして、D:G列に並び替えて書き出します。
ご参考までに。

Sub test03()
Dim v, v2()
Dim n As Long, r As Long, i As Long

'tm = Time()
n = Application.RoundUp(Cells(Rows.Count, 1).End(xlUp).Row / 3, 0)
v = Range("A1:B1").Resize(n * 3).Value
ReDim v2(1 To n, 1 To 4)
i = 1

For r = 1 To n
v2(r, 1) = v(i, 1)
v2(r, 2) = v(i, 2)
v2(r, 3) = v(i + 1, 2)
v2(r, 4) = v(i + 2, 2)
i = i + 3
Next r
Range("D1:G1").Resize(n).Value = v2

'Debug.Print (Time() - tm) * 24 * 60 * 60
' 約2秒
End Sub
    • good
    • 1
この回答へのお礼

まさかのコードまでありがとうございます。
大変助かりました。大感謝です。

お礼日時:2023/06/16 17:29

「計算方法」を「手動」にして操作してはいかがでしょう。


で、処理の準備ができたら「F9」キーを押して演算させる。

それで解決しそうな気がするんです。

・・・

そもそも「計算方法」を「手動」にするのは、そのような処理に時間がかかる場合への対処のためです。
    • good
    • 1
この回答へのお礼

ショートカットキーまで教えて下さりありがとつございます。助かりました…!

お礼日時:2023/06/16 17:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!