アプリ版:「スタンプのみでお礼する」機能のリリースについて

EXCEL2000 VBAの初心者です。

エクセル表の数字(位置座標や大きさ)に従い、数十個のオートシェイプの丸や四角を、何度も配置・消去させるプログラムを作っています。

一度に多くのオブジェクトを配置・消去しているので、自動発生するオブジェクトの番号が、現在20000程度になっています。
現状では問題ないのですが、自動発生番号に限りがあるとエラーが出ると思います。そこで、
 1.オブジェクトの自動発生番号には限りがあるのか、
 2.オブジェクトの発生番号を1にリセットすることは出来るのか。
を教えていただきたく、よろしくお願いいたします。

A 回答 (1件)

こんにちは。



下記はあくまで「オブジェクトの自動発生番号」についての記述であり、
シートにその数だけオブジェクトを挿入できるかは問題にしてません。

■ Q1.オブジェクトの自動発生番号には限りがあるのか

多分ありますが、正しいところはよく分かりません。以前調べた限り
では、シェープの内部カウンタは 32 ビット整数の範囲で有効である
ように見えました。
下記のようなテストコードを走らせても、16 ビット整数の範囲は軽く
クリアしますし、100万を越えても問題はありませんでした。

32 ビット整数の範囲で有効と仮定するなら、理論的には数億になっても
大丈夫なはずですし、実務的には事実上「無制限」と言って差し支え
ないように思います。

Sub Sample()
  Dim i As Long
  On Error GoTo Err_
  Application.ScreenUpdating = False
  Do
    With ActiveSheet.Shapes.AddLine(0, 0, 0, 0)
      Application.StatusBar = "SHAPE " & .Name
      .Delete
    End With
    DoEvents
  Loop
  Exit Sub
Err_:
  MsgBox "Stop."
End Sub

■ 2.オブジェクトの発生番号を1にリセットすることは出来るのか

できます。

<< 方法1 >>
  1. シート上のオブジェクトを全て削除
  2. ブックを保存

<< 方法2 >>
  現在のシートを新規シートにコピーする

の2つの方法です。

方法1 については、「ブックの保存」というのがポイントです。この
タイミングでオブジェクトの内部カウンタがクリアされます。
ですから、全オブジェクトを削除しても、保存前に何らかのオブジェクト
を追加してしまうと、シェープの内部カウンタがそのまま残ってしまい
ますのでリセットされません。

方法2 については、新規シートへコピーする際に内部カウンタが再構成
されるようです。

余談ですが、オブジェクトの内部カウンタはシート単位でもっています。

■ 参考

オブジェクトの内部カウンタについてオフィシャルな資料を見つけること
はできませんでした。

Excel のファイル形式は一般に Biff フォーマットと呼ばれるものですが、
これをバイナリレベルで見ていくと、シェープ等のオブジェクトをシート
に挿入すると以下4つのレコードが追加されるのを確認しました。

 注)()内はレコード番号
 [MSODRAWINGGROUP] (&HEB)
 [MSODRAWING] (&HEC)
 [OBJ] (&H5D)
 [MSODRAWINGSELECTION] (&HED)

オブジェジェクト1つの場合、2つの場合...のように何パターンか作成し、
これらのレコードがどのように変化するのかをトレースする。
その結果が本回答の根拠です。推測の域はでませんが、参考にはなるかと。
    • good
    • 10
この回答へのお礼

KenKen_SPさま

ていねいなご回答ありがとうございました。
とても助かりました。

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

お礼日時:2008/04/05 21:37

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

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


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