[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『範囲内シェイプの削除でのエラー1004について』(なつ)
エラーになる時とならない時があり、VBA初心者の為、エラー特定の切り分けをしようにも知識が乏しく、切り分け方だけでもいいので、どなたかお助け頂けませんでしょうか。
実際の作業は簡略記載すると、
1,ボタン1押下でA3:F5結合セルに値を代入
2,ボタン2押下で範囲内(O11:T17)のシェイプを削除後、名前を付けて保存
ボタン2のシェイプ削除+保存動作でエラーが出る時があります。
該当部は、
Set rng = Range("O11:T17")
For Each shp In ActiveSheet.Shapes
If Not Intersect(Range(shp.TopLeftCell, shp.BottomRightCell), rng) Is Nothing Then
shp.Delete
End If
Next
を実行すると正常な時とエラーになる時があります。
エラーは「アプリケーション定義またはオブジェクト定義のエラーです:1004」
になります。
エラー箇所は「if Not~」の行で、
ステップインで確認すると、範囲内の最後のシェイプを全て削除した後、シェイプが無くなった後にNextに進まずエラーが表示されます。
エラーにならずnextに進める時もあります。
エラー時と、正常時の違いを切り分けてみたところ、
同シート内のA3:F5結合セルに入力規則でリスト選択できるセルがあるのですが、実行前にそのセルを一度でも選択した経緯があるとエラーが発生します。
入力規則の無い通常セル(ex.C10)などに、通常入力しただけでは発生せず、入力規則が絡んでいるのかもしれませんが、知識が無く詰まってしまいました。
<正常>
ボタン1押下後にそのままボタン2押下 or C10などA3:F5結合セル以外の他セルに手動入力後にボタン2押下は正常動作で保存できます。
<エラー>
ボタン1押下後にA3:F5結合セルを選択。リストの値を変更してもしなくても、一度でも結合セルを選択してしまうと、ボタン2押下後、先述エラーになります。
だったのですが、別ファイルでA3:F5セルを選択経緯を残した状態で上書き保存後に、実行すると毎回エラーが出るようになってしまいました。
A3:F5セル選択動作が悪さをしている気がするのですが、確定もできずお知恵を御貸し頂けないでしょうか。
< 使用 Excel:Excel2016、使用 OS:Windows10 >
入力規則のドロップダウンの▽ボタンもシェイプなのだが一度も使っていない場合には存在せず (ActiveSheet.Shapes.Countとしても数に入っていない) 一度でも表示させるとその時点で数に入ってくるようだ。 もっともそれが影響しているかどうか、影響しているとするとどう影響しているかは不明だが。 (ねむねむ) 2019/04/18(木) 13:16
試しに、まずA3:F5セルを触らずに、全セル選択後に入力規則を削除してから、A3:F5セルに手入力して、実行したところ、エラー発生しませんでした。
やはり入力規則絡み(ドロップダウン)辺りが影響しているとは思われるのですが、原因がわかりませんでした。
何か他に原因を特定していく方法などが思いつくようであれば教えて頂けましたら幸いです。
ありがとうございました。
(なつ) 2019/04/18(木) 18:07
sheet1のA1セルに入力規則を設定
sheet1のE3からJ11の範囲内にテキストボックス、四角、直線、イメージなどを適当に設置
sheet2のA1~A9に(テスト1~9)のリスト元データを入力
A1の入力規制設定
・入力値の種類=リスト
・元の値(OFFSET(sheet2!A$1,0,0,COUNTA(sheet2!A:A)-1,1)
VBA内容
Dim wb As Workbook
Dim rng As Range
Dim shp As Shape
Set wb = ThisWorkbook
wb.Worksheets("sheet1").Range("E3:J11").Select
If TypeName(Selection) <> "Range" Then Exit Sub For Each shp In ActiveSheet.Shapes Set rng = Range(shp.TopLeftCell, shp.BottomRightCell) If Not (Intersect(rng, Selection) Is Nothing) Then shp.Delete End If Next
MsgBox "OK"
End Sub
一度もA1セルを触らずに実行すると「OK」まで進みます。
一度でもA1セルを触ると、シェイプは全て削除されますが、forを抜けられずエラーになります。
どなたか原因お分かりになりませんでしょうか?
(なつ) 2019/04/18(木) 18:34
細かい部分はわかりませんが、
やはり、ドロップダウンが追加されている事で、eachのシェイプに含まれてしまい、
それがエラーの原因になっているようでした。
適切なやり方かはわかりませんが、
she.nameで"Drop Down"を除外する分岐を入れた事で正常に動作しました。
ねむねむ様のアドバイスのおかげで思いつけました。
ありがとうございました。
Sub テスト()
Dim wb2 As Workbook
Dim rng As Range
Dim shp As Shape
Set wb2 = ThisWorkbook
wb2.Worksheets("sheet1").Range("E3:J11").Select
If TypeName(Selection) <> "Range" Then Exit Sub
For Each shp In ActiveSheet.Shapes
If Left(shp.Name, 9) <> "Drop Down" Then
Set rng = Range(shp.TopLeftCell, shp.BottomRightCell)
If Not (Intersect(rng, Selection) Is Nothing) Then shp.Delete End If
End If
Next
MsgBox "OK"
End Sub
(なつ) 2019/04/18(木) 19:20
入力規則のドロップダウンオブジェクトは「TopLeftCell」の情報が持てないタイプなんだと思います。
なので、当該ドロップダウンは、この処理の対象外にすればいいと思います。
Dim rTest As Range For Each shp In ActiveSheet.Shapes
Set rTest = Nothing On Error Resume Next Set rTest = shp.TopLeftCell On Error GoTo 0
If Not rTest Is Nothing Then If Not Intersect(Range(shp.TopLeftCell, shp.BottomRightCell), Rng) Is Nothing Then shp.Delete End If End If Next
(半平太) 2019/04/18(木) 19:48
For Each shp In ActiveSheet.DrawingObjects If Not Intersect(Range(shp.TopLeftCell, shp.BottomRightCell), Rng) Is Nothing Then shp.Delete End If Next
(マナ) 2019/04/20(土) 13:26
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.