ネットで初めての質問です、よろしくお願いします。
DelphiでExcelにAoutShapeを複数置き、グループ化する方法が分かりません。
いろいろなサイトの情報を参照しましたが、shapes.Rangeの部分で"メンバが見つかりません。"のエラーメッセージが出てしまいます。
ちなみに環境はOS:WinXPでDelphi:TurboDelphiです。
ExcelはOleObjectで操作しています。
// シェイプとテキストボックスをグループ化する
arr := VarArrayCreate([0, 1], varVariant);
arr[0] := '"'+ShapeLst.Values['SH0000001']+'"';
arr[1] := '"'+E_Shape.Name+'"';
// E_Range := xlWorkSheet.shapes.Range(arr[0],arr[1]).Select ;
E_Range := xlWorkSheet.Shapes.Range(arr).Select;
E_Range.Group;
試してませんが、()を[]に変えてみたら、どうなりますか。
E_Range := xlWorkSheet.Shapes.Range[arr].Select;
理由は分かりませんが、Range('A1')はOKでRange('A1').Selectは駄目なようです。
このまま未解決にしておけば、誰かが教えてくれそうな...
Novさま、ありがとうございます。
()を[]に変えて試してみましたが、言われる様に
Range('A1')はOKでRange('A1').Selectが駄目なので
E_Range := xlWorkSheet.Shapes.Range[arr];
E_Range.Select;
E_Range.Group;
としてみましたが
EOleException(メッセージ'指定したパラメータに無効な値が含まれています。')となってしまいました。
試してみました。
なぜ、この文法になるのか理解はできません(誰か助けて...)が、とりあえず動きました。
procedure TForm1.Button1Click(Sender: TObject);
const
msoShapeRectangle = 1;
msoShapeOval = 9;
var
// App: IDispatch;
App, ABook, ASheet, AVar, AShapes, Shape1, Shape2: OleVariant;
begin
try
App := CreateOleObject('Excel.Application');
App.Visible := True;
ABook := App.WorkBooks.Add;
ASheet := App.ActiveSheet;
AVar := VarArrayCreate([0, 1], varVariant);
AVar[0] := ASheet.Shapes.AddShape(msoShapeRectangle, 200, 200, 100, 100).Name;
AVar[1] := ASheet.Shapes.AddShape(msoShapeOval, 250, 250, 100, 100).Name;
ASheet.Shapes.Range[(AVar)].Group; // ここの[()]が[]だとNG
finally
end;
end;
Novさま、ありがとうございます。
確かに、この文法になるのか理解はできませんがめでたく、私のAPも動きだしました。
実は2ヶ月ほど悩んでいました、本当にありがとうございました。
VarArrayOf()を使用すれば?
procedure TForm1.Button1Click(Sender: TObject);
const
msoShapeRectangle = 1;
msoShapeOval = 9;
var
App, ABook, ASheet, AVar: OleVariant;
Names: array[0..1] of Variant;
begin
try
App := CreateOleObject('Excel.Application');
App.Visible := True;
ABook := App.WorkBooks.Add;
ASheet := App.ActiveSheet;
Names[0] := ASheet.Shapes.AddShape(msoShapeRectangle, 200, 200, 100, 100).Name;
Names[1] := ASheet.Shapes.AddShape(msoShapeOval, 250, 250, 100, 100).Name;
ASheet.Shapes.Range[VarArrayOf(Names)].Group; // ここの[()]が[]だとNG
finally
end;
end;
takanaさんのレスで、少なくとも、関数の戻り値と、変数では、値の渡し方が違うということが分かりました。
今までどちらも同じことだと思っていましたので、おかげで気づくことができました。ありがとうございます。
ということは、(AVar)は関数の戻り値と同等なんですね...
ただ、どうしてこの渡し方をしなければならないのかは、やはり理解できていません。
Novさんのソースを
//ASheet.Shapes.Range[(AVar)].Group;
ASheet.Shapes.Range[VarArrayRef(AVar)].Group;
としても可能です。
あるいは
ASheet.Shapes.Range[Test(AVar)].Group;
function Test(A: Variant): Variant;
begin
Result := A;
end;
としても可能でした。
想像ですが、(変数)は
result := 変数;
の関数を実行した結果と同じことになるのではないでしょうか?
A := (B or C); ← 右辺はBoolean型を返す関数を実行したことと同じこと
A := 1 + (B + C); ← 右辺のカッコの部分は数値型を返す関数を実行したことと同じこと
ではないでしょうか?
Novさま、takanaさま
お礼が遅れました
やはり、もやもやしたままだと気持ちが悪いですよね。
ASheet.Shapes.Range[Test(AVar)].Group;
の例で、すっきりしました。
お二方ありがとうございました。
今後ともよろしく、お願いいたします。
ツイート | ![]() |