プロが教える店舗&オフィスのセキュリティ対策術

シート上にオートシェープを配置すると、自動で名前と番号が振られます。(直線 125 とか 図 126とか)
この番号は連番になっており、配置したオートシェープを全て削除してファイルを保存しても、次回はオートシェープが何もないにもかかわらず、次の番号から採番されます。

この番号はいったい幾つまで続くのでしょうか?

下記VBAを試してますが、現在7万番台でもまだ有効に採番されます。
ある番号になったらそれ以上オートシェープが作れなくなるという話も聞きましたので質問します。

Sub test01()

Randomize

With ActiveSheet
.Cells.Interior.ColorIndex = 1

CL = Int((50 * Rnd) + 1)
L1 = Int((700 * Rnd) + 20)
H1 = Int((450 * Rnd) + 20)

Set SA = .Shapes.AddShape(msoShape5pointStar, L1, H1, 25, 25)
SA.Name = "Merlion_" & SA.Name
SA.Fill.ForeColor.SchemeColor = CL

For n = 1 To 100

CL = Int((50 * Rnd) + 1)
L2 = Int((600 * Rnd) + 20)
H2 = Int((300 * Rnd) + 20)

SA.Top = H2 - SA.Width / 2
SA.Left = L2 - SA.Height / 2
SA.Fill.ForeColor.SchemeColor = CL

Set SL = .Shapes.AddLine(L1, H1, L2, H2)
SL.Name = "Merlion_" & SL.Name
Application.StatusBar = SL.Name

SL.line.Weight = 0.75
SL.line.ForeColor.SchemeColor = CL

L1 = L2
H1 = H2

Next

SA.ZOrder msoBringToFront
SA.line.Visible = True
SA.line.ForeColor.SchemeColor = CL

For i = 1 To 800 Step 60
SA.Rotation = i / 10
SA.line.Weight = i
DoEvents
Next

For Each s In .Shapes
If s.Name Like "Merlion_*" Then s.Delete
Next

.Cells.Interior.ColorIndex = xlNone

End With

End Sub

A 回答 (9件)

merlionXX さん、こんばんは。



現在まで調べた結果を掲示しておきます。

それから、私が前回使った「オブジェクト・ネーム」の枝番というのは、オートシェイプの内部カウンタというらしいのです。

今、私は、そのオートシェイプの内部カウンタをリセットできれば、一応、ブックの安定が保たれるように思っています。

検索語「autoshape numbers」で、

同じテーマの内容が、Microsoft のNewsGroupでヒットしました。

microsoft.public.excel.programming
Thu, 17 Feb 2005 09:27:05 -0800

「ネームボックスのオートシェイプの番号は、リセットできますか?」
題名 (Can the Autoshape number in the namebox be reset?)

この回答者が、

10万までやってみましたが、何の問題もありませんでした。しかし、やがては、頂点に達するにちがいないと思います。
(I've gone into 100k's without a problem, but I guess it must top out
eventually. )

と書いています。私がその回答については、たぶん、SingleかLong型で、自然数なのですから、少なくとも、その型の正の桁ぐらいは入れられるはずだから、私たちが一般的に使うレベルより、はるかに大きな値である、と考えます。

それで、その元の回答の結論は、リセット仕方は、ワークシートをコピーして、新しくすることだ、となっています。

と、ここまでは良いのですが、私自身としては、それは、なんとなく納得していないのです。それは、理論値が当てにならないことです。根本的解決方法がないか探しています。

現状はここまでです。
    • good
    • 0
この回答へのお礼

わざわざお調べいただきありがとうございます。

わたしも上記のコードをScreenUpdating=falseにして、10万の上を試してみようと思います。

お礼日時:2005/07/13 10:16

merlionXXさん、昨日の続きです。



オートシェイプの内部カウンタというのは、消去法で調べていくと、残りは、シートしかありません。シートそのものに残っていくようですね。ということは、シート内のカウンタにバイト数をどのぐらい使っているかは分かりませんが、2バイトということはありえませんので、それを削除している限りは、一般使用では(10万単位程度では)問題になることはありません。単に、図形オブジェクトのメモリ上の問題だけのようです。既に2バイトの数の容量は越えているので、仮に4バイト(Long型)だとすれば、正数側で、21億ほどになります。

なぜ、インクリメントに、カウンタ数が増えていく仕様になるのか、また更新されないのか、はっきりはしていないのですが、ただ、バイナリ・エディタで調べていく中で、シートの内容そのものが、一旦作成すると、オブジェクトを追加して、それを削除しても、ある種の痕跡は残して、どんどん膨らむような仕組みにあるのではないかと思いました。それは、ワークシート上では、オブジェクトは完全に消去できないための保護機能かもしれません。

つまり、別な言い方をすると、シートのリフレッシュということは、そのシートをコピーして、別のブックの新規のシートにペーストするしか、救済措置がない、ということになるのかもしれません。

バイナリ・エディタをもう少し自由に扱えれば、もっとはっきりしたことが言えると思いますが、見よう見真似のレベルですので、この程度の内容になってしまいます。

ご意見や反論もあるかもしれませんが、こんなところが、私の回答です。直接のご質問の解答にはならないかもしれませんが、内容的に、そう現実外れはしていないつもりでいます。
    • good
    • 0
この回答へのお礼

何度もありがとうございました。

> シートのリフレッシュということは、そのシートをコピーして、別のブックの新規のシートにペーストするしか、救済措置がない、ということになるのかもしれません。

どうもそのようですね。
一旦ブック保護を解除して、シートの必要データのみ転記させ、シートごと削除するような仕組みを考えてみます。

本当にありがとうございました。

お礼日時:2005/07/13 16:39

こんにちは。

KenKen_SP です。

下記のテストコードで実験してみました。
なお、テスト環境は 

 ・ Win98SE + Excel2002
 ・ Memory 192M
 ・ CPU C566MHz

の非力なノートPC です。

Sub Sample()

  Static cnt
  Dim i As Long

  Application.ScreenUpdating = False
  For j = 1 To 10
  For i = 1 To 65536
    With Cells(i, j)
      ActiveSheet.Shapes _
      .AddLine .Left + 6, .Top + 6, .Left + 20, .Top + 6
    End With
    cnt = cnt + 1
    Application.StatusBar = "SHAPE No. " & cnt
    DoEvents
  Next i, j

End Sub

結果としては、524,288 個まではシープの描写と名前についても正常
に動作しました。

例えば名前で 直線 1 とか 直線 524000 などで選択できること
も確認しています。

が、600,000 個を超えた辺りでエラーが発生し、Excel はそのまま
ダウンしてしまいました。

ダウンしたタイミングを見てなかったので、正確な所はわかりません。
この辺までくるとスクロールすらままならず、これ以上テストを継続
する気にはなれません。

その一方で 131,072 個で名前が破損し、シェープの追加に極端に時間
がかかるケースもありました。

グラフィックメモリも関係しているのかもしれません。

テストの方法によっても結果は違ってくるでしょうし、結局のところ
Wendy02 さんが言われるとおり、理論値が不明なので実測するのも
困難です。

中途半端かもしれませんが、以上報告でした。


あと、、聞いてもいいですか?
数万とかのシェープを使うケースってどんな場合なんでしょう?(^^)
    • good
    • 0
この回答へのお礼

くだらない質問につきあって、実験までしてくださいましてほんとうにありがとうございました。

> 数万とかのシェープを使うケースってどんな場合なんでしょう?(^^)

たとえば螺旋とか放物線を式で描画させる場合、短い直線の連続になります。
でも一度に数万にはなりませんよ~!
せいぜい多くとも500個くらいです。

ただ、番号は累積されていきますから、やがてはそうなるんじゃないかと心配したんです。

ありがとうございました。

お礼日時:2005/07/13 16:45

KenKen_SP さん、merlionXX さん、こんにちは。


Wendy02 です。

KenKen_SP さんの:
>数万とかのシェープを使うケースってどんな場合なんでしょう?(^^)

merlionXX さんとは事情が違うかもしれませんが、私が昨年作っていたものは、オートシェイプ自体は、一回に数百しか作りません。しかし、作成・削除をしたので、そのオートシェイプの内部カウンタが累積してしまい、そのマクロを使うたびに、1週間も経たずに、桁がどんどん増えていくのでした。それと共に表示が鈍くなっていくような気がしました。

オートシェイプで、時間単位を視覚化させる方法です。
グラフよりも、微妙な部分まで表示させるので良いと思いました。

いずれにしても、そういうコードの方法は、全面的に破棄し、表示-非表示の方法に切り替えることにしました。(結局、そのマクロの作成日数が掛かりすぎて、お蔵入りです。)

その時の失敗?から考えたのが、製作者側(私)によるオブジェクトの一意の名前による方法なんですね。だから、そのシートで使うオートシェイプの数量は、特別なことがない限り、増やさないのです。
    • good
    • 0
この回答へのお礼

何度もありがとうございます。
なるべくオートシェイプの数量は、特別なことがない限り、増やさないようにします。

お礼日時:2005/07/14 11:19

merlionXX さん、Wendy02 さん、こんにちは。



> 数万とかのシェープを使うケースってどんな場合なんでしょう?(^^)

私のくだらないご質問、、ご回答ありがとうございました。興味
深く読ませていただきました。

Excel は Biff フォーマットで記録されています。レコード単位
で比較し、解析してみました。スキル不足で、決定的な結論を導
くには至ってませんが、手がかりぐらいにはなるかもしれません。


・解析手順

1. 新規ブックを何もしないで保存
2. 1.に Shape を書き込み別名保存
3. 2.の Shape を削除し、新たに Shape を書き込み別名保存
  ---> Shape をカウントアップさせる
4. 3.を繰り返し、カウントアップされた何パターンかを用意
5. 1~4 のバイナリダンプを取る
6. Diff ツールで比較

・比較結果からの考察(...自信は全然ありませんが)

A)シェープを書き込むと以下4つのレコードが追加される
 ()はレコード番号。

 [MSODRAWINGGROUP] (&HEB)
 [MSODRAWING] (&HEC)
 [OBJ] (&H5D)
 [MSODRAWINGSELECTION] (&HED)

B)[MSODRAWINGGROUP]に Shape のカウンタがあると思われる。
  バイト数は4バイト、つまり、Long型の模様。つまり、
  Wendy02 さんのご推測どおり、理論的には約21億4700万
  までいけるかと、、

  次は SHAPE を6415個かいたブックのダンプリストです。
  0x00661C~0x00661D で上位と下位バイトをスワップさせる
  と &h1910 = 6416 です。1のズレがありますが、カウント
  の方法の違いによるものと思います。

  これが、Shape の内部カウンタだと思います。

00651: [MSODRAWINGGROUP](235)
00000 EB 00 8A 00 0F 00 00 F0 82 00 00 00 00 00 06 F0
00010 48 00 00 00 10 1D 00 00 08 00 00 00 10 19 00 00
00020 01 00 00 00 01 00 00 00 00 04 00 00 01 00 00 00
以下略...

C)[MSODRAWING] と [OBJ] レコードが Shape の数だけある
  それぞれに、Shape の名前が記録されている。

D)ブックの全てのオブジェクトを削除して、保存すると、
  A)の4つのレコードが削除される。

  つまり、ひとつ残らずオブジェクトをシートから削除し、
  保存すると A)のレコードが全て初期化されます。
  ポイントは保存時にこれが実行されるようです。

  ですから、保存前にひとつでもオブジェクトを追加すると
  A)のレコードのうち、[MSODRAWINGGROUP]レコードの
  カウント値が保持されたまま、保存されてしまいます。

  Shape の欠番発生の原因だと思います。

長文、すみません。
    • good
    • 0
この回答へのお礼

KenKen_SP さん、ここまでお調べいただき、感謝感激です。
わたしには難しすぎて理屈はぜんぜんわかりませんが、

> ひとつ残らずオブジェクトをシートから削除し、
> 保存すると A)のレコードが全て初期化されます。

これはわかりました。
テストして確認しました。開いたらShapeを一個も追加せず、そのシートだけじゃなくブック全体で全Shapeを削除し、保存したらカウントが1に戻りました。

そういう理解でいいんですね?

ありがとうございました。

お礼日時:2005/07/14 11:14

merlionXX さん、KenKen_SPさん、こんにちは。



KenKen_SPさん、詳しい説明ありがとうございます。
とても参考になりしまた。

>ひとつ残らずオブジェクトをシートから削除し、
>保存すると A)のレコードが全て初期化されます。
>ポイントは保存時にこれが実行されるようです。

この話は、最初に紹介した、Microsoft NewsGroup でも出ていましたが、私は、きちんと読んでいませんでした。

そのダンプは、どのようなツールをお使いになったのか、興味があるところです。もしかしたら、Biffフォーマットをダンプする専用ツールですか?(返事を付けなくても構いません。) また、ひとつ利口になった気がします。(^^;

merlionXXさん
merlionXXさんの#3 の「回答に対するお礼」の内容は、私の問題にしていた内容と良く似ていますね。オートシェイプの微妙な線の長さを、数値で表現できるというのが、メリットなんですが、その時は思ったようには行かなかったのです。その後の私の失敗で、どうも、デフォルトの色は黒であっても、それを使うにしても、大量に用いるときは、明示的に色指定したほうがよいようなんですね。

余談ですが、#1 の最初の書き込みの資料:
group.google.cojp:microsoft.public.excel.programming
直接アクセスすると、無駄なログが膨大になります。
    • good
    • 0

少しはずれるかもしれませんが、関連情報として非常に有益だと


思いますので、コメントさせて下さい。

> Biffフォーマットをダンプする専用ツールですか?

xldmp というツールを使いました。

xldmp は有限会社プレジャースカイ様がご提供くださっております
フリーソフトです。

http://www.pleasuresky.co.jp/

トップページ下部に本ツールへのリンクがあります。

Excel ブック(BIFFフォーマット)をレコード単位でダンプすること
ができる優れものです。

また、同ウェブサイト内には BIFF フォーマットに関する非常に有益
な情報があります。

http://www.pleasuresky.co.jp/insidexl.php3

ご参考までに。

参考URL:http://www.pleasuresky.co.jp/
    • good
    • 0

KenKen_SP 様



有力な情報ありがとうございました。早速、見させていただきました。
    • good
    • 0

merlionXX さん、KenKen_SP さん、こんにちは。



#8 の補足です。
実は、今回、ここのスレッドで学んだことを、以下のWordのオートシェイプのフリーズについて、応用し回答して、解決しました。本当に正しいかは分かりません。

http://oshiete1.goo.ne.jp/kotaeru.php3?q=1518507
[オートシェイプ・テキストボックスにテキストが入らなくなってしまいました。]

ただ、オートシェイプに限らず、Excel/Word はある種の脆弱性があるような気がします。昔のMS-DOSの表計算で、一太郎の専用ユーザーフォントやIBMの特殊フォントが起爆剤になって、ハングするという話がありました。一旦、表計算の中に取り込まれると、セル上からは取れないわけです。今回、ここのスレッドを学ぶ中で、未だに同じ現象がExcel上であることも知りました。

KenKen_SP さんの教えていただいた xlDump をもう少し勉強しないとはっきりしたことは言えませんが、何度も使っているとオートシェイプが現れなくなる現象や、そのWordのオートシェイプのフリーズについて直接ではないにしても、このツールによって解明できるかもしれませんね。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=1518507
    • good
    • 0
この回答へのお礼

お礼がおそくなりごめんなさい。

今回もた~くさんありがとうございました。
これからもよろしくお願いします。

お礼日時:2005/07/21 13:07

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