Option Explicit Private marrTypeName() As String Private marrCount() As Integer Private Sub Command1_Click() Dim ctlX As Control Dim intI As Integer Erase marrTypeName Erase marrCount For Each ctlX In Me.Controls intI = AScan(marrTypeName, TypeName(ctlX)) If intI < 0 Then intI = ArrayAdd(marrTypeName, TypeName(ctlX)) Call ArrayAdd(marrCount, 0) End If marrCount(intI) = marrCount(intI) + 1 Next For intI = LBound(marrTypeName) To UBound(marrTypeName) MsgBox marrTypeName(intI) & ": " & marrCount(intI) Next intI End Sub Public Function ArrayAdd(ByRef parrTableau As Variant, _ ByVal pvarValue As Variant, _ Optional ByVal pblnPreserve As Boolean = True _ ) As Integer Dim intI As Integer On Error Resume Next intI = UBound(parrTableau) + 1 If Err.Number <> 0 Then intI = 0 On Error GoTo 0 If pblnPreserve Then ReDim Preserve parrTableau(intI) Else ReDim parrTableau(intI) End If parrTableau(intI) = pvarValue ArrayAdd = intI End Function Public Function AScan(ByVal parrTableau As Variant, _ ByVal pstrText As String) As Integer Dim intI As Integer Dim strElement As Variant AScan = -1 On Error Resume Next intI = UBound(parrTableau) If Err.Number <> 0 Then Exit Function On Error GoTo 0 intI = 0 For Each strElement In parrTableau If UCase$(Trim$(strElement)) = UCase$(Trim$(pstrText)) Then AScan = intI Exit Function End If intI = intI + 1 Next End Function>hi to all