電子書籍の厳選無料作品が豊富!

イベント内プログラムで以下のようにフォームのコントロールの削除を行っていますが、
コントロール名が条件に合っていても削除されません。
DeleteControlが失敗しているのではなく、 If Left(ctlSche.Name, 6) = "lblBox" Then にひっかからないようです。
しかも、同じように 頭に"lblBox"とつくラベルコントロールでも、ひっかかるものとそうでないものがあります。
以下のコーディングでは不十分でしょうか?

Dim ctlSche As Control

DoCmd.Close acForm, FName, acSaveYes
DoCmd.OpenForm FName, acDesign, , , , acHidden

Set ctlSche = CreateControl(FName, acLabel)
For Each ctlSche In Forms!TestForm.Controls
If Left(ctlSche.Name, 6) = "lblBox" Then
'コントロールの削除
DeleteControl FName, ctlSche.Name
End If
Next
DoCmd.Close acForm, FName, acSaveYes
DoCmd.OpenForm FName, acDesign, , , , acHidden

A 回答 (2件)

確認しながらやってみますか



テスト用の環境で確認していきます。
以下を標準モジュールに記述し、実行してみます。

Public Sub Sample()
  Dim ctl As Control
  Dim i As Long

  With CreateForm
    For i = 1 To 5
      With CreateControl(.Name, acLabel, acDetail, , , _
            567, 567 * i, 567 * 3, Int(567 * 0.5))
        .Name = "lblBox" & i
        .Caption = "lblBox" & i
      End With
    Next
    For Each ctl In .Controls
      Debug.Print ctl.Name
    Next
' ★ ~
    For Each ctl In .Controls
      Debug.Print "Del : ", ctl.Name
      If (Left(ctl.Name, 6) = "lblBox") Then
        DeleteControl .Name, ctl.Name
      End If
    Next
' ~ ★
  End With
End Sub


やっていることは、
新規フォームを作成し、
ラベルを5つ(lblBox1 ~ lblBox5)作成し、
' ★ ~ の前で、Controls 内のコントロール名をイミディエイトウィンドウへ表示
' ★ ~ ' ~ ★ 間で、削除してみる。

実行してみると、
新規フォームがデザインモードで、
ラベル「lblBox2」「lblBox4」が残った状態になります。

これは、削除した時に後ろで管理されているものが詰まってくるんですね。

削除前
(0) lblBox1
(1) lblBox2
(2) lblBox3
(3) lblBox4
(4) lblBox5

lblBox1 を削除すると、その時点で
(0) lblBox2
(1) lblBox3
(2) lblBox4
(3) lblBox5

になって、次のものを頂戴・・・ってなった時、今は(0) だったから (1) を・・・
データとしてみれば「lblBox2」を飛び越えて「lblBox3」が次のものになります。

なので、上記実行でラベル「lblBox2」「lblBox4」が残る説明がつきます。

前から処理して詰まるのであれば、詰まっても良いように後ろから処理する記述に変更します。

' ★ ~ ' ~ ★ 間の記述を以下に変更します。

    For i = .Controls.Count - 1 To 0 Step -1
      Debug.Print "Del2 : ", .Controls(i).Name
      If (Left(.Controls(i).Name, 6) = "lblBox") Then
        DeleteControl .Name, .Controls(i).Name
      End If
    Next


参考になる/ならない等、自己責任でお願いします。

解釈が違ってましたら、スルーしてください。


※ 何をしたい処理の記述なのか、ご質問内容からわかりませんでした。
ただ、フォーム名を「FName」で持っているのなら、
Forms!TestForm.Controls 部分の記述は Forms(FName).Controls
の方が良さそうでしたが・・・
(対象のフォームが一緒なら)
    • good
    • 0
この回答へのお礼

30246kikuさん

お返事どうもありがとうございます。
1つ削除した後に、直後のコントロールが飛ばされるというご説明、大変よくわかりました。
サンプルのコーディングに直したところ対象のものが全て削除できました。
ありがとうございました。

お礼日時:2011/07/26 19:57

> DeleteControlが失敗しているのではなく、


> If Left(ctlSche.Name, 6) = "lblBox" Then にひっかからないようです。
それなら
If Left(ctlSche.Name, 6) = "lblBox" Then
 ~
Else
 Debug.Print("『" & Left(ctlSche.Name, 6) & "』")
End If
みたいにするだけで何故ひっかからないか分かるのでは?
条件を満たしていないからひっかからないと思うべきでは?
テキストエディタにでも貼り付ければ、全角半角の違いや
スペースが入っていたりというケアレスミスの確認くらい
簡単でしょう?
そのくらいの確認は事前にして質問文で報告しておくように
してください。

私は
> DeleteControlが失敗しているのではなく、
> If Left(ctlSche.Name, 6) = "lblBox" Then にひっかからないようです。
ではなく
> For Each ctlSche In Forms!TestForm.Controls
で取れてきていないのでは?と考えますが。
For Each ctlSche In Forms!TestForm.Controls
 Debug.Print(ctlSche.Name)
Next
の実行結果は?
    • good
    • 0
この回答へのお礼

MARU4812さん

お返事どうもありがとうございました。
原因は、削除の際後ろからループさせなかったことが原因のようでした。

お礼日時:2011/07/26 20:00

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

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


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