Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3514 / 13645 ツリー ←次へ | 前へ→

【61691】図形の削除で「メモリー不足」エラーになってしまう 始めたばかりの初心者 09/5/27(水) 21:45 質問[未読]
【61692】Re:図形の削除で「メモリー不足」エラーに... time 09/5/27(水) 22:18 発言[未読]
【61693】Re:図形の削除で「メモリー不足」エラーに... kanabun 09/5/27(水) 23:14 発言[未読]
【61701】Re:図形の削除で「メモリー不足」エラーに... 始めたばかりの初心者 09/5/28(木) 11:37 質問[未読]
【61711】Re:図形の削除で「メモリー不足」エラーに... time 09/5/28(木) 21:16 発言[未読]
【61720】Re:図形の削除で「メモリー不足」エラーに... 始めたばかりの初心者 09/5/29(金) 9:21 質問[未読]
【61721】Re:図形の削除で「メモリー不足」エラーに... time 09/5/29(金) 15:40 発言[未読]
【61724】Re:図形の削除で「メモリー不足」エラーに... kanabun 09/5/29(金) 21:57 発言[未読]
【61733】Re:図形の削除で「メモリー不足」エラーに... 始めたばかりの初心者 09/5/30(土) 12:32 お礼[未読]
【61746】Re:図形の削除で「メモリー不足」エラーに... time 09/5/31(日) 0:28 お礼[未読]

【61691】図形の削除で「メモリー不足」エラーにな...
質問  始めたばかりの初心者  - 09/5/27(水) 21:45 -

引用なし
パスワード
   また、解らない事があり質問に来ました、始めたばかりの初心者です。

複数のシートがあり、オートシェイプの図形をメモ代わりに挿入したまま
送ってくる事があり、削除のマクロを作りました。

Dim IX1 As Integer, IX2 As Integer, Shp As Shape
Sub Main()
  IX2 = Sheets.Count
  For IX1 = 1 To IX2
    Worksheets(IX1).Activate
    For Each Shp In ActiveSheet.Shapes
      If Shp.Name <> "" Then
       ActiveSheet.Shapes.SelectAll
       Selection.Delete
       Exit For
      End If
    Next
  Next
End Sub

これで、うまく削除できていたのですが、「実行時エラー'7'メモリが不足
しています。」とエラーになってしまうシートがありました。
他にもオートシェイプの図形が入っているシートもあったのですが、エラー
にはならず、図形の削除も出来ているものもありました。
そこで、エラーになったシートを1枚目に移動して、マクロを実行した処、
1枚目で同じエラーになりました。

デバックで、Shp.Nameの値や、エラーのステップを確認した処、
Shp.Name = "Drop Down1"
ActiveSheet.Shapes.SelectAll でエラーになっていました。
又、このシートを見た限り、オートシェイプの図形は無いように見え、
ツールバーの編集−ジャンプ−セル選択−オブジェクトでOKを押すと
「選択できるオブジェクトはありません」とエラーが表示されます。

自分なりに調べたのですが、原因や対処方法が解りません。
エラーの原因や対処方法を教えていただけないでしょうか。

【61692】Re:図形の削除で「メモリー不足」エラー...
発言  time  - 09/5/27(水) 22:18 -

引用なし
パスワード
   コメントがあるからでしょう。
コメントもshapeですが、
ツールバーの編集−ジャンプ−セル選択−オブジェクトでは捕捉されません。

対応策:
shp.Type が msoAutoShape のときだけ削除したらいいです。

【61693】Re:図形の削除で「メモリー不足」エラー...
発言  kanabun  - 09/5/27(水) 23:14 -

引用なし
パスワード
   コメントもShapeの一種だけど、
入力規則もリスト指定すると、ドロップダウン(フォーム
コントロール)追加され、これもShapeの仲間になります。
それを、
>       ActiveSheet.Shapes.SelectAll
>       Selection.Delete

で削除してしまうと、その後そのシートに、リスト指定の
入力規則を指定しても、正しく動作しないようです。

インデックス指定を名前指定にするとか、
ActiveSheet.DrawingObjects.Delete
などにすることはできないでしょうか?
もっとも、DrawingObjects には ActiveXのCommandButton が含まれる
そうなので、そういうコントロールがあるときは、
地道に、
>Shape.Type
でオートシェイプかどうか、確認しながら、削除することになるんでしょうね

【61701】Re:図形の削除で「メモリー不足」エラー...
質問  始めたばかりの初心者  - 09/5/28(木) 11:37 -

引用なし
パスワード
   timeさん、kanabunさん、レスありがとうございます。

 コメントがあった場合やリスト指定の入力規則を指定しても、正しく動作
しないとの事でしたので、以下のように変更しました。

Dim IX1 As Integer, IX2 As Integer, Last_Row As Long, Shp As Object
Sub Main()
  IX2 = Sheets.Count
  For IX1 = 1 To IX2
    Worksheets(IX1).Activate
    Last_Row = Cells.SpecialCells(xlLastCell).Row
    Range("A1:IV" & Last_Row).ClearComments
    For Each Shp In ActiveSheet.Shapes
      If Shp.Name <> "" Then
        Cells(1, 1) = Shp.Name
        ActiveSheet.DrawingObjects.Delete
        Exit For
      Else
        Cells(1, 1) = ""
      End If
    Next
  Next
End Sub

 削除出来るか確認の為、オートシェイプの図形を1つ挿入してShp.Nameの
値が解るようにして、マクロを実行した処、図形が削除され、A1欄は「Drop
Down 1」が表示されました。
 上書き保存した後、図形が無い場合でも問題ないか確認する為、マクロを
もう一度実行した処、図形は無いのにA1欄は「Drop Down 1」が表示されたま
まなってしまいます。
 これは、まだ何処かに図形が残っているという事なのでしょうか?

【61711】Re:図形の削除で「メモリー不足」エラー...
発言  time  - 09/5/28(木) 21:16 -

引用なし
パスワード
   ▼始めたばかりの初心者 さん:
> これは、まだ何処かに図形が残っているという事なのでしょうか?
オートフィルタとか。

普通の図形以外にも色々あると思いますよ。
shapeのTypeプロパティのヘルプにあるMsoShapeType クラスの定数を見ると、
shapeは結構範囲が広くて、なんとなく想像がつくものもあります。

【61720】Re:図形の削除で「メモリー不足」エラー...
質問  始めたばかりの初心者  - 09/5/29(金) 9:21 -

引用なし
パスワード
   ▼time さん:
レスありがとうございます。
shape.Typeで調べた処、「フォームコントロール」でした。
ただそのシートにはユーザーフォームは無く、ツール−マクロ−Visual Basic
Editorで見てもフォームはありませんでした。

そこで質問なのですが、ユーザーフォームが無くフォームコントロールだけが
残っている場合、フォームコントロールを削除する事は可能ですしょうか?
又、可能でしたら、方法を教えて下さい。

【61721】Re:図形の削除で「メモリー不足」エラー...
発言  time  - 09/5/29(金) 15:40 -

引用なし
パスワード
   >フォームコントロールを削除する事は可能ですしょうか?
shp.delete が基本です。

【61724】Re:図形の削除で「メモリー不足」エラー...
発言  kanabun  - 09/5/29(金) 21:57 -

引用なし
パスワード
   ▼始めたばかりの初心者 さん:
>shape.Typeで調べた処、「フォームコントロール」でした。
>ただそのシートにはユーザーフォームは無く、(中略)−Visual Basic
>Editorで見てもフォームはありませんでした。

その「フォームコントロール」というのは、シート上の(フォーム
ツールバーから貼り付けた)ボタンやチェックボックスやComboBox
のことで、UserFormとは何ら関係ありません。

試しに、以下の2つのコードを標準モジュールにコピペし、
--------------------------------------
Sub All_Shape()
 Dim shpType(-2 To 21) As String
 Dim i As Long
 
  shpType(-2) = "msoShapeTypeMixed"
  shpType(1) = "msoAutoShape"
  shpType(2) = "msoCallout"
  shpType(3) = "msoChart"
  shpType(4) = "msoComment"
  shpType(5) = "msoFreeform"
  shpType(6) = "msoGroup"
  shpType(7) = "msoEmbeddedOLEObject"
  shpType(8) = "msoFormControl"
  shpType(9) = "msoLine"
  shpType(10) = "msoLinkedOLEObject"
  shpType(11) = "msoLinkedPicture"
  shpType(12) = "msoOLEControlObject"
  shpType(13) = "msoPicture"
  shpType(14) = "(msoPlaceholder)"
  shpType(15) = "msoTextEffect"
  shpType(16) = "(msoMedia)"
  shpType(17) = "msoTextBox"
  shpType(18) = "msoScriptAnchor"
  shpType(19) = "msoTable"
  shpType(20) = "msoCanvas"
  shpType(21) = "msoDiagram"

 With ActiveSheet
   If .Shapes.Count > 0 Then
     Dim shp As Excel.Shape
     For Each shp In .Shapes
      i = i + 1
      Debug.Print "'("; i; ")"; """"; shp.Name; """"; _
            Tab(27); shpType(shp.Type)
     Next
   End If
 End With
End Sub
---------------------------------------------------
Sub All_DrawingObject()
 Dim obj, i As Long
 For Each obj In ActiveSheet.DrawingObjects
   i = i + 1
   Debug.Print "'("; i; ")"; """"; obj.Name; """"; _
         Tab(27); TypeName(obj)
 Next
End Sub
---------------------------------------------------

テスト用ダミーシートに AutoFilterがかけれるような簡単な表
を作成し、さらに
・コメント、
・入力規則(リストのもの)、
・フォームツールバーからButton, OptionButton, Spinner(スピンボタン)
  CheckBox, ListBoxなど、
・コントロールツールボックスから 同様のActiveXコントロール、
・さらに、「図形描画」ツールバーからテキストボックス、四角形
を貼り付け、この2つの図形には「あいうえお」など適当な文字列を
挿入しておき、
表にAutoFilterをかけ▼を表示して、さらに入力規則のあるセルを
選択し、ドロップダウン▼が表示された状態で、

> Sub All_Shape()
を実行してみてください。
これを実行すると、こちらのシートでは↓こうなりました。

'( 1 )"Comment 11"     msoComment   コメント
'( 2 )"Button 24"     msoFormControl フォーム
'( 3 )"Option Button 25"  msoFormControl フォーム
'( 4 )"Check Box 26"    msoFormControl フォーム
'( 5 )"Spinner 27"     msoFormControl フォーム
'( 6 )"List Box 28"    msoFormControl フォーム
'( 7 )"CommandButton1"   msoOLEControlObject
'( 8 )"OptionButton1"   msoOLEControlObject
'( 9 )"CheckBox1"     msoOLEControlObject
'( 10 )"SpinButton1"    msoOLEControlObject
'( 11 )"ComboBox1"     msoOLEControlObject
'( 12 )"Text Box 34"    msoTextBox   テキストボックス
'( 13 )"Rectangle 35"   msoAutoShape  テキストボックス
'( 14 )"Drop Down 57"   msoFormControl 入力規則の▼
'( 15 )"Drop Down 58"   msoFormControl AutoFilterの▼
'( 16 )"Drop Down 59"   msoFormControl
'( 17 )"Drop Down 60"   msoFormControl
'( 18 )"Drop Down 61"   msoFormControl
'( 19 )"Drop Down 62"   msoFormControl
'( 20 )"Drop Down 63"   msoFormControl
'( 21 )"Drop Down 64"   msoFormControl
'( 22 )"Drop Down 65"   msoFormControl
'( 23 )"Drop Down 66"   msoFormControl
'( 24 )"Drop Down 67"   msoFormControl

さらにそのままのシート状態(AutoFilterがかかっていて、入力規則の
▼が1か所表示された状態)で、2番目のプロシージャ
> Sub All_DrawingObject()
を実行してみてください。

こちらの例では、こうなりました。
'( 1 )"Button 24"     Button
'( 2 )"Option Button 25" OptionButton
'( 3 )"Check Box 26"   CheckBox
'( 4 )"Spinner 27"    Spinner
'( 5 )"List Box 28"    ListBox
'( 6 )"CommandButton1"  OLEObject
'( 7 )"OptionButton1"   OLEObject
'( 8 )"CheckBox1"     OLEObject
'( 9 )"SpinButton1"    OLEObject
'( 10 )"ComboBox1"    OLEObject
'( 11 )"Text Box 34"   TextBox
'( 12 )"Rectangle 35"   TextBox

2つの結果より明らかなように、
Shapes には シート内のAutoFilterのドロップダウンも、入力規則の
▼もふくめたすべての図形が含まれています。
そして、Shapesコレクションでは、入力規則の▼もAutoFilterの▼も
本来のフォームツールバーから貼り付けた「フォームコントロール」
たちと同じType名である「msoFormControl」という名前に分類されて
います。
他方の DrawingObjects のほうには
「入力規則」と「AutoFilter」のドロップダウン▼は含まれていません。
かつ、図形描画のテキストボックスも四角形も内部にテキストを挿入
しましたので、objectの種類は 両方とも「TextBox」となっています。

以上が、Shapesコレクションと DrawingObjectsコレクションのちがい
です。


>いる場合、フォームコントロールを削除する事は可能ですしょうか?
Shapesでループして、Typeが「msoFormControl」であるものを
すべて削除してしまうと、入力規則の▼とか AutoFilterのドロ
ップダウン▼までも削除することになるので、困ったことになり
ませんか?

> メモ代わりに挿入した
> オートシェイプの図形
だけを削除したいのなら、
--------------------------------------
dim ws as Worksheet
For each ws in ActiveWorkbook.Worksheets
  ws.TextBoxes.Delete
Next
--------------------------------------
くらいでどうでしょう?

【61733】Re:図形の削除で「メモリー不足」エラー...
お礼  始めたばかりの初心者  - 09/5/30(土) 12:32 -

引用なし
パスワード
   timeさん、kanabunさん、色々教えていただき、ありがとうございました。
とても勉強になりました。
メモ代わりのオートシェイプを削除が出来れば良いので、kanabunさんに
教えていただいた方法で削除したいと思います。
本当にありがとうございました。

【61746】Re:図形の削除で「メモリー不足」エラー...
お礼  time  - 09/5/31(日) 0:28 -

引用なし
パスワード
   kanabun さん 勉強になりました。ありがとうございました。

3514 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free