Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


Delphi OLEのExcel操作術 第3回:セル操作編(基本)

DelphiアプリケーションでExcelを操作する便利な方法を
全7回に分けてご紹介してまいります。

今回は基本的なセル・行・列で実行できる操作についてご説明します。

 

※第1~2回でも使用した以下の変数は、今回も引き続き使用します。

uses節には「System.Win.ComObj」を追加しておいて下さい。
(Delphi XE以前では「ComObj」)

var // 「OLEのExcel操作術」各Tips共通で使用する変数宣言
  MsExcel: OleVariant;       // ExcelのOLE変数
  MsApplication: OleVariant; // アプリケーションのOLE変数
  WBook: OleVariant;         // ブックのOLE変数
  WSheet: OleVariant;        // シートのOLE変数

 

また、本文中で登場するExcel側で決められた定数は
constで宣言しておくとわかりやすくなります。

(※uses節に「Excel2000」を追加しておくと本記事で使用する名前の定数が
  全て含まれているため、const宣言不要になります。)

下記のコードは対象となるExcelアプリケーションなどの各変数が設定されていることが前提です。
(プログラムではExcelファイルが開かれるコードを実行した状態になります)

 


セル・行・列の削除や挿入を行う方法

【セルの削除】
Rangeを使用して削除する範囲を指定します。
例えばセルの’A1’のみ削除する場合、削除後にシフトする方向を指定すると次のようになります。

const
  xlShiftToLeft = -4159;  //上方向にシフト
  xlShiftUp     = -4162;  //左方向にシフト
begin
  WSheet.Range['A1','A1'].Delete(Shift:=xlShiftToLeft);
または
  WSheet.Range['A1','A1'].Delete(Shift:=xlShiftUp);

 

【行の削除】
Rangeで指定したセル範囲を含む行を削除するためにEntireRowを使用します。
3~5行目を削除するには次のようになります。
この例ではA列のセルを指定していますが、セル範囲を含む行ですので他の列でも構いません。

  WSheet.Range['A3','A5'].EntireRow.Delete;

 

【列の削除】
行の削除ではEntireRowを使用しましたが、列であればEntireColumnを使用します。
こちらの場合も同様にセル範囲を含む列が対象になります。
このため次の場合であればBからD列が削除されます。

  WSheet.Range['B3','D5'].EntireColumn.Delete;

 

【セルの挿入】
セル・行・列の挿入も、削除と同じようにRangeで範囲を指定して行えます。

const
  xlShiftToRight = -4161;  // 右方向にシフト
  xlShiftDown    = -4121;  // 下方向にシフト
begin //(例:A1からB2にセル挿入)
  WSheet.Range['A1','B2'].Insert(Shift:=xlShiftToRight);
または
  WSheet.Range['A1','B2'].Insert(Shift:=xlShiftDown);

 

【行の挿入】
(例:3から5行目に行挿入)

  WSheet.Range['A3','A5'].EntireRow.Insert;

 

【列の挿入】
(例:BからD列目に列挿入)

  WSheet.Range['B3','D5'].EntireColumn.Insert;

 


コピー&ペースト と カット&ペーストを行う方法

【セルのコピー&ペースト】
Range
でセル範囲を指定してCopyを行い、
ペースト先もRangeを使って指定してPasteまたはPasteSpecialを行います。

  WSheet.Range['B3','D5'].Copy;
  WSheet.Range['D36'].PasteSpecial;

ペーストではなく、コピー先に挿入することもできます。
このときシフトする方向を指定するには次のようになります。

const
  xlShiftToRight = -4161;  //右方向にシフト
  xlShiftDown    = -4121;  //下方向にシフト
begin
  WSheet.Range['D36'].Insert(Shift:=xlShiftToRight);
または
  WSheet.Range['D36'].Insert(Shift:=xlShiftDown);

 

【行のコピー&ペースト】
EntireRowを使用すると、Rangeで指定したセル範囲を含む行を指定できます。

3~5行目をコピーし18行目に貼り付けるには次のようになります。
この例ではA列のセルを指定していますが、セル範囲を含む行ですので、他の列でも構いません。

  WSheet.Range['A3','A5'].EntireRow.Copy;
  WSheet.Range['A18','A18'].EntireRow.PasteSpecial;

コピー先に挿入する場合にはセルと同様に行います。

  WSheet.Range['A18'].EntireRow.Insert(Shift:=xlShiftDown);

 

【列のコピー&ペースト】
EntireColumnでRangeで指定したセル範囲を含む列を指定できます。
G~J列目をコピーしA列目に貼り付けるには次のようになります。

  WSheet.Range['G3','J5'].EntireColumn.Copy;
  WSheet.Range['A18'].EntireColumn.PasteSpecial;

コピー先に挿入する方法はセルや行の場合と同じです。

  WSheet.Range['A18'].EntireColumn.Insert(Shift:=xlShiftDown);

 

【セルのカット&ペースト】
コピーではなくカットする場合、Copyに対してCutを使います。
ペーストは一度範囲をSelectし、シートに対してPasteを行います。

また、カット&ペーストのときもInsertメソッドで挿入することもできます。
(行や列のカット&ペースト時も同様)

  WSheet.Range['B3','D5'].Cut;
  WSheet.Range['D36'].Select;
  WSheet.Paste;

 

【行のカット&ペースト】
行範囲をEntireRowを使って指定し、セルと同様にCutとSelect・Pasteを行います。

  WSheet.Range['A3','A5'].EntireRow.Cut;
  WSheet.Range['A16'].Select;
  WSheet.Paste;

 

【列のカット&ペースト】
列範囲を指定するためEntireColumnを使用し、後は同様にCutとSelect・Pasteを行います。

  WSheet.Range['G3','J5'].EntireColumn.Cut;
  WSheet.Range['B1'].Select;
  WSheet.Paste;

 


セルの編集を行う方法

ここからは、セルの編集を行う方法についてご紹介します。

セルの指定であれば今まで出てきたようにCellを使って列・行番号を指定する方法と
Rangeを使ってセル名を指定する方法があります。

またRangeはセルの範囲指定も行えます。
EntireRowを使用するとRangeで指定したセル範囲を含む行を、
EntireColumnでRangeを使用すると指定したセル範囲を含む列を指定できます。

 

【水平方向の位置寄せ】
位置を指定する定数を次のように宣言して、HorizontalAlignmentに設定します。

const
  xlHAlignCenter  = -4108; // 中央揃え
  xlHAlignLeft    = -4131; // 左詰め(インデント)
  xlHAlignRight   = -4152; // 右詰め
  xlHAlignGeneral               = 1;     //(参考)標準
  xlHAlignDistributed           = -4117; //(参考)均等割り付け
  xlHAlignJustify               = -4130; //(参考)両端揃え
  xlHAlignCenterAcrossSelection = 7;     //(参考)選択範囲内で中央
  xlHAlignFill                  = 5;     //(参考)繰り返し
begin
  WSheet.Cells[1,1].HorizontalAlignment  := xlHAlignLeft;
  WSheet.Range['A2'].HorizontalAlignment := xlHAlignRight;
  WSheet.Range['A3','C6'].HorizontalAlignment := xlHAlignCenter;

  WSheet.Range['B3','D5'].EntireColumn.HorizontalAlignment
                                              := xlHAlignLeft;
  WSheet.Range['A1','C2'].EntireRow.HorizontalAlignment
                                              := xlHAlignCenter;

 

【垂直方向の位置寄せ】
垂直方向での定数は次のようになります。
水平方向のHorizontalAlignmentに対して、垂直方向はVerticalAlignmentに設定します。

const
  xlVAlignCenter   = -4108; // 中央揃え
  xlVAlignTop      = -4160; // 上詰め
  xlVAlignJustify  = -4107; // 下詰め
  xlVAlignDistributed = -4117; // (参考)均等割り付け
  xlVAlignBottom      = -4130; // (参考)両端揃え
begin
  WSheet.Cells[1,1].VerticalAlignment       := xlVAlignTop;
  WSheet.Range['A2'].VerticalAlignment      := xlVAlignBottom;
  WSheet.Range['A3','A6'].VerticalAlignment := xlVAlignCenter;

  WSheet.Range['B3','D5'].EntireColumn.VerticalAlignment
                                            := xlVAlignTop;
  WSheet.Range['B3','D5'].EntireRow.VerticalAlignment
                                            := xlHAlignCenter;

 


セルの書式設定を行う方法

ここからは、セルの書式設定を行う方法をご紹介します。

 

【フォント】
フォントのプロパティから次のような指定を行えます。

  // フォント名
  WSheet.Cells[1,1].Font.Name := 'MS P明朝';
  // フォントサイズ
  WSheet.Cells[1,1].Font.Size := 16;

  // 太字
  WSheet.Cells[1,1].Font.Bold := True;
  // 斜体
  WSheet.Cells[1,1].Font.Italic := True;
  // 標準(デフォルト)
  WSheet.Cells[1,1].Font.FontStyle := '標準';
  // 取り消し線
  WSheet.Cells[1,1].Font.Strikethrough := True;

 

【配置】
セルのプロパティから次のような指定を行えます。

  // 折り返して全体を表示する
  WSheet.Cells[1,1].WrapText := True;

  // 縮小して全体を表示する
  WSheet.Cells[1,1].ShrinkToFit := True;

セルの指定であれば、今まで行ってきたように
Cellを使って列・行番号を指定する方法とRangeを使ってセル名を指定する方法があります。
またRangeはセルの範囲指定も行えます。

さらにEntireRowを使用するとRangeで指定したセル範囲を含む行、
EntireColumnでRangeで指定したセル範囲を含む列を指定できます。

 


数値の編集表示を行う方法

ここからは、数値の編集表示を行う方法をご紹介します。

編集形式の指定にはNumberFormatLocalプロパティを使用し、次のような形式を設定できます。

 

【数値のカンマ付編集表示】
‘#’ と ‘0’ 、’,’ を組み合わせて形式を指定します。
‘#’ を指定した桁の位置に数値がないか、値が0であれば表示されません。
それに対して、’0′ を指定した桁の位置には数値がなくても0として表示されます。

  WSheet.Cells[1, 1].Value := 14800;
  WSheet.Cells[1, 1].NumberFormatLocal := '#,##0';   // 14,800
  WSheet.Cells[1, 1].NumberFormatLocal := '000,000'; // 014,800

  WSheet.Cells[2, 1].Value := 0;
  WSheet.Cells[2, 1].NumberFormatLocal := '#,##0';   // 0
  WSheet.Cells[2, 1].NumberFormatLocal := '#,###';   //(非表示)

 

【数値の小数点付編集表示】
‘#’ を指定した位置に数値がないかまたは値が0の場合には、上記と同様に何も表示されません。

  WSheet.Cells[3, 1].Value := 5.8;
  WSheet.Cells[3, 1].NumberFormatLocal := '00.00';  //05.80
  WSheet.Cells[3, 1].NumberFormatLocal := '#0.00';  // 5.80
  WSheet.Cells[3, 1].NumberFormatLocal := '#0.0#';  //  5.8

上記のように ‘#’ を使って小数点以下が表示されない形式のときには、
数値項目は右詰で表示されるため、小数点の位置がずれてしまいますが、
‘?’ を使って揃えることができます。

  // 小数点の位置をそろえる
  WSheet.Range['A4'].Value :=     5.8;
  WSheet.Range['A5'].Value :=   130.66;
  WSheet.Range['A6'].Value := -8556.714;
  WSheet.Range['A4','A6'].NumberFormatLocal := '#,##0.???';

//   A4 :     5.8
//   A5 :   130.66
//   A6 :-8,556.714

 

【正の数と負の数で書式を分ける】
‘#,##0’ と指定したとき、負の数であれば、-2,500 のように符号付で表示されます。
正と負で書式を変えたい場合には、2つの書式を ‘;’ で区切ります。
(DelphiのFormatFloatと似ています)

  WSheet.Range['A7'].Value :=  2500;
  WSheet.Range['A8'].Value := -2500;
  WSheet.Range['A7','A8'].NumberFormatLocal := '#,##0;△#,##0';

//   A7  :   2,500
//   A8  : △2,500

また文字の色を指定することもできます。
これは特に書式を分ける場合でない前述のような場合でも'[青]#,##0’のように指定可能です。
指定できる色は次の8つです。

[黒] [青] [水] [緑] [紫] [赤] [白] [黄]

  WSheet.Range['A7','A8'].NumberFormatLocal := '#,##0;[赤]-#,##0';

//   A7  :   2,500
//   A8  :  -2,500 (赤字で表示)

 

【正の数と負の数とゼロの数で書式を分ける】
3つの書式を ‘;’ で区切ることで、数が正・負・ゼロのときを分けることができます。

  WSheet.Range['A9'].Value :=   2500;
WSheet.Range['A10'].Value := -2500;
WSheet.Range['A11'].Value := 0;
WSheet.Range['A9','A11'].NumberFormatLocal := '#,##0;(#,##0);「ゼロ」';

// A9 : 2,500
// A10 : (2,500)
// A11 : 「ゼロ」

 


フォントに下線を引く方法

今回はフォントに下線を引く方法についてご説明します。
下線の種類等は数値ですので、constで定数を宣言することができます。

const
  // 下線なし
  xlUnderlineStyleNone   = -4142;
  // 一重線 
  xlUnderlineStyleSingle = 2;
  // 二重線
  xlUnderlineStyleDouble = -4119;
  // 一重線(会計)
  xlUnderlineStyleSingleAccounting = 4;
  // 二重線(会計)
  xlUnderlineStyleDoubleAccounting = 5;

(会計)とある線の場合、文字に下線が掛からないようになりますが、
そうでない方は文字の下部に掛かります。

下線はセルのFontのUnderlineで線の種類を指定します。
セルの指定でひとつのセルを指定するには次の2つがあります。

  // A1のセル
  WSheet.Range['A1'].Font.Underline := xlUnderlineStyleSingle;
  // B1のセル
  WSheet.Cells[1,2].Font.Underline := xlUnderlineStyleSingle;

列全体または行全体を指定するのであれば、
EntireColumnまたはEntireRowのFontに対して設定します。

  // A列
  WSheet.Range['A1'].EntireColumn.Font.Underline := xlUnderlineStyleDouble;
  // 1行め
  WSheet.Range['A1'].EntireRow.Font.Underline := xlUnderlineStyleDouble;

EntireColumnやEntireRowはそのセルが含まれている列全体または行全体を指します。
また複数の範囲を指定することも可能です。

  // 1から3行め
  WSheet.Range['A1:D3'].EntireRow.Font.Underline := xlUnderlineStyleSingleAccounting;

 

 


(本記事は、以下の資料をもとに最新情報を含めた再構成をしております。)

  • ミガロ.情報マガジン「MIGARO News!!」
    • Vol.121 2010年12月号より(セルや行列の挿入や削除)
    • Vol.122 2011年1月号より(セルや行列のコピー&ペースト)
    • Vol.123 2011年2月号より(セルの編集 縦横の位置揃え)
    • Vol.124 2011年3月号より(セルの編集 フォントや折り返しの設定)
    • Vol.127 2011年6月号より(数値の編集表示)
    • Vol.131 2011年10月号より(文字に下線をセット)