ExcelのVBA
今日、エクセルでデータ整理をしている研究室の仲間の手伝いでExcelのVBAを触ったのだがヘルプに載っていない制限を発見してしまった。
ThisWorkBook.WorkSheets(1).Cells(1,1).Value=1 'これは問題ない ThisWorkBook.WorkSheets(1).Cells(1,200).Value=1 'これも問題ない ThisWorkBook.WorkSheets(1).Cells(1,300).Value=1 'これは問題あり
上記のソースでわかった方も多いと思うがCellsの引数はどうも8bit整数らしい。つまり255までしか受け取れない。
いや列数、行数共にもっとあるわけだがどうしろと。255行に収まるぐらいだったら手作業でやるよ。1000行ぐらいあるからわざわざ組もうとしてるんだよ。
最初は以下のソースをいきなり組んでエラーに見舞われ、何が悪いのかさっぱりわからなかった。
Dim i,r as Integer r=1 For i=4188 To 5500 step 2 ThisWorkBook.WorkSheets(2).Cells(1,r).Value=ThisWorkBook.WorkSheets(1).Cells(2,i).Value ThisWorkBook.WorkSheets(2).Cells(2,r).Value=ThisWorkBook.WorkSheets(1).Cells(4,i).Value r=r+1 Next i
4行目でそんなオブジェクトがないといわれた。そんなはずはないと思い、いろいろ試した結果、Cellsは16bitの整数すら受け取ってくれない、ということに気づいた。
確かExcel自体は16bit整数の限界よりも多くの行を扱えたはずだがそういったシートの任意箇所にVBAからどうやってアクセスしたらいいんだろう。
追記(2008/05/15):
どうも第一引数は16bit整数でもいいらしい。よっておそらくCellsはC風に書くとこんな感じに宣言されているのだろう。
Cell Cells(uint16_t,uint8_t);
ちなみに"uint16_t"はC99で定義されているもので通常のx86系のコンパイラなら多分"unsigned short"になる。