Ms access 从自定义集合复制FormatCondition对象

Ms access 从自定义集合复制FormatCondition对象,ms-access,vba,Ms Access,Vba,我知道我可能想做些不正常的事。我需要保存(和删除)控件FormatConditions集合中的所有FormatCondition对象。然后,我需要重新创建/重新应用这些相同的FormatCondition对象到同一个控件 看起来我可以成功地复制它们,但当我尝试从我自己的集合对象重新应用这些相同的FormatCondition对象时,会出现错误。我怀疑这里发生的事情是,我实际上并没有像我想象的那样复制SaveAndDelete例程中的对象。如果是这样的话,我如何才能真正克隆这些对象,使它们在运行f

我知道我可能想做些不正常的事。我需要保存(和删除)控件FormatConditions集合中的所有FormatCondition对象。然后,我需要重新创建/重新应用这些相同的FormatCondition对象到同一个控件

看起来我可以成功地复制它们,但当我尝试从我自己的集合对象重新应用这些相同的FormatCondition对象时,会出现错误。我怀疑这里发生的事情是,我实际上并没有像我想象的那样复制SaveAndDelete例程中的对象。如果是这样的话,我如何才能真正克隆这些对象,使它们在运行f.Delete之后保持不变

Private SavedFC As New Collection

Private Sub SaveAndDeleteFormatConditions(c as Control)
    Dim f As FormatCondition
    For Each f In c.FormatConditions
        SavedFC.Add f
        f.Delete
    Next
End Sub

Private Sub RecreateFormatConditions(c as control)
    Dim i As Integer
    i = 1
    If SavedFC.Count > 0 Then
        Dim f1 As FormatCondition, f2 As FormatCondition
        For Each f1 In SavedFC

            'Error 2467 occurs here: The expression you entered refers to an object that is closed or doesn't exist
            Set f2 = c.FormatConditions.Add(f1.Type, f1.Operator, f1.Expression1, f1.Expression2)
            With f2
                .BackColor = f1.BackColor
                .FontBold = f1.FontBold
                .FontItalic = f1.FontItalic
                .FontUnderline = f1.FontUnderline
                .ForeColor = f1.ForeColor
            End With
            SavedFC(i).Delete
            i = i + 1
        Next
    End If
End Sub

该行导致以下问题:

f.Delete

这里发生的事情是向集合中添加一个项(它是一个对象,因此使用引用进行操作)。然后,删除对象本身。现在,您有了一组指向已删除/不存在对象的指针。这就是为什么以后会出现2467错误。

这一行导致问题:

f.Delete

这里发生的事情是向集合中添加一个项(它是一个对象,因此使用引用进行操作)。然后,删除对象本身。现在,您有了一组指向已删除/不存在对象的指针。这就是为什么以后会出现2467个错误。

您刚刚证实了我的怀疑。你能回答我问题的主要部分吗:如果是这样的话,我如何才能真正克隆这些对象,使它们在运行f.Delete后保持不变?一种可能的方法是定义一个单独的对象(类模块)来保存格式化并填充这些格式化的集合。你可以从这里得到一些想法:你刚刚证实了我的怀疑。你能回答我问题的主要部分吗:如果是这样的话,我如何才能真正克隆这些对象,使它们在运行f.Delete后保持不变?一种可能的方法是定义一个单独的对象(类模块)来保存格式化并填充这些格式化的集合。你可以从这里得到一些想法:出于好奇,为什么你选择在你的
For
循环中删除你正在迭代的对象?我也这么做了,但我对潜在的异常情况有点偏执,我更喜欢在循环后删除或设置为
无。太糟糕了,Access似乎没有与
.ClearFormats
等效的内容,但我可能错了。只是出于好奇,为什么选择在
循环中删除您正在迭代的对象的
?我也这么做了,但我对潜在的异常情况有点偏执,我更喜欢在循环后删除或设置为
无。很糟糕,Access似乎没有与
.ClearFormats
等效的版本,但我可能错了。