質問: 11 となってしまいます。 方法2が近いと思うのですが、A11から開始し A13 までは埋まっているので 13 が返ってくるのを期待していたのですが... 期待している戻り値: 13 for文で開始行から 適当に最大値 3000 までの行を Readメンバ関数 ( CExcel::Read ) で 読み取り、 読み取れなかった場合、break でループを抜けて戻り値として返す。 というやり方を思いついたのでやってみたところ、方法1 と同じになってしまいました。 どうすれば最大行数を取得できるのでしょうか? [環境等] 言語 : C/C++ コンパイラ : VC++2010 Express ( DLL側 ), MinGW ( 実行ファイル側 ) Excelバージョン: Excel 2007 知りたいこと : C/C++から Excel操作するときに 指定シートの ( なんらかのデータが書き込まれている ) セルの「最大行数」と「最大列数」の求め方 宜しくお願い致します。
回答: UserRangeプロパティは値だけでなく、書式が設定されていても使用済みとして認識してしまうようですので、期待した結果になりません。 また、End(方向)では空白セルがあると、そこでカウントをやめてしまうようです。 なので、CurrentRegionを使ってみてはいかがでしょうか?空白行と空白列で囲まれた範囲(Rangeオブジェクト)を返すプロパティですが、この範囲が示す一番右下のセルの行番号・列番号を取得するというやり方です。 VBAで書くとこんな感じです ``` Dim maxrow As Integer Dim maxcol As Integer With Range("A11").CurrentRegion maxrow = .Cells(.Rows.Count, .Columns.Count).Row maxcol = .Cells(.Rows.Count, .Columns.Count).Column End With ``` 追加(2017/01/20) C++で書く場合、COMを扱ういろいろ方法があるのはご存じだと思いますが、私が最近MFC経由でしか使っていませんでしたので、MFCで書かせていただきます。(ビルドしてないので、ちゃんと動くかわかりませんが、ニュアンスをつかんでもらえれば)。 ``` CVariant varOption((long)DISP_E_PARAMNOTFOUND, VT_ERROR); CRange range(pWorksheet.get_Range("A11", varOption)); CRange Current(Range.get_CurrentRegion()); CRange Rows(Current.get_Rows()); CRange Columns(Current.get_Columns()); int rowsCount = Rows.get_Count(); int columnsCount = Columns.get_Count(); CRange maxCell (Current.get_Range(rowsCount, columnsCount)); int maxrow = maxCell.get_row(); int maxcol = maxCell.get_Column(); ``` 本来でしたら、エラーチェックとか厳密にしないといけないのですが、ちょっと見づらくなりますので省いています。また、MFCでのラッパークラスでは、ExcelのプロパティであるCellsやRows、ColumnsはすべてRangeとして扱うので、上記のような書き方になります。