2016-08-22 2 views
0

Я пытаюсь создать переменную для флажков на моем листе, чтобы я мог отложить большее число из них в цикле.Ссылка на элемент управления Active-x с переменной в цикле

Это выглядит следующим образом: The worksheet

Цель состоит в том, чтобы сделать график (синий фон) в состоянии выделить имена, выбранные с флажками (слева в зеленом списке).

Чтобы сделать это, я хотел бы, чтобы цикл прошел через все эти флажки и посмотрел, верны ли они для соответствующего имени в той же строке. Я получил это далеко:

Sub Test_ReplaceWithArray() 

'State var 
Dim Names(54) As String 
Dim ChkBx As String 
Dim Personal As Range 
Dim n, m, i, j, ChkNr, numOfEmployees, numOfWeeks As Integer 


    'Set var 
    Set Personal = Range("A3:A55") 
    numOfEmployees = Application.WorksheetFunction.CountA(Personal) 
    numOfWeeks = Worksheets("Schemaläggning").numOfWeeksBox.Value 
    n = 1 
    m = 3 
    i = 3 
    j = 3 
    ChkNr = 1 
    ChkBx = ("CheckBox" & ChkNr) 

'Fill array 
    Do Until n > numOfEmployees 
     Cells(i, 1).Select 
      If IsEmpty(ActiveCell) = False _ 
      And ChkBx = True Then 
      Names(n) = ActiveCell.Value 
      i = i + 1 
      n = n + 1 
      ChkNr = ChkNr + 1 
     ElseIf IsEmpty(ActiveCell) = True Then 
      i = i + 1 
      n = n + 1 
      ChkNr = ChkNr + 1 
     End If 
Loop 

'Make Bold or Grey if in array 
    Do Until m > numOfWeeks + 2 
     Cells(m, j).Select 
      If j <= 7 And IsInArray(ActiveCell.Value, Names) = True Then 
        Selection.Font.Bold = True 
        j = j + 1 
      ElseIf j <= 7 And IsInArray(ActiveCell.Value, Names) = False Then 
        With Selection.Font 
         .ThemeColor = xlThemeColorDark1 
         .TintAndShade = -0.349986266670736 
        End With 
        j = j + 1 
      ElseIf j = 8 Then 
        j = 3 
        m = m + 1 
      End If 
Loop 

End Sub 

Дело в том, чтобы иметь название на строке (в зеленом списке) поместить в массив, а затем посмотреть на каждое имя в расписании. Если имя в ячейке расписания содержится внутри массива, имя будет выделено, но если оно не будет, оно станет серым. Я уже сделал функцию сравнения, чтобы узнать, содержатся ли имена в массиве, который работает (протестировал его, прежде чем продолжить ссылки на флажки).

Но я получаю сообщение об ошибке выполнения 13 по адресу:

 If IsEmpty(ActiveCell) = False _ 
     And ChkBx = True Then 

я определенно подозреваю, что я не знаю, как ссылаться на элемент управления должным образом, но я не знаю, что делать. Любая помощь приветствуется.

ответ

0
Dim cCont As Control 

For Each cCont In Me.Controls 
    If TypeName(cCont) = "CheckBox" Then 
     cCont.Value = False 
    End If 
Next cCont 

Это образец того, что я использую для циклического управления всеми элементами управления в пользовательской форме. Надеюсь, вы сможете приспособить его к вашим потребностям.

для электронных таблиц объектов:

Sub LoopListBoxes() 
Dim OleObj As OLEObject 

For Each OleObj In ActiveSheet.OLEObjects 
    If OleObj.progID = "Forms.ListBox.1" Then 
     MsgBox OleObj.Object.ListCount 
    End If 
Next OleObj 
End Sub 

CheckBox = Forms.CheckBox.1 
ComboBox = Forms.ComboBox.1 
CommandButton = Forms.CommandButton.1 
Frame = Forms.Frame.1 
Image = Forms.Image.1 
Label = Forms.Label.1 
ListBox = Forms.ListBox.1 
MultiPage = Forms.MultiPage.1 
OptionButton = Forms.OptionButton.1 
ScrollBar = Forms.ScrollBar.1 
SpinButton = Forms.SpinButton.1 
TabStrip = Forms.TabStrip.1 
TextBox = Forms.TextBox.1 
ToggleButton = Forms.ToggleButton.1 

заимствованы из:

http://www.ozgrid.com/forum/showthread.php?t=61068

+0

Привет спасибо за ответ. Я думаю, что мне нужен только способ привязать флажок внутри модуля. Одна из проблем заключается в том, что если я собираюсь пройти через все элементы управления, мне нужно пройти через множество элементов управления, которые мне не нужны. И мне нужно связать элемент управления с листом excel, чтобы он не работал с ссылкой на пользовательскую форму, которую я боюсь. Так что это действительно не работало для меня, если я ничего не пропустил. Не могли бы вы сделать что-то подобное? Dim ChkBx As MSForms.CheckBox Рабочие листы ("Schemaläggning"). ChkBx (n) .Value = True –

+0

@HampusKjellstrand см. В редакторе –

Смежные вопросы