ExcelのAoutShapeをグループ化するには

解決


おじいちゃん  2013-02-25 00:43:54  No: 43951

ネットで初めての質問です、よろしくお願いします。
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;


Nov  2013-02-25 02:47:08  No: 43952

試してませんが、()を[]に変えてみたら、どうなりますか。

E_Range := xlWorkSheet.Shapes.Range[arr].Select;

理由は分かりませんが、Range('A1')はOKでRange('A1').Selectは駄目なようです。
このまま未解決にしておけば、誰かが教えてくれそうな...


おじいちゃん  2013-02-25 10:36:21  No: 43953

Novさま、ありがとうございます。
()を[]に変えて試してみましたが、言われる様に
Range('A1')はOKでRange('A1').Selectが駄目なので

 E_Range := xlWorkSheet.Shapes.Range[arr];
 E_Range.Select;
 E_Range.Group;
としてみましたが
EOleException(メッセージ'指定したパラメータに無効な値が含まれています。')となってしまいました。


Nov  2013-02-25 20:45:36  No: 43954

試してみました。
なぜ、この文法になるのか理解はできません(誰か助けて...)が、とりあえず動きました。

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;


おじいちゃん  2013-02-26 02:26:48  No: 43955

Novさま、ありがとうございます。

確かに、この文法になるのか理解はできませんがめでたく、私のAPも動きだしました。

実は2ヶ月ほど悩んでいました、本当にありがとうございました。


takana  2013-02-26 08:54:10  No: 43956

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;


Nov  2013-02-26 22:39:34  No: 43957

takanaさんのレスで、少なくとも、関数の戻り値と、変数では、値の渡し方が違うということが分かりました。
今までどちらも同じことだと思っていましたので、おかげで気づくことができました。ありがとうございます。
ということは、(AVar)は関数の戻り値と同等なんですね...

ただ、どうしてこの渡し方をしなければならないのかは、やはり理解できていません。


takana  2013-02-27 07:57:49  No: 43958

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);  ←  右辺のカッコの部分は数値型を返す関数を実行したことと同じこと
ではないでしょうか?


おじいちゃん  2013-03-04 00:48:25  No: 43959

Novさま、takanaさま

お礼が遅れました
やはり、もやもやしたままだと気持ちが悪いですよね。
ASheet.Shapes.Range[Test(AVar)].Group;
の例で、すっきりしました。
お二方ありがとうございました。
今後ともよろしく、お願いいたします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加