Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2014年01月19日] [更新 2014年01月19日] エクセル操作フォームEx
エクセル操作フォームEx   参考コード類
セル内の改行数と行数
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro + Excel 2010







セル内の改行数


エクセルでは [Alt] + [Enter] でセル内で改行できます.
そのような改行があるセル内の行数を取得するサンプルです.このサンプルではコードで改行文字を挿入しています.
セル内で自動折り返し表示するようになっている場合,折り返しの分はカウントしません.見かけ上の行数ではなく,改行文字をカウントしています.したがって,最後の文字列の後に改行していると,それも数にカウントされます.


[備考]
セルに [Alt] + [Enter] で挿入される改行コードは $0A(LF, 10進数では #10) です.一方 Windows の一般的な改行コードは $0A$0D (CRLF, 10進数では #13#10) です.



図1
実行画面

リスト1 
//=============================================================================
//  セルにテスト用の文字列をセット
//=============================================================================
procedure TplExcelFormEx1.Button1Click(Sender: TObject);
var
  ARange  : Txlf2000Range;
  strText : String;
begin
  ARange := xlfExcelSheet.Cells.Range['B2', 'B2'];
  ARange.MergeCells := True;

  strText := '東京都' + sLineBreak
           + '埼玉県' + sLineBreak
           + '千葉県';

   ARange.Value := strText;
   ARange.Select;
   ARange.RowHeight := 100;
   ARange.VerticalAlignment := xlTop;
end;

//=============================================================================
//  セル内の行数を取得
//=============================================================================
procedure TplExcelFormEx1.Button2Click(Sender: TObject);
var
  ARange  : Txlf2000Range;
  strText : String;
  Len1    : Integer;
  Len2    : Integer;
  Len3    : Integer;
begin
  ARange := xlfExcelSheet.Cells.Range['B2', 'B2'];

  //他の処理を考慮して改行文字をCRLFとす
  strText := AdjustLineBreaks(ARange.Value);

  //全文字数と改行文字を除いた文字数を取得
  Len1 := Length(strText);
  Len2 := Length(StringReplace(strText, Char(10), '', [rfReplaceAll]));
  Len3 := Integer(strText <> '');

  strText := 'セル内の行数は ' + IntToStr(Len1 - Len2 + Len3) + ' です';
  MessageBox(Handle, PChar(strText), 'セル内の行数', MB_ICONINFORMATION);
end;




セル内の行数


折り返し分を 1 行として数えるには,セルの幅などから,そのセル幅に入っている文字列を知る必要があると思われますが,エクセルには Delphi の TCanvas のようなものはないか,使えません.何か方法があるかも知れませんが,筆者は知りません.

次のコードは,折り返しの分も行数と数えるサンプルですが,以下の条件でのみ取得可能です.セルの高さを自動調整にしていると,行の高さが行数によって変化することを利用しています.
  • 行の高さは自動調整 (もちろん,行数取得後は変更してもよい)
  • 結合セルではない (結合セルは行の高さの自動調整ができない)
  • セル内の文字のサイズ等が全て同じである
隣接するセルにも文字列 (テキスト) がある場合,セルの高さの自動調整が有効にならないことがあります.結合セルもセルの自動高さ調整ができません.そのような場合は,ダミーのシートを用意し,そこに同じセル幅のセルを設定して,そのセルに文字列をセットして取得することも考えられます.


[備考]
(Windows 版の) Excel では,画面上と印刷した場合で折り返し位置が異なる場合があります.



図2
実行画面

リスト2 
//=============================================================================
//  セルにテスト用の文字列をセット
//=============================================================================
procedure TplExcelFormEx1.Button3Click(Sender: TObject);
var
  ARange  : Txlf2000Range;
  strText : String;
begin
  ARange := xlfExcelSheet.Cells.Range['B2', 'B2'];
  ARange.ColumnWidth := 20;
  ARange.Rows.AutoFit;

  strText := '東京都' + sLineBreak
           + '埼玉県' + sLineBreak
           + 'エクセルのセル内の自動折り返し文字列' + sLineBreak
           + '千葉県';

  ARange.Value := strText;
  ARange.Select;
  ARange.VerticalAlignment := xlTop;
end;

//=============================================================================
//  セル内の行数を取得
//  以下の条件で取得可能
//  (1) 結合セルではない
//  (2) 行の高さは自動調整(行数取得後は変更してもよい)
//  (3) セル内の文字列の書式は全て同じ
//=============================================================================
procedure TplExcelFormEx1.Button4Click(Sender: TObject);
var
  ARange      : Txlf2000Range;
  HeightFalse : Double;
  HeightTrue  : Double;
  Len         : Integer;
  strText     : String;
begin
  Len := 0;
  ARange := xlfExcelSheet.Cells.Range['B2', 'B2'];

  if String(ARange.Value) <> '' then begin
    ARange.WrapText := False;
    HeightFalse     := ARange.Height;
    ARange.WrapText := True;
    HeightTrue      := ARange.Height;

    Len := Trunc(HeightTrue / HeightFalse);
  end;

  strText := 'セル内の行数は ' + IntToStr(Len) + ' です';
  MessageBox(Handle, PChar(strText), 'セル内の行数', MB_ICONINFORMATION);
end;