C++ Builder XE4 > Excel + OLE > 5行5列に3.14を代入 | 5行5列の内容をコピー・ペースト

```txt:動作環境
- 実装
    - C++ Builder XE4
- 確認
    - Windows 8.1 Pro
    - Office 2016
```

### 関連

- [C++ Builder XE4 > Excel > 1行挿入して、別ファイル保存 | DisplayAlertsのオフ](https://qiita.com/7of9/items/455ed13e1c6b96331a63)
- [C++ Builder XE4 > Excel > セルC5に"3.141592"を代入する > 3.14となる](https://qiita.com/7of9/items/a7d677dc5795b658410f)

### 処理概要

- base.xlsxを読込む
- 5行5列に"3.14"と記載する
- 上記の行列を別の行列にコピー&ペーストする
- out.xlsxというファイル名で保存する

### 参考 (コピー&ペースト処理)

- [Тема: C++ Builder6 & Excel](http://www.interface.ru/iservices/messages.asp?forumId=587&topicId=503)
    - ロシア語

### code v0.1

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <System.Win.ComObj.hpp>  // EXCEL処理用

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormMain *FormMain;
//---------------------------------------------------------------------------
__fastcall TFormMain::TFormMain(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::btnConvertClick(TObject *Sender)
{
	String curDir = ExtractFileDir(Application->ExeName);

	WideString srcFile = curDir + "\\base.xlsx";
	WideString dstFile = curDir + "\\out.xlsx";

	//--- Excel処理
	bool closeExcel = false;

	Variant ExcelApp = CreateOleObject("Excel.Application");

	try
    {
		Variant xls_books;
        Variant xls_abook;
        Variant xls_sheets;
		Variant xls_asheet;

		try {
			ExcelApp.OlePropertySet("Visible", false); // Excel not shown
			ExcelApp.OlePropertySet("DisplayAlerts", false); // No dialog for overwrite

			xls_books = ExcelApp.OlePropertyGet("Workbooks");
			xls_abook = xls_books.OleFunction("Open", srcFile);
			// 最初のシート選択
			xls_abook.OlePropertyGet("Sheets", 1).OleProcedure("Select");
			xls_asheet = xls_abook.OlePropertyGet("ActiveSheet");
			// 1. Fill
			for (int ci = 1; ci <= 5; ci++) { // ci: column index
				for (int ri = 1; ri <= 5; ri++) { // ri: row index
					xls_asheet.OlePropertyGet("Cells", ri, ci).OlePropertySet("Value", WideString("3.141592"));
				}
			}
			// 2. Copy and Paste
			Variant wrkRange = xls_asheet.OlePropertyGet("Range", WideString("A1:E5"));
			wrkRange.OleProcedure("Copy");
			xls_asheet.OlePropertyGet("Range", WideString("F7:J11")).OleProcedure("Select");
			xls_asheet.OleProcedure("Paste");
			// 3. Save
			xls_abook.OleProcedure("SaveAs", dstFile); //開いた*.xlsxを別名保存
			closeExcel = true;
			ExcelApp.Exec(Procedure("Quit"));

			String msg = L"Save to [" + dstFile + L"]";
			ShowMessage(msg);
		}
		__finally
        {
            xls_asheet = Unassigned(); // 変数を初期状態に
            xls_sheets = Unassigned();
            xls_abook = Unassigned();
            xls_books = Unassigned();
        }
    }
    __finally
    {
        ExcelApp = Unassigned();
	}
}
//---------------------------------------------------------------------------
```

### 結果

out.xlsxファイル。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/984634c4-8bcd-0e78-db37-c2e6a6ea5c88.png)

今回の結果では"3.141592"という数値が代入された。
base.xlsxではフォーマットを指定していない。


### コピー先の選択

コピー先はRange選択でなくCells選択でも可能。

```cpp
xls_asheet.OlePropertyGet("Cells", 7, 7).OleProcedure("Select");
```