VBAで変数を扱うときデータ型を指定して宣言していますが、Excelシート上のセルのデータはどのような型で記録されているのでしょうか?
全てのセルはあらゆる種類の値を保存できるバリアント型なのでしょうか?あるいは、セルに値が入力されるたびに数値、文字、シリアル値、数式などのように型を変化させてるのでようか?
セルの書式形式も同時に記録されているのか?あるいは値とは別に記録されているのかも気になります。
詳しい方みえましたら解説お願いいたします。
推測ですが Excel のファイル形式(.xls)に近い情報がメモリ上に保持されているものと思われます。
「BIFF フォーマット」や「構造化ストレージ」といったキーワードで検索するとお探しの情報が見つかるかもしれません。
<参考情報>
■ Excel 97-2003 ブック (*.xls) 形式概要
http://mitsutakauomi.com/?p=193
■ Excel(エクセル)の仕様 ファイルフォーマット
https://matome.naver.jp/odai/2147115280796907301
■ Office バイナリ ファイル形式の理解
https://msdn.microsoft.com/ja-jp/library/office/gg615407(v=office.14).aspx
推測ですが Excel のファイル形式(.xls)に近い情報がメモリ上に保持されているものと思われます。
「BIFF フォーマット」や「構造化ストレージ」といったキーワードで検索するとお探しの情報が見つかるかもしれません。
<参考情報>
■ Excel 97-2003 ブック (*.xls) 形式概要
http://mitsutakauomi.com/?p=193
■ Excel(エクセル)の仕様 ファイルフォーマット
https://matome.naver.jp/odai/2147115280796907301
■ Office バイナリ ファイル形式の理解
https://msdn.microsoft.com/ja-jp/library/office/gg615407(v=office.14).aspx
> リンク先を見ましたが、私のスキルでは歯が立ちませんでした…。
.xls 形式(BIFF フォーマット)はバイナリでしたが、Excel 2007 以降の
.xlsx 形式(Office Open XML フォーマット)は XML が採用されています。
拡張子を「.xlsx」→「.zip」に変更して解凍すると中身が見れますので、どのような情報が記録されているかの参考になるかと思います。
<参考情報>
■ 新しい標準ファイル形式「XML」(第2回)
http://itpro.nikkeibp.co.jp/pc/article/NPC/20060629/242158/
> Excelでデータベース的な表を作る時に、Accessのように各フィールド対してデータ型を設定したら処理が効率化しないかと思ったのです。
Excel をデータベース的に扱いたいということでしたら、
レガシー技術ですが ADO + Microsoft Jet OLE DB 4.0 プロバイダ を用いて Excel ブックにアクセスするという方法があります。
Jet OLE DB プロバイダーは様々な外部データベースにアクセスする為のデータベースドライバです。
<参考情報>
■ ISAM データベースに接続するために Jet OLE DB プロバイダー 4.0 を使用する方法
https://support.microsoft.com/ja-jp/kb/326548/
この方法を用いると、Excel のシートを SQL を用いてアクセスすることができます。
ちなみに、その場合のデータ型の判別は、サンプリングによって行われるようです。
<参考情報>
■ ADO を使用して Excel ブックのデータの読み取りおよび書き込みを行う方法 (ExcelADO)
https://support.microsoft.com/ja-jp/kb/278973/
> データ型
>
> Excel テーブルは、従来のデータベースとは異なり、列に直接データ型を指定する方法がありません。
> 代わりに、列の中の一定数の行が OLE DB プロバイダによりスキャンされ、そのフィールドのデータ型が推測されます。
また、ADO で取得した SQL の実行結果(レコードセット)を Excel に転記したい場合は、
CopyFromRecordset を用いると、そこそこ高速に行えたと思います。(ループ回すのに比べて)
<参考情報>
■ オートメーションを使用して ADO レコードセットのデータを Excel に転送する方法
https://support.microsoft.com/ja-jp/kb/246335/
いろいろと技術情報のリンクを教えていただきありがとうございます。Excelブックを外部から扱う方法がこんなにあるとは知りませんでした。
今回の疑問点については
# <参考情報>
# ■ ADO を使用して Excel ブックのデータの読み取りおよび書き込みを行う方法 (ExcelADO)
# (中略)
# > Excel テーブルは、従来のデータベースとは異なり、列に直接データ型を指定する方法がありません。
# > 代わりに、列の中の一定数の行が OLE DB プロバイダによりスキャンされ、そのフィールドのデータ型が推測されます。
この情報から見ると、例えばブックのセルの列ごとに「文字」「数値」のように書式設定をしても、データベース的には機能しないのですね。メモリ上はVariant型で保持して、保存するときに文字、数値、数式のそれぞれの書式で書きだされるのだと理解しました。
そして、教えていただいた技術情報が将来必要になったとき見返して利用できたらいいなと思います。回答コメントありがとうございました。
VBAから見るとVariant型ですが、
https://msdn.microsoft.com/ja-jp/library/office/ff195193.aspx
https://msdn.microsoft.com/ja-jp/library/office/gg251528.aspx
Variant型のサイズ(↑)×列数×行数より消費メモリ量は小さいので、常に保持している訳ではなさそうです。
メモリ消費状況についてはVMMAPを使うと詳細が分かります。
https://technet.microsoft.com/ja-jp/sysinternals/vmmap
回答ありがとうございます。
やはりVariant型なのですね。
VMMAPは知らなかったのでインストールして利用したいと思います。
匿名回答2号さんの回答はとてもシンプルでわかりやすかったです、ありがとうございました。
> リンク先を見ましたが、私のスキルでは歯が立ちませんでした…。
2017/05/20 02:20:10.xls 形式(BIFF フォーマット)はバイナリでしたが、Excel 2007 以降の
.xlsx 形式(Office Open XML フォーマット)は XML が採用されています。
拡張子を「.xlsx」→「.zip」に変更して解凍すると中身が見れますので、どのような情報が記録されているかの参考になるかと思います。
<参考情報>
■ 新しい標準ファイル形式「XML」(第2回)
http://itpro.nikkeibp.co.jp/pc/article/NPC/20060629/242158/
> Excelでデータベース的な表を作る時に、Accessのように各フィールド対してデータ型を設定したら処理が効率化しないかと思ったのです。
Excel をデータベース的に扱いたいということでしたら、
レガシー技術ですが ADO + Microsoft Jet OLE DB 4.0 プロバイダ を用いて Excel ブックにアクセスするという方法があります。
Jet OLE DB プロバイダーは様々な外部データベースにアクセスする為のデータベースドライバです。
<参考情報>
■ ISAM データベースに接続するために Jet OLE DB プロバイダー 4.0 を使用する方法
https://support.microsoft.com/ja-jp/kb/326548/
この方法を用いると、Excel のシートを SQL を用いてアクセスすることができます。
ちなみに、その場合のデータ型の判別は、サンプリングによって行われるようです。
<参考情報>
■ ADO を使用して Excel ブックのデータの読み取りおよび書き込みを行う方法 (ExcelADO)
https://support.microsoft.com/ja-jp/kb/278973/
> データ型
>
> Excel テーブルは、従来のデータベースとは異なり、列に直接データ型を指定する方法がありません。
> 代わりに、列の中の一定数の行が OLE DB プロバイダによりスキャンされ、そのフィールドのデータ型が推測されます。
また、ADO で取得した SQL の実行結果(レコードセット)を Excel に転記したい場合は、
CopyFromRecordset を用いると、そこそこ高速に行えたと思います。(ループ回すのに比べて)
<参考情報>
■ オートメーションを使用して ADO レコードセットのデータを Excel に転送する方法
https://support.microsoft.com/ja-jp/kb/246335/
いろいろと技術情報のリンクを教えていただきありがとうございます。Excelブックを外部から扱う方法がこんなにあるとは知りませんでした。
2017/05/20 07:31:18今回の疑問点については
# <参考情報>
# ■ ADO を使用して Excel ブックのデータの読み取りおよび書き込みを行う方法 (ExcelADO)
# (中略)
# > Excel テーブルは、従来のデータベースとは異なり、列に直接データ型を指定する方法がありません。
# > 代わりに、列の中の一定数の行が OLE DB プロバイダによりスキャンされ、そのフィールドのデータ型が推測されます。
この情報から見ると、例えばブックのセルの列ごとに「文字」「数値」のように書式設定をしても、データベース的には機能しないのですね。メモリ上はVariant型で保持して、保存するときに文字、数値、数式のそれぞれの書式で書きだされるのだと理解しました。
そして、教えていただいた技術情報が将来必要になったとき見返して利用できたらいいなと思います。回答コメントありがとうございました。