2010-11-26 16 views
0

J'utilise un morceau de code qui définit avec succès la couleur d'arrière-plan des contrôles sur un formulaire. Et j'utilise des bits similaires de code pour définir la couleur de fond des champs obligatoires etc ..Problème avec les sous-formulaires de feuille de données utilisant la récursivité pour définir les propriétés de contrôle dans le formulaire

Public Sub colCtrlNorm(frm As Form) 

Dim setColour As String 
setColour = RGB(252, 252, 252) 
Dim ctl As Control 
For Each ctl In frm.Controls 
    With ctl 
     If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or   ctl.ControlType = acListBox Then 
    ctl.BackColor = setColour 
    ElseIf ctl.ControlType = acSubform Then 
     colCtrlNorm frm(ctl.Name).Form 
    End If 
End With 
Next ctl 
Set ctl = Nothing 

End Sub 

Tout fonctionne très bien et dandy, sauf sur un formulaire qui contient un sous-formulaire qui a imbriqué fiche.

Lorsque piégeant l'erreur que je reçois le message d'erreur suivant:

Error 2455: You entered an expression that has an invalid reference to the property Form/Report 

J'apprécie je ne peux pas changer les commandes de fiche technique couleur de fond. Ce problème ne se pose qu'avec les fiches de données imbriquées. Quelqu'un a des idées sur la façon dont je peux éviter cela?

Merci d'avance pour toute assistance concernant ce problème.

Vive Noel

+1

Je devine ici (je posterais une réponse si je savais que c'était correct), mais je pense que vous devriez vérifier pour voir si le parent du contrôle de sous-formulaire est en feuille de données, et l'ignorer si. Une feuille de données est un formulaire, donc une sous-feuille de données est un sous-formulaire, mais celui qui est l'enfant d'un formulaire en mode Feuille de données. –

+0

@David Yep, ça marche en vérifiant si la vue par défaut est en tant que datasheet – noelmcg

Répondre

1

Vérifiez si le parent le contrôle de sous-formulaire est en mode Fiche technique et ignorez-le si c'est le cas. Une feuille de données est un formulaire, donc une sous-feuille de données est un sous-formulaire, mais celui qui est l'enfant d'un formulaire en mode Feuille de données. Utilisez la propriété .CurrentView du sous-formulaire.

Vous pouvez utiliser les constantes nommées qui font partie de la acCurrentView Enum:

acCurViewDatasheet = 2 
    acCurViewDesign = 0 
    acCurViewFormBrowse = 1 
    acCurViewPivotChart = 4 
    acCurViewPivotTable = 3 
    acCurViewPreview = 5 

De toute évidence, certaines personnes ne sont pas applicables aux formes, mais les rapports, mais ils continuent de fonctionner.

0

EDIT

obtenu ce travail en utilisant ce qui suit, ce qui évite subforms s'il vue defauly est fiche (2)

Public Sub colCtrlNorm(frm As Form) 

Dim setColour As String 
setColour = RGB(252, 252, 252) 
Dim ctl As Control 
For Each ctl In frm.Controls 
    With ctl 
     If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or   ctl.ControlType = acListBox Then 
    ctl.BackColor = setColour 
     ElseIf ctl.ControlType = acSubform Then 
      If ctl.Form.DefaultView <> 2 Then 
       colCtrlNorm frm(ctl.Name).Form 
      End If 
     End If 
    End With 
Next ctl 
Set ctl = Nothing 

End Sub 
+1

Je pense que vous voulez vérifier CurrentView, pas DefaultView, puisque la propriété sauvegardée peut être surchargée à l'exécution. –

+0

Acclamations David, a du sens. – noelmcg