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)をやってみたりしたのですが、
できないです。

どなたか御教授おねがい致します!!

このQ&Aに関連する最新のQ&A

A 回答 (5件)

配列内の最大値などを求めるのは、通常は、全体をなめるしかないと思いますが、ご質問のケースですと、記録するときに同時に探してしまえば、新しくループをしなくてもすむでしょう。

(例えば下の一行を追加)

Ary(1, Num) = Selection.ShapeRange.ZOrderPosition
If Ary(1, Num) > Mxm Then Mxm = Ary(1, Num) '←この行を挿入
Num = Num + 1

目的が最前面の図形以外を消去するだけならば、↑で同時に最大値の時の番号(Num)も記憶しておいて、消去するループではその番号以外を消去してあげればよろしいかと…


Shape(i)はZorder順に並んでいるみたいなので(For Eachでも同じ順みたい)、図形の消去だけが目的なら、別の考え方ですが、以下のように一回のループで配列を利用しなくても可能かと思います。(未検証)
flag = False '←最前面Shapeの検索フラグ
For i = ActiveSheet.Shapes.Count To 1 Step -1
If (Shpeの検索条件に合致するか) Then
  If flag Then Shapes(i).Delete Else flag = True
End If
Next i

この回答への補足

(お礼の後の補足です)
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されていたからダメだとわかりました。訂正します。。。

補足日時:2009/05/13 22:51
    • good
    • 0
この回答へのお礼

御回答ありがとうございます!!
やはり、多次元の配列の最大値を求める場合は総当たりしかないという事ですね!わかりました!!
やたら繰り返し構文が多いコードでしたので、fujillinさんの御指導で、マクロ高速化になりそうです!!

For Each 構文や Do Loop 構文が、Shape(i)がZorder順なのかどうかですが、codename順(sheets()のようにcodenameが取得できませんが、いわゆる新しい図形順)なのか、Zorder順なのかで未検証のままでした。他の要素も絡んでくると大変なので、手を付けてませんでした。確かにこれが明確ならば、かなりコードも単純化しそうですね!!

お礼日時:2009/05/13 20:49

こんばんは。



VBAの教科書では、オブジェクトを確保するのは、配列にするよりも、コレクション・オブジェクトにするというように書いてあるかとは思います。

  Dim colShp As New Collection
    For Each shp In ActiveSheet.Shapes
    colShp.Add shp
  Next

このように確保します。
しかし、もともと、Shapes は、コレクションですから、Index を取っていけば、それで、ZOrderPosistion と一致しているはずですから、以下のようにすればよいと思います。オブジェクトですから、ひとつずつ削除するのではなく、一括して削除します。

Sub TestSample()
  Dim i As Long
  Dim mx As Long
  With ActiveSheet
    mx = .Shapes.Count
    If mx = 1 Then Exit Sub '既に処理した場合は解除
    .Shapes(1).Select '誤動作を避けるため
    For i = 1 To mx - 1
      .Shapes(i).Select False
    Next i
  End With
  Selection.Delete
End Sub

なお、配列の最大値を取る方法には、裏技があって、ふつうは、1次元配列で、ワークシートのMax を取ります。検討してみてください。
    • good
    • 0
この回答へのお礼

御回答ありがとうございます!
なるほど、ZOrderPosition と Index がいっしょなのですね!!
New Collection というのがあるのですか。。。
やっと少しVBAをさわるのに慣れてきましたが、
まだまだ教科書的な基本事を知らないままですね。
Wendy02さんの描いて頂いたコードがスッキリまとめてくれていて、わかり安くて良いですね!!
どうもありがとうございます!!

お礼日時:2009/05/13 23:12

回答2です。


戯けた回答をしてました。
objectが入ってますね。

で、素直に比較していったらどうでしょうか。
-------------------------------------
 Dim myMax, i
 
 myMax = ary(1, 0)
 
 For i = 1 To sum
   If ary(1, i) > myMax Then myMax = ary(1, i)
 Next i

 MsgBox myMax
-----------------------------------------

 
 
    • good
    • 1
この回答へのお礼

出来ました!!
配列をさらに変数に代入させるという事が、考えつきませんでした。
myRangeさんの御指摘の比較の総当たり方法で成功しました!!!
コードも描いて頂きありがとうございます!!

配列をさらに変数に代入させるというアドバイスも頂いたので、
ある意味、配列をわざわざ二次元にしなくとも二つの配列に増やしてもいいのではと思い、
配列を Ary1(0, Num) ←Shape を 格納 と Ary2(0, Num) ← ZOrderPosition を格納で
Mxm = Application.WorksheetFunction.Max(Ary2)
でもコードが動きました!!

出来て嬉しいです!ありがとうございます!!!

お礼日時:2009/05/13 20:29

 


これではどうでしょう

Mxm = WorksheetFunction.Max(Ary, 1)
 
外しましたらご容赦!
 

 
    • good
    • 0
この回答へのお礼

御回答ありがとうございます!
Mxm = WorksheetFunction.Max(Ary, 1)
の 『, 1』は何でしょうか??
myRangeさんの御指摘で、
配列に図形が入っているとできないとう事がわかりました!
ありがとうございます!!

お礼日時:2009/05/13 20:11

ActiveSheet.Shapes.Count


でどうでしょう?

この回答への補足

早速の御回答ありがとうございます!
すいません、ActiveSheet.Shapes.Count は突っ込まれるかと思いました。説明も不足してました。
あと、Erase Shp は Erase Ary です。すいません。。。
ActiveSheet.Shapes.Count を使わないのは、Shape 自体にいくつかの分類を作り名前を与えています。
(For each next の構文内に If Shp.name Like "~~" で指定)
複数の特定の同名を付けられた図形の中で、というのと、別のマクロで ZOrderPosition を逐一変えてしまっている、という点があり、話を複雑にしてしまっています。
今のところ配列内の最大値をマクロで求めたいと思っています。

補足日時:2009/05/13 17:21
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q英語配列のキーボードのメリットは?

ブログやホームページ上で、英語配列のキーボードを勧める記事を時々見かけます。それらの記事によると、特にプログラマーにとっては、英語配列のキーボードの方が便利と書いてあるのですが、実際のところはどうなのでしょうか?
英語配列のキーボードと、日本語配列のキーボード、両方使ったことがある人にお聞きしたいのですが、どちらの方が使いやすかったですか?プログラマーの方は、実際に、英語配列のキーボードの方が打ちやすくなったのでしょうか?是非、意見をきかせてください。

Aベストアンサー

若いころはキーボードの配列に凝ったこともありました(無理やりキーバインドをカスタマイズして古くから慣れ親しんでいたPC88と同じキー配列にしてみたこともあります)。その様なバカなことを繰り返していた中で得た結論は、要は慣れです。

私は好んで英語配列のキーボードを使っていますが、日本語配列キーボードで困ったことはスペースバーが短いことだけで、それ以外は特にどちらが優れているとか思いません。もちろん今現在は日本語配列キーボードを触ると幾分タイピングは遅くなりますが、それは単純に今の私の手が英語配列キーボードに慣れているだけで、日本語配列キーボードに慣れればそちらの方が使いやすいと感じると思います。

Qエクセルで=sum(E5,E7,E10,E16)の入力について

普通に=、S、U、Mと()と、それぞれのセルをクリックするしか方法はないのでしょうか?
シグマのクリックとセルのクリックとか、スマートな入力方法はないのでしょうか?

Aベストアンサー

オートZで表示してから訂正する方法もあります。

E5、E7・・の選択はCTRL+クリックが一般的です。

また、連番でしたらシフト+頭:尾。クリックスクロールなど。

Q教えてください! 東プレのキーボード、英語配列104キー購入しましたが、パソコンに繋いでもJIS配列

教えてください!
東プレのキーボード、英語配列104キー購入しましたが、パソコンに繋いでもJIS配列と認識しています。
英語配列と認識しても、アルト+チルトで日本語にできません。英語配列と認識させながらローマ字入力するにはどのように設定すればいいですか?
ご指導お願いします。

Aベストアンサー

参考に
https://support.microsoft.com/ja-jp/kb/416037
日本語だから、これと同じようにして、英語にすればよいってことになります。
レジストリなら、英語だから、kbd101.dllにして、PCAT_101KEYですけどね

http://qiita.com/shimizu14/items/000cceb9e72a492b9176
http://blog.heiichi.com/?eid=792239

Q■□■読み方■□■ #N/A, #VALUE!, #REF!,DIV/0!,#NUM!, NAME?, #NULL

前に、似たような質問をされている方がおりましたが、明確な答えが出ておりませんでしたので教えていただけますでしょうか。
以下のようなエクセルのエラー項目の
読み方を教えていただけませんでしょうか。
#N/A
#VALUE!
#REF!
DIV/0!
#NUM!
NAME?
#NULL
よろしくお願いします。
なお、意味は結構です。あくまで読み方を教えていただきたいのです。
しかも、カタカナでお答えいただくと助かります。
勝手言って申し訳ないですが、
よろしくお願いします。

Aベストアンサー

<方法1>略語の由来となっている英語を言う。
※冠詞は省いています。英語の表現は他にもあります。

#N/A Not Available Value ナット・アヴェイラブル・ヴァリュー
#VALUE! Wrong Type of Value ローング・タイプ・オヴ・ヴァリュー
#REF! Invalid Cell Reference インヴァリッド・セル・リファレンス
#DIV/0! Divided by Zero ディヴァイディッド・バイ・ゼロ
#NUM! Invalid Number インヴァリッド・ナンバー
#NAME? Unrecognized Name アンリコグナイズド・ネイム
#NULL! Null Intersection ナル・インターセクション

<方法2>書いてある字をそのまま読む。

#N/A エヌエー
#VALUE! バリュー
#REF! レフ
#DIV/0! ディブゼロ
#NUM! ナム
#NAME? ネーム
#NULL! ナル(ヌル)

<方法3>適当な英語で代表させて「エラー」をつける。

#N/A ノットアベイラブルエラー
#VALUE! バリューエラー
#REF! リファレンスエラー
#DIV/0! ディバイデッドバイゼロエラー
#NUM! ナンバーエラー
#NAME? ネームエラー
#NULL! ヌルエラー

<方法4>日本語を混ぜる。

#N/A 無効エラー
#VALUE! バリューエラー
#REF! 参照エラー
#DIV/0! ゼロ割りエラー
#NUM! ナンバーエラー
#NAME? 名前エラー
#NULL! ヌルエラー

<方法1>略語の由来となっている英語を言う。
※冠詞は省いています。英語の表現は他にもあります。

#N/A Not Available Value ナット・アヴェイラブル・ヴァリュー
#VALUE! Wrong Type of Value ローング・タイプ・オヴ・ヴァリュー
#REF! Invalid Cell Reference インヴァリッド・セル・リファレンス
#DIV/0! Divided by Zero ディヴァイディッド・バイ・ゼロ
#NUM! Invalid Number インヴァリッド・ナンバー
#NAME? Unrecognized Name アンリコグナイズド・ネイム
#NULL! Null Intersection ナル...続きを読む

Q日本語配列のキーボードと英語配列のキーボード

日本語配列のキーボードと英語配列のキーボードの
違いは何なのでしょうか?

Aベストアンサー

IBM-PC互換機なら
・キーに日本語が刻印されている
・日本語を扱うためのキー(全角/半角、変換、無変換)がある

Q{=SUM(IF(D8:F8="理",1,0))} の数式の意味が知りたいです

知人から引き継いだ時間割ソフト(エクセルで作成)に以下のような数式が
あったのですが意味がよく分かりません。
{=SUM(IF(D8:F8="理",1,0))} 
特に数式全体をかっこっている { }の意味はなんでしょうか
どういう役割があるのでしょうか

Aベストアンサー

こんにちは。
{=SUM(IF(D8:F8="理",1,0))} 
この式は、お友達の方が「時間割の中で『理』(たぶん理科?)の授業(?)が
ある回数を集計するために設定したものと思われます。
{}の意味は先ほどの方が書かれてるとおりです。
文章で表現するとすれば次のようになると思います。
もし(IF)、D8~F8の範囲(D8:F8)のセルに「理」という文字(”理”。””で括ることで文字データーを表す)があったら、そのセルは数字の「1」なかったら「0」として(,1,0)、D8~F8の範囲(D8:F8)のセルの値を合計して(SUM)下さい。
エクセルでは、このように、2つの関数(SUMとIF)を組み合わせて使うこともできるのです。

Q英語キーボード配列への設定?

USBの英語キーボードを使うことにしましたが、配列がうまく設定できません。MS-IMEのキーボード設定でUSを追加して、USモードに切り替えると、配列は一致するのですが、Alt+「`」で日本語入力モードに切り替わりません。
キー配列を一時的に変更すれば日本語入力可能ですが、日本語入力中でも記号などの配列が違うため結局解決になってません。
MSサイト http://support.microsoft.com/default.aspx?scid=kb;ja;839391 を見ると、英語キーボードのドライバをインストールすればよいようですが、手順どおりに実施してもドライバの選択画面で選択できるのは「HIDキーボードデバイス」のみです。
解決方法についてアドバイスをお願いします。

Aベストアンサー

下記サイトが参考になるかなぁ・・・・
http://www.diatec.co.jp/support/wxp-101usbsetup.html

Q=IF(ISNA(VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)),"",VLOOKUP($A1,sheet2!$A$1:$B $

いつもお世話になってます。
以下の関数式について、お時間がありましたらどうぞご教示ください。

=IF(ISNA(VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)),"",VLOOKUP($A1,sheet2!$A$1:$B $12,2,FALSE))

「シート2の範囲指定した表にA1セルの値と同じ値の右隣になる値を返せ。ただし該当なき場合は空白とせよ。」

純粋になんでこのような構文になるのかが解りません。

1.ISNAってそもそもなんでしょう?
2.同じ式を繰り返すのはなぜ?
(模範式で、このように同じ式を繰り返す構文があまり無いように思えたのです。)

・参考となる他所のページがあれば教えて下さい。
・素人です。お手柔らかにお願いします。

(エクセル2003)

Aベストアンサー

1.ISNAってそもそもなんでしょう?
ISで始まる情報関数の一つで、#N/A!エラーのみを判定する関数
結果はTRUE(真),FALSE(偽)のいずれかになります。
エラー判定のIS関数には他に
ISERR:#N/A!を除くすべてのエラーを判定する関数
ISERROR:すべてのエラーを判定する関数
があります。

2.同じ式を繰り返すのはなぜ?
ISNAの判定する値がセルでなく数式の結果だからです。
A2=VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)
なら
A3=IF(ISNA(A2),"",A2)
ということになります。A2のように計算の為のセルを省略する為に
=IF(ISNA(数式),"",数式)のように同じ数式を2回繰り返しになってます。

Q英語OSと日本語OSでキーボード配列が違う理由

なぜ違うのですか?
また、英語OSで日本語OSと同様のキーボード配列にする方法を教えてください。

Aベストアンサー

それは、JISでキー配列を決めた人に文句を言ってください、としか言いようがない話ですね・・・カナ配列も戦前からの歴史があったカナタイプ配列を捨てて、がらっと違うものにしてしまっている上に、記号類の並びも英語キーボードとは異なるなどの理由から、JIS配列に批判的意見があったことは事実です。これだけ広まってしまった後に文句を言っても、どうしようもないんですけど。

英語OSでも日本語キーボードを接続して使うことは可能なので、次のリンクを見てください。

マイクロソフト公式情報(ただしXPまで)
http://support.microsoft.com/kb/831774/ja

Vistaでの変え方
http://www.runexyfaq.com/parallels/pd-post55.html

ともあれ、今の日本語キーボードが英語キーボードと決定的に違うのは、文字キーが二個多いということです。右側シフトキーの左隣にある「ろ」と、エンターキーの左隣にある「む」は、英語キーボードではそれぞれシフトキーとエンターキーの一部になっています。英語キーボードのエンターが大きいと感じるのはこのためです。言い換えると、英語キーボードのままで配列を日本語に変えると、この二個は打てなくなってしまいますし、変換キーや全角半角キーもなく、記号類はキートップの印刷と実際が異なるなど、不都合が多すぎます。

XP以降のOSなら、多言語対応できるので、英語版で日本語を表示したり、漢字変換を行うことは可能です。フォントとかがインストールされていない場合はインストールCDを要求されるかも知れませんけど、設定はできますよ。まあ、キー配列に慣れる必要があることには変わりないですが。

XPの場合の例
http://homepage3.nifty.com/~nekomata/ie6appcompattest/JapaneselanguageonEnglishXP-1.htm

Vista Homeの例
http://nihongopc.us/faq/2007/07/windows-vista-home.html

それは、JISでキー配列を決めた人に文句を言ってください、としか言いようがない話ですね・・・カナ配列も戦前からの歴史があったカナタイプ配列を捨てて、がらっと違うものにしてしまっている上に、記号類の並びも英語キーボードとは異なるなどの理由から、JIS配列に批判的意見があったことは事実です。これだけ広まってしまった後に文句を言っても、どうしようもないんですけど。

英語OSでも日本語キーボードを接続して使うことは可能なので、次のリンクを見てください。

マイクロソフト公式情報(ただしX...続きを読む

Qエクセルで同じA列の中に、1,2,3,4,5,6,2,3,4,2,1,3,2,2,2,3,1という

エクセルで同じA列の中に、1,2,3,4,5,6,2,3,4,2,1,3,2,2,2,3,1,3,1というような順番で数字が並んでいます。

その数字の中で、1→3と3→1になるものがいくつあるか求めたいのですが、出す関数・マクロがわかりません。
教えていただけないでしょうか?

よろしくお願いします。

Aベストアンサー

こんばんは!

>A列の中に
とは行方向に数値が入っている!というコトでしょうか?

そうであれば
表示したいセルに
=COUNTIFS(A1:A1000,1,A2:A1001,3)+COUNTIFS(A1:A1000,3,A2:A1001,1)
としてみてください。

「1」の次の行が「3」の場合と
「3」の次の行が「1」の場合をプラスしています。m(_ _)m


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報