|
■No67746 (shu さん) に返信
> シートのコピーはWorkSheetsクラスではなく
> WorkSheetクラスのメソッド
> Copy(Before,After)
> で行います。
その通りですね。
ですが一応、Sheets/Worksheets(≠WorkSheets) の
Copy メソッドでも、複製は可能だったりします。
VBA 的にはこんな感じです。
Set objSheets = ThisWorkbook.WorkSheets(Array("Sheet1"))
Call objSheets.Copy(ThisWorkbook.Sheets("Sheet1"))
上記は本来、複数のシートを一度にコピーする場合などに
使う手法なので、今回のようなケースでは Sheets.Copy ではなく、
shu さんが紹介された Sheet.Copy の方が望ましいですけれどね。
> プロパティではないので
> BindingFlags.SetProperty
> ではなく
> BindingFlags.InvokeMethod
> を使用します。
裕猫さんが書かれていたのは GetProperty でしたね。SetProperty ではなく。
メソッドの呼び出しに InvokeMethod を使うべきというのはその通りなのですが、
実際には GetProperty でも呼び出せてしまったりします。
もちろん、InvokeMethod の方が適切ですけれども。
修正案。下記では、コピーした新シートを一番左側に配置しています。
public static void EX_CopySheet()
{
sheets = book.GetType().InvokeMember("Sheets", BindingFlags.GetProperty, null, book, null);
object target = book.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, sheets, new object[] { "sheet1" });
object firstSheet = book.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, sheets, new object[] { 1 });
parameters = new object[2] { firstSheet, Type.Missing };
target.GetType().InvokeMember("Copy", BindingFlags.InvokeMethod, null, target, parameters);
System.Runtime.InteropServices.Marshal.ReleaseComObject(target);
System.Runtime.InteropServices.Marshal.ReleaseComObject(firstSheet);
sheet = book.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, sheets, new object[] { 1 });
string oldSheetName = (string)sheet.GetType().InvokeMember("Name", BindingFlags.GetProperty, null, sheet, null);
parameters = new object[] { "X1" };
sheet.GetType().InvokeMember("Name", BindingFlags.SetProperty, null, sheet, parameters);
Console.WriteLine("「{0}」を「{1}」に改名", oldSheetName, "X1");
}
|