Excelのセルの書式設定内容を配列に読み出すには?

解決


てこねずし  2009-06-24 09:34:59  No: 101832

VisualBasic6.0を使用しています。
ExcelファイルをMSFlexGridに展開・表示するプログラムを作成しています。
読み込むファイルは70行20列程度のデータが5〜20シートほどある構成です。

もともとはセルデータ(や書式設定)を1つ1つFor〜Nextで読み込んでいたのですが、当然読み込むのに時間がかかるため、高速化を考えています。
調べた結果、Rangeで範囲指定したセルデータをVariant型変数に一括代入して配列変数として扱う方法はわかったのですが、データ以外の書式設定に関する値(たとえばColorやLockなど)を範囲指定で一括で取得する方法がわかりません。
Dim Rnd As Variant
Rnd = ExlSheet.Range(Cells(1,1),Cells(15,15)).Value
とすると、範囲のデータが配列として取り出せるのですが、
Rnd = ExlSheet.range(Cells(1,1),Cells(15,15)).Interior.Color
とすると、Cell(1,1)のColorのみが取り出されるようです。
Excelファイルのセルの色やロックの指定はセル毎に異なるため、個別に取り出したいのですが、できなくて困っています。

なにか、ヒントになるようなことでもおしえていただければありがたいです。
ほかにもExcelファイルの内容を高速に読み書きできる法があれば、教えていただければ助かります。


特攻隊長まるるう  2009-06-25 01:03:08  No: 101833

それが Range なんじゃないの???


てこねずし  2009-06-25 04:32:06  No: 101834

すいません。「それがRangeなんじゃないの???」とはどういう意味でしょう?

最初の書き込みでも記述したように
シート.Range("範囲").Value  では配列として取り込めるのですが
シート.Range("範囲").Interior.Color  では配列として取り出せないようなのですが・・・。
「.Interior」以下の記述が意図している内容ではないのか、ぜんぜん別の方法があるのか、はたまた書式設定を配列として取り出すのは無理なのか、そのあたりをご教授いただけると助かります。


GOD  2009-06-25 20:05:48  No: 101835

↓みたいな感じで取り出せないかな。

Dim Rng As Range
For Each Rng In ExlSheet.Range(Cells(1, 1), Cells(15, 15))
       Debug.Print "(" & Rng.Row & "," & _
                         Rng.Column & ") " & _
                         Rng.Interior.Color
Next


てこねずし  2009-06-25 22:12:30  No: 101836

GOD様
ご提案、ありがとうございます。
ただ、希望としては「書式設定を配列化する」のではなく、「書式設定を高速に変数に取込む」ということで、.Valueのように配列として一括で取り出せれば高速に取り出せるのではないか?と考えている次第です。
言葉足らずで申し訳ありません。

とはいえ、Range型の変数として扱うことは試していませんので確認したいと思います。
要は取込み速度が速くなればよいことなので。。。
すぐにはテストできませんので少々お時間をください。

また、他にご提案があればよろしくお願い致します。


てこねずし  2009-06-26 06:20:34  No: 101837

テストができました。
読み込み速度は速くなりましたが、希望しているほどではありませんでした。
18シートのファイルが45秒が38秒になりましたので、効果はあると思いますが"劇的に"というほどではなかったです。
.Valueを配列に取込むテストをした際は40秒が8秒程度までおちましたので、それが書式設定にも応用できれば、と考えたのですが。。。

とはいえ、GOD様にはよい方法をご提案いただきました。他の状況でも使えると思います。
ありがとうございました。

他にも方法があればご教授いただけると助かります。


てこねずし  2009-06-26 06:20:35  No: 101838

テストができました。
読み込み速度は速くなりましたが、希望しているほどではありませんでした。
18シートのファイルが45秒が38秒になりましたので、効果はあると思いますが"劇的に"というほどではなかったです。
.Valueを配列に取込むテストをした際は40秒が8秒程度までおちましたので、それが書式設定にも応用できれば、と考えたのですが。。。

とはいえ、GOD様にはよい方法をご提案いただきました。他の状況でも使えると思います。
ありがとうございました。

他にも方法があればご教授いただけると助かります。


てこねずし  2009-06-26 06:21:42  No: 101839

↑「送信」ボタンを2度押してしまいました。。。
  すいません。。。


かび  2009-06-27 09:13:02  No: 101840

Range単位で取り込めば短縮できるのであれば
Sheets単位で取り込んでみたらどうでしょう。

早いかどうかは分かりませんが。


魔界の仮面弁士  2009-06-27 23:08:46  No: 101841

For Each objRange1 In objRange2 の構文を用いるのであれば、
VB6 から外部制御する代わりに、Excel 側から VBA で、自身を
内部制御する事も検討してみてください。
VB6 から制御する場合よりも、高速に処理する事ができるかと。


てこねずし  2009-06-29 04:50:30  No: 101842

かび様・魔界の仮面弁士様
ご提案、ありがとうございました。
かび様の提案を早速ためしてみよう・・・と思って自分なりにプログラミングしてみたのですが、いろいろエラーが出て結局取込みテストはできませんでした。
また、魔界の仮面弁士様のおっしゃられていることも意味はわかるのですが、実際にプログラミングしてみようと思うとVBA側で処理した内容を具体的にどのようにVB6側に渡すのか思いつけませんでした。
まだまだスキルが足りないことを痛感しています。

先日見つけた.Valuで配列取込に取込むことを扱ったあるホームページに「セルのデータは扱えるが、プロパティはできない」旨の内容が書かれていました。
もしかすると同じような方法はないのかもしれないと思っています。

そのため、方法を変えて、必要な書式設定内容をデータとともにセルに値として書き出しておいて(”,”区切り)、配列として一括取り出しを行ったあと、各変数に分割するように処理を変更しました。
CSVとして扱えない・変換できないこと、Excelでそのファイルを開くと自作ソフトと同じような見た目では見えないことなど不便さもありますが、高速取込の方が優先と考えて我慢することにします。

せっかくご提案くださったかび様・魔界の仮面弁士様の提案をテストできなかったのが心残りですが、あまりだらだら保留していても問題だと思いますので、一度”解決”とさせていただきます。
GOD様共々、大変ありがとうございました。
もう少しスキルをつんでご提案内容をテストしてみたいと思います。その際問題が生じたらまた助けていただけると幸いです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加