- ベストアンサー
Excel vba 配列内の最大値を求めたいです。
Excel vba をはじめて1ヵ月程度の初心者ですが、すいません質問させて下さい。 動的配列というのでしょうか? その配列の中の最大値を求めたいのですが、よくわかりません。 アクティブシート内の図形で最前面以外の図形を消去しようと思ってます。 マクロで最大値の取得ができないので、暫定的にシートに計算させてしまっているのですが、マクロ上で最大値を求める方法がわかりません。 Sub testSZ() Dim Num As Integer, Sum As Integer, Shp As Shape, Ary() As Variant, Mxm As Long '++++++++++↓アクティブシート内の図形をカウント:=Sum Sum = 0 For Each Shp In ActiveSheet.Shapes Sum = Sum + 1 Next Shp '++++++++++↓配列の数を決定 ReDim Ary(1, Sum) '++++++++++↓配列に図形と図形のZオーダーを設定 Num = 0 For Each Shp In ActiveSheet.Shapes Shp.Select Set Ary(0, Num) = Shp Ary(1, Num) = Selection.ShapeRange.ZOrderPosition Num = Num + 1 Next Shp '++++++++++↓配列内のZオーダー最大値を取得 Mxm = Application.WorksheetFunction.Max '++++++++++↓最前面の図形以外を消去 Num = 0 Do If Mxm > Ary(1, Num) Then Ary(0, Num).Delete End If Num = Num + 1 Loop Until Sum = Num Erase Shp End Sub Application.WorksheetFunction.Max[] の[]にAryやAry(1,Num)をやってみたりしたのですが、 できないです。 どなたか御教授おねがい致します!!
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
- myRange
- ベストアンサー率71% (339/472)
- myRange
- ベストアンサー率71% (339/472)
- nattocurry
- ベストアンサー率31% (587/1853)
お礼
御回答ありがとうございます!! やはり、多次元の配列の最大値を求める場合は総当たりしかないという事ですね!わかりました!! やたら繰り返し構文が多いコードでしたので、fujillinさんの御指導で、マクロ高速化になりそうです!! For Each 構文や Do Loop 構文が、Shape(i)がZorder順なのかどうかですが、codename順(sheets()のようにcodenameが取得できませんが、いわゆる新しい図形順)なのか、Zorder順なのかで未検証のままでした。他の要素も絡んでくると大変なので、手を付けてませんでした。確かにこれが明確ならば、かなりコードも単純化しそうですね!!
補足
(お礼の後の補足です) Sub testTurn() Dim Shp As Shape For Each Shp In ActiveSheet.Shapes Shp.Select Application.Wait [NOW()+"0:00:01"] Next Shp End Sub fujillinさんの御指摘があったので、検証してみたら、For Each 構文や Do Loop 構文もZorder順で選択しているみたいです。(Excel 2007) fujillinさん、マクロが単純化できそうです!どうもありがとうございます!! あとすいません。勘違いしてました。多次元の配列の最大値を求める場合もApplication.WorksheetFunction.Max(Ary)で出来ました。 今回の場合は図形が配列にSetされていたからダメだとわかりました。訂正します。。。