2010-07-27 4 views
7

내 질문의 제목에서 알 수 있듯이 하위 폼을 포함하여 양식의 모든 컨트롤을 반복 할 수 있습니까? 예를 들어하위 폼의 컨트롤을 포함하여 폼의 모든 컨트롤을 반복하는 방법 - Access 2007

나는이

Public Sub colCtrlReq(frm As Form) 
' Sets background color for required field -> Tag = * 
Dim setColour As String 
setColour = RGB(255, 244, 164) 
Dim ctl As Control 
For Each ctl In frm.Controls 
     If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acListBox Then 
      If InStr(1, ctl.Tag, "*") <> 0 Then 
       ctl.BackColor = setColour 
      End If 
     End If 
Next ctl 
Set ctl = Nothing 
End Sub 

방법 하위 폼의 컨트롤을 잡기 위해이를 변화시키는 태그 *와 컨트롤의 배경 색상을 설정하는 서브 루틴 아래에 사용할 수 있습니까? 도움이나 조언을 미리 보내 주셔서 감사합니다.

건배 노엘

+0

기타를 사용할 수 있습니다 우리의 질문에 대답했다,하지만 당신은 정말이를 변경해야합니다. 폼의 기본 컬렉션은 실제로 Controls 및 Fields 컬렉션의 합집합이므로 작성한 내용으로 인해 예기치 않은 결과가 발생할 수 있습니다. –

+0

건배 데이빗 덕분에 조언을 위의 코드를 수정했습니다. – noelmcg

+0

덧글 ** "For Each ctl In frm"** - Access 2010에서이 문제를 재현 할 수 없습니다. – Fionnuala

답변

12

당신은 재귀에게

Public Sub colCtrlReq(frm As Form) 
'' Sets background color for required field -> Tag = * 
Dim setColour As String 
setColour = RGB(255, 244, 164) 
Dim ctl As Control 
For Each ctl In frm 
     If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox _ 
      Or ctl.ControlType = acListBox Then 
      If InStr(1, ctl.Tag, "*") <> 0 Then 
       ctl.BackColor = setColour 
      End If 
     ElseIf ctl.ControlType = acSubform Then 
      colCtrlReq frm(ctl.Name).Form 

     End If 
Next ctl 
Set ctl = Nothing 
End Sub 
+0

레무 (Remou) 좋은데, 내가 쓴 기술과 똑같아 보인다. – noelmcg

+0

@Remou는 [이 목적을 달성했습니다.] (http://stackoverflow.com/a/14415188/1389394)? :-) – bonCodigo

+0

좋은 답변입니다. 나는 당신이'frm (ctl.Name) .Form'을'ctl.Form' (Access 2016에서 확인)으로 간소화 할 수 있다는 것을 알아 챘습니다. – MarredCheese

1

액세스 하위 폼 컨트롤의 양식 속성의 Controls 컬렉션.

하위 폼 컨트롤의 이름이 저장된 폼 개체의 이름과 다를 수 있습니다.

하위 폼 제어이 SubformControlName라는, 여기에서 시작 :

For Each ctl In frm!SubformControlName.Form.Controls 
    Debug.Print ctl.Name 
Next 

업데이트을 : 귀하의 코멘트에서, 여기 당신이 찾고있는 내가 무슨 생각입니다.

하위 폼 컨트롤의 이름을 미리 모르는 경우 런타임에 하위 폼 컨트롤 인 양식 컨트롤을 식별 할 수 있습니다. 에 "frm.Controls에서 각 CTL은"- "FRM에서 각 CTL를 들어"

For Each ctl In frm.Controls 
    If TypeName(ctl) = "SubForm" Then 
     Debug.Print ctl.Name & " is a SubForm" 
     For Each ctlSub in ctl.Form.Controls 
      Debug.Print ctlSub.Name 
     Next 
    End If 
Next 
+2

건배. 폼에 하위 폼의 이름 (아마도 이름)이 없다면 어떻게 컨트롤을 반복 할 수 있습니까? – noelmcg

관련 문제