Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2009年05月29日] [更新 2013年12月13日] エクセル操作フォームEx
エクセル操作フォームEx   参考コード類
データ領域と最終セルの位置
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro + Excel 2010







データ領域の行数と列数


データが格納されている領域の行数と列数を取得する例です.
エクセルのシートオブジェクトの UsedRange メソッドを使用して取得します.例えば,この領域に罫線を引くとか,データの処理を行うとかの情報に利用できます.セルが空白でも,書式が [標準] 以外に設定してあると,そのセルも含まれる場合があります.


図1
テスト用シートのデータ
図2
実行結果
図3
データを追加してテスト

リスト1
データ領域の行数と列数
対象の Range を UsedRange から取得する
procedure TplExcelFormEx1.Button1Click(Sender: TObject);
var
  ARange  : Txlf2000Range;
  iRows   : Integer;
  iCols   : Integer;
  strText : String;
begin
  ARange := xlfExcelSheet.UsedRange[0];
  //確認のために選択
  ARange.Select;

  //行数と列数を取得して表示
  iRows := ARange.Rows.Count;
  iCols := ARange.Columns.Count;

  strText := 'データが格納されている行数 :  ' + IntToStr(iRows) + sLineBreak;
  strText := strText + 'データが格納されている列数 :  ' + IntToStr(iCols);

  MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
end;




データ領域の行番号と列番号


データが格納されている領域の上下の行番号と左右の列番号を取得します.例えセルが空白でも,書式が設定してあると,そのセルも含まれる場合があります.


図4
実行結果

リスト2
データ領域の行番号と列番号
procedure TplExcelFormEx1.Button3Click(Sender: TObject);
var
  ARange  : Txlf2000Range;
  iRight  : Integer;
  iBottom : Integer;
  iLeft   : Integer;
  iTop    : Integer;
  strText : String;
begin
  ARange := xlfExcelSheet.UsedRange[0];
  //確認のために選択
  ARange.Select;

  //最左列と開始行
  iLeft := ARange.Column;
  iTop  := ARange.Row;

  //最右列と最終行
  iRight  := ARange.Column+ARange.Columns.Count-1;
  iBottom := ARange.Row+ARange.Rows.Count-1;

  strText := '上端行 : ' + IntToStr(iTop) + #13#10;
  strText := strText + '下端行 : ' + IntToStr(iBottom) + sLineBreak;
  strText := strText + '左端列 : ' + IntToStr(iLeft) + sLineBreak;
  strText := strText + '右端列 : ' + IntToStr(iRight);

  MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
end;




データ領域の最終セル位置


データが格納されている領域の最終セルの位置を取得します.
Cells オブジェクトの SpecialCells メソッドを使用しています.SpecialCells メソッドは,いろいろな条件のセルの位置を取得することができます.
例えセルが空白でも,書式が [標準] 以外に設定してあると,そのセルも含まれる場合があります.
この方法は,書式をクリアしても変更されないことがあるようです.
書式をクリアした後に,UsedRange メソッドを使用した方が確実のようですが,この次のサンプルのように,空白セルの行を削除する目的には適しています.


図5
実行結果

リスト3
データ領域の最終セルを取得
procedure TplExcelFormEx1.Button4Click(Sender: TObject);
var
  ARange  : Txlf2000Range;
  iRow    : Integer;
  iCol    : Integer;
  strText : String;
begin
  ARange := xlfExcelSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam);
  //確認のために選択してセル背景色を変更
  ARange.Select;
  ARange.Interior.Color := clYellow;

  //行と列番号を取得して表示
  iRow := ARange.Row;
  iCol := ARange.Column;

  strText := '最終行 : ' + IntToStr(iRow) + sLineBreak;
  strText := strText + '最終列 : ' + IntToStr(iCol);

  MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
end;




指定条件の行のセル内容をクリア - 書式も含めてクリア


指定条件の行のセルをクリアする例です.条件は SpecialCells の引数で指定します.
ここでは,値が入力されていない行を,書式を含めてクリアし,空白行にします.

セルに入力されている値を手動で空白にしても,書式設定等の情報が残っていると,データの範囲が変更されない場合があります.このようなセルがあると,空白にもかかわらず印刷されてしまうことがあります.空白セルを含む行をクリアしておくと,この現象を回避できます.

列の場合は EntireColumn プロパティを使用します.


リスト4
空白行のセルを書式を含めて全てクリア
procedure TplExcelFormEx1.Button5Click(Sender: TObject);
var
  ARange  : Txlf2000Range;
  strCell : OleVariant;
begin
  //データが存在する最終セルを取得
  //実際の値がなくても書式が設定されているセルも含む
  ARange  := xlfExcelSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam);
  strCell := xlfToA1(ARange.Row, ARange.Column);

  try
    //A1~strCell行の空白行をクリア
    ARange := xlfExcelSheet.Range['A1', strCell].EntireRow;
    ARange.SpecialCells(xlCellTypeBlanks, EmptyParam).Clear;
  except
    raise;
  end;
end;




指定条件のセルを削除 - データがないセルを削除


指定条件のセルを削除する例です.条件は SpecialCells の引数で指定します.
ここでは,セルに値が入力されていないセルを行方向で調べて削除します.文字列や数値が入力されていないセル全てを削除します.列方向の場合も同様な方法で削除できます.


図6
実行前
図7
実行結果

リスト5
空白セルを全て削除 (行方向)
procedure TplExcelFormEx1.Button6Click(Sender: TObject);
var
  ARange  : Txlf2000Range;
  strCell : OleVariant;
begin
  //データが存在する最終セルを取得
  //実際の値がなくても書式が設定されているセルも含む
  ARange  := xlfExcelSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam);
  strCell := xlfToA1(ARange.Row, ARange.Column);

  try
    //A1~strCellの空白セルを削除
    ARange := xlfExcelSheet.Range['A1', strCell].EntireRow;
    ARange.SpecialCells(xlCellTypeBlanks, EmptyParam).Delete(EmptyParam);
  except
    raise;
  end;
end;