Циклический просмотр имен элементов управления и скрытие всех элементов управления, которые содержат правильное число в кадре - PullRequest
0 голосов
/ 04 января 2019

То, что я пытаюсь сделать, - это пользовательская форма Word, если я выбираю число в поле со списком (cb_CountCohorts) (варианты 1-10), то любой элемент управления (кнопка опции или текстовое поле, которое содержит это число +1 (такесли я выберу 5, те элементы управления, которые имеют 6-10), не будут видны.

С учетом сказанного я заставил его работать, но я знаю, что он неэффективен.
Ниже приведенначинаю, но я понимаю, что для каждого случая должно быть еще 10 наборов того, что вы видите ниже, раз 10 различных операторов If. Есть ли способ сказать что-то вроде if cb_Countcohrts = "1" найти все элементы управления в этом кадре, которые несодержат когорту 1 и скрывают ее ... если cb_countcohorts = "5", то скрыть все, что содержит когорту 6, 7, 8, 9, 10? Заранее спасибо за помощь и помощь

Private Sub cb_CountCohorts_Change()

If cb_CountCohorts = "1" Then
txt_cohort1.Visible = True
txt_cohort2.Visible = False
txt_cohort3.Visible = False
txt_cohort4.Visible = False
txt_cohort5.Visible = False
txt_cohort6.Visible = False
txt_cohort7.Visible = False
txt_cohort8.Visible = False
txt_cohort9.Visible = False
txt_cohort10.Visible = False

Я пыталсяэто тоже, но не похоже, что я хочу либо

Private Sub cb_CountCohorts_Change()
  For i = 2 To 10
  Set VarText = frm_master.Controls("txt_cohort" & i)
  If cb_CountCohorts.Value > VarText.Value Then
    VarText.Visible = False
  End If
  Next i
End Sub

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Примерно так:

Private Sub cb_CountCohorts_Change()
    Dim v As Long, i As Long

    v = CLng(cb_CountCohorts.Value)
    For i = 2 To 10
        Me.Controls("txt_cohort" & i).Visible = (i <= v)
        'any other controls here....
    Next i

End Sub

Если вы хотите что-то общее для всех элементов управления (при условии согласованного соглашения об именах) -

Private Sub cb_CountCohorts_Change()
    Dim v As Long, c, i As Long, arr

    v = CLng(cb_CountCohorts.Value)

    For Each c In Me.Controls
        If c.Name Like "txt_cohort#*" Then
            arr = Split(c.Name, "_")
            i = CLng(Replace(arr(1), "txt_cohort", ""))
            c.Visible = (i <= v)
        End If
    Next c
End Sub

... в основном расширено по предложению Роберта

0 голосов
/ 04 января 2019

Не проверено, но это должно работать:

Dim c As Control

For Each c In Me.Controls
    If InStr(TypeName(c),"cohort") Then
        c.Visible = False
    End If
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...