- ベストアンサー
コントロールを削除すると、一つ飛ぶアクセス
- フォーム上のイメージを削除すると、コントロールが一つ飛ばされます。イメージ0、イメージ2、イメージ4の順になり、1、3、5が飛ばされます。
- 通常、For Each ctl In Forms(FormName).Controlsを使用してコントロールを削除しても、値が飛ばされることはありません。ただし、DeleteControl FormName, ctl.Nameが原因である可能性があります。
- 全ての「イメージ」で始まるコントロールを削除するには、適切なコードを使用する必要があります。具体的なコードは提供されていません。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>部分は対象外を False にするように、 >ctl.InSelection = ctl.Name Like "イメージ*" >の方が良さそうです。(余計なお世話かも・・・) 決して余計なお世話では御座いませぬ。 フォームをデザインビューで開いておいて イメージ* 以外の適当なコントロールを選択しときます。 イミディエイトウィンドウで Docmd.openform フォーム名 ,Acdesign とすると エラーもなく『コントロールは選択状態のまま』です。 この状態で、うっかり前回回答のコードを走らせると あっれー アレも一緒に消えちまっただよ・・・ と私ならやりかねません。。。
その他の回答 (3)
- 30246kiku
- ベストアンサー率73% (370/504)
#1です ダブっても良いと思います。 ごめんなさい と言われるほどのものではないと思います。 理解しやすい参考にしたい書き方ですし、追加情報もありますし・・・・ (中には、既出回答をまとめただけの人もいるようですけど) 気になったところを少し 以下は参照先のコードになりますが For Each ctl In .Controls Debug.Print "Del : ", ctl.Name If (Left(ctl.Name, 6) = "lblBox") Then DeleteControl .Name, ctl.Name End If Debug.Print "After Del : ", ctl.Name ' ★ Next 上記にしてやってみると、★部分では実行時エラー5 になってしまいますね。 削除したらその ctl は使えないってことで・・・ なお、 > If ctl.Name Like "イメージ*" Then > ctl.InSelection = True > End If 部分は対象外を False にするように、 ctl.InSelection = ctl.Name Like "イメージ*" の方が良さそうです。(余計なお世話かも・・・)
お礼
ありがとうございました。
- nicotinism
- ベストアンサー率70% (1019/1452)
>なぜ飛ばされちゃうのでしょうか? 簡単な例で説明すると 1・2・3・4 とコントロールが有ったとします。 1~4はコントロール名です。 2と3が該当するコントロール名だとします。 For Each で 2に来ます。 2が該当するので削除されます。 2が無くなったので、VBAの参照する現在位置が3に移動します。 3 は If ・・・で チェックされないまま Next で位置が3から4へ、 結果 3は削除されません。 飛び飛びになるのはこの理屈です。 なので、常套手段は、最後からのチェックです。 これなら前に詰められても影響を受けません。 Sub yy() Dim ctl As Control Dim FormName As String Dim i As Integer FormName = "フォーム2" DoCmd.OpenForm FormName, acDesign For i = Forms(FormName).Controls.Count - 1 To 0 Step -1 If Forms(FormName).Controls(i).Name Like "イメージ*" Then DeleteControl FormName, Forms(FormName).Controls(i).Name End If Next End Sub For Each で廻したい時は選択状態にしておいて一挙に削除・・でも良いかも。 Sub y() Dim ctl As Control DoCmd.OpenForm "フォーム2", acDesign For Each ctl In Forms!フォーム2.Controls If ctl.Name Like "イメージ*" Then ctl.InSelection = True End If Next Stop 'フォームを見てみて DoCmd.RunCommand acCmdDelete End Sub 追伸 30246kiku さんと激しくダブってしまいました せっかく書いたので載せてしまいます。 30246kiku さん ごめんなさい <m(__)m> ・・・ってこの追伸部分、また削除されてしまうのだろうか? 削除される前に目にとめてもらえる事を切望。
お礼
なるほど。理由が納得しました。 fornextでループすればわかりやすいですね。 しっかり目にとめました!前回もご回答いただきありがとうございました。
- 30246kiku
- ベストアンサー率73% (370/504)
Access2007 コントロールの削除 http://okwave.jp/qa/q6900623.html 上記は参考になりませんか
お礼
参考にします ありがとうございました。
お礼
ありがとうございました。