C++ Builder XE4 > Excel + OLE > Rangeクリア > ClearとClearContents
14000 ワード
動作環境
- 実装
- C++ Builder XE4
- 確認
- Windows 8.1 Pro
- Office 2016
関連
- C++ Builder XE4 > Excel > 1行挿入して、別ファイル保存 | DisplayAlertsのオフ
- C++ Builder XE4 > Excel + OLE > 5行5列に3.14を代入 | 5行5列の内容をコピー・ペースト
参考
処理概要
- Rangeで行列を指定してクリアする
上記以外には下記を行っている。
- base.xlsxを読込む
- 5行5列に"3.14"と記載する
- 上記の行列を別の行列にコピー&ペーストする
- out.xlsxというファイル名で保存する
- 処理時間の計測
code
下記の処理3においてRangeクリアしている。
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");
DWORD stTim = GetTickCount();
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.OlePropertyGet("Cells", 7, 7).OleProcedure("Select");
xls_asheet.OleProcedure("Paste");
// 3 Range Clear
xls_asheet.OlePropertyGet("Range", WideString("A1:E5")).OleProcedure("Clear");
// 4. Save
xls_abook.OleProcedure("SaveAs", dstFile); //開いた*.xlsxを別名保存
closeExcel = true;
ExcelApp.Exec(Procedure("Quit"));
DWORD edTim = GetTickCount();
String msg = IntToStr((int)(edTim - stTim)) + L"(msec) has passed";
msg = msg + L"\r\n" + L"Save to [" + dstFile + L"]";
ShowMessage(msg);
}
__finally
{
xls_asheet = Unassigned(); // 変数を初期状態に
xls_sheets = Unassigned();
xls_abook = Unassigned();
xls_books = Unassigned();
}
}
__finally
{
ExcelApp = Unassigned();
}
}
//---------------------------------------------------------------------------
処理結果
A1からE5の範囲の値が消えるようになった。
また、設定していた書式も「標準」に戻っている。
書式だけ残して値を消すのは別の方法のようだ。
書式を残したクリア > ClearContents
書式だけ残して値を消すのはClearContents。
参考: https://stackoverflow.com/questions/11137636/can-i-clear-cell-contents-without-changing-styling
参考: Range.ClearContents メソッド (Excel)
// 3 Range Clear
xls_asheet.OlePropertyGet("Range", WideString("A1:E5")).OleProcedure("ClearContents");
Author And Source
この問題について(C++ Builder XE4 > Excel + OLE > Rangeクリア > ClearとClearContents), 我々は、より多くの情報をここで見つけました https://qiita.com/7of9/items/23a50a477f92fab881de著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .