2017年11月8日水曜日

一億個も貼り付けできたんだから、やりようによってはRDB代わりに使えるかもしれないね - エクセル2007以降(マイクロソフト)  

   
エクセルの入力できる行列数が、飛躍的に増えたのを知りませんでした。
65,536行と256列が限界だと思っていたのですが、それはオフィス2003まで。

オフィス2007以降は、1,048,576行と16,384列まで驚異的に増加しております。
ですが、こんなにデータを入力してブックを作った人は、まずいないでしょう。

ならば、実験だと思い立ちましたが、方向キーを押し続けるのも非科学的です。
ユーチューブでは、最終行にたどり着くまで、9時間掛かった動画に驚きました。

なお、最終列はXSDで、最終行X最終列で、セル数は17,179,869,184になります。
つまり、はるか先の171億セル目に到達するは、単純な移動では無理でしょう。

なので、マクロを組んで一っ飛びに最終セルを指し示すコードを書いてみました。
非常に簡単なコードでして、VBエディターで走らせて見ると結果はあっけない。

  Private Sub test()
  Cells(1048576, 16384).Select
  ActiveCell.Value = "最終セル"
  End Sub


エクセルのウインドウでは、それ以上のセルが表示され無いのも当り前なんだ。
まあ、オフィス2010で確かめましたが、ならばどこまでセルに書き込めるのか。

それで、6桁の乱数を生成しながら、全てのセルに書き込むコードを作りました。
これを動かしてみたのですが、一時間を経過しても結果が出ず、ちょっとこわい。

結局、タスクマネージャでエクセルを強制終了して、書き込むセルを少なくします。
ダウンサイジングで、一億セルなら何とかなると思って作ったのが、このコード。

 Sub ボタン1_Click()

 Dim StartTime, StopTime As Variant
 Dim intValue, intUpper, intLower
 Dim rng As Range

   Application.ScreenUpdating = False

 'ここから実行時間のカウントを開始します
 StartTime = Time

 For Each rng In Range("A1", Cells(10000, 10000))
   '一万の行と列の升目を範囲とする

 intUpper = 999999
 intLower = 100000
 'intValue には、範囲内の乱数が入ります。

 intValue = Int((intUpper - intLower + 1) * Rnd + intLower)
 rng = intValue

 Next

   Application.ScreenUpdating = True

 StopTime = Time
 StopTime = StopTime - StartTime

 MsgBox "所要時間は" & Minute(StopTime) & "分" & _
                                  Second(StopTime) & "秒 でした"

 End Sub

自作というよりネットで紹介されていたコードを拝借して、でっち上げて見ました。
重要なのは、セルに書き出す画面更新を止めて、最後に一挙に書き込みます。

これで、かなり処理時間の短縮につながりますので、いざ、決行してみました。
うーん、待てども待てども処理が終わりませんでしたが、何とか終了ですな。

それが冒頭の画像で、所要時間として掛かったのは、39分7秒になりました。
これを秒数にすると2,347になり、これを一億で割ると、42,608個と出ます。

つまり、CPUは一秒間に6桁の乱数を、こんなにも大量に生成しておるのです。
まあ、昨今のPCは、CPUもメモリーも性能が格段にアップしたからできるのだ。

では、マイクロソフトは、どうして百七十億のデータを格納できるとしたのか。
思うに、シュミレーション計算の解をメモリーに配列で格納するのではないか。

あえてセルに書き込まず、メモリー上に溜め込んでから最適解を求めるのです。
つまり、視覚的なシートの出力は、最終的な仕上がった内容でしかありません。

こうなると、科学計算では、エクセルで十分な使い道があるのかもしれません。
というわけで、単純にデータを書くのなら一億セルぐらいは何とかなりました。

一方、これぐらいのデータになりますと、ワークシートに計算式や、背景色、罫線、フォント装飾など、メモリーを食いそうな設定は遠慮せざるをえなくて、するとしたらビジュアルベーシックでコードを書き込むのが無難だと思いますが、何れにせよ、こんな大きなデータを目で見て使う用途が、個人の業務範囲で一体あるのだろうかと、思ってしまったのでした。


おまけ:
使ったPCのスペックは、下記の通りです。
 CPU:PhenomII X4 965 (クロック3.4GHzノーマル使用)
 メモリー:8GB
 SSD:120GB(SATA II クラス)
 マザーボード:AsRock 880GM-LE
   OS & Office Ver.:Windows7(英語版64ビット) / Office2010(英語版)
 ※だいぶ古いスペックですが、十分に今でも使えています。


いいねと思ったら、二つポチっとね!



0 件のコメント:

コメントを投稿