DelphiアプリケーションでExcelを操作する便利な方法を
全7回に分けてご紹介してまいります。
今回は基本的なセル・行・列で実行できる操作についてご説明します。
- 第1回:基本編
- 第2回:印刷編
- 第3回:セル操作編(基本)
- 第4回:セル操作編(応用)
- 第5回:セル操作編(発展)
- 第6回:ウインドウ編
- 第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月号より(文字に下線をセット)