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
実行画面 |
//=============================================================================
// セルにテスト用の文字列をセット
//=============================================================================
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
実行画面 |
//=============================================================================
// セルにテスト用の文字列をセット
//=============================================================================
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;
|