ExcelのVBA

今日、エクセルでデータ整理をしている研究室の仲間の手伝いでExcelVBAを触ったのだがヘルプに載っていない制限を発見してしまった。

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"になる。