Создать функцию по имени объекта флажка («Динамически»)

1

У меня есть несколько флажков на листе, а на другом листе у меня есть форма. Когда флажок установлен, соответствующий контент будет добавлен в виде столбца в листе формы.

У меня более 500 флажков, поэтому я хочу создать простой способ сделать это. Например, у меня есть следующие флажки:

  • pROJECT_ID
  • Название Проекта
  • Project_Type
  • Статус проекта

Имя объекта этих флажков начинается с CB_ поэтому имя объекта флажка Project_Type CB_Project_Type,

Теперь я создал функцию для каждого флажка, когда на него нажимают. имя функции, например, Sub CB_Project_Type_Click() Затем функция проверит, существует ли этот столбец, и добавит его на лист формы.

Создание функции для всех флажков будет глупо. Я хочу динамический метод для этого. Примерно так: если установлен флажок «ЛЮБОЙ», используйте это имя объекта флажка, чтобы добавить столбец с соответствующим именем на листе формы.

Я сейчас использую вот что:

Sub CB_Projects_Type_Click()
    CB_List "Projects_Type"
End Sub

Sub CB_List(Name As String)
    If ActiveSheet.Shapes("CB_" & Name).ControlFormat.Value = 1 Then
        For i = 0 To 99
            If IsEmpty(Sheets("English").Range("B1").Offset(0, i)) Then
                Sheets("English").Columns(i + 2).Copy
                Sheets("English").Columns(i + 3).Insert
                Sheets("English").Range("B1").Offset(0, i).Value = Name
                i = 99
            End If
        Next i
    Else
        For i = 0 To 99
            If Sheets("English").Range("B1").Offset(0, i).Value = Name Then
                Sheets("English").Columns(i + 2).Delete
                i = 99
            End If
        Next i
    End If
End Sub

Итак, вы можете видеть, что по крайней мере я использую одну функцию, чтобы получить этот столбец из флажка, но мне все еще нужно создать Sub для каждого флажка. Как я могу использовать 1 конечную функцию, которая получит имя функции от имени объекта?

Надеюсь, мне было ясно.

SedoSan
источник

Ответы:

0

Прокрутите свои флажки, чтобы найти те, которые проверены.

For Each c in ActiveSheet.CheckBoxes
    If c.Value Then CB_List(c.Name)
Next c

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

Sub Button1_click()
    Dim c as Checkbox
    For Each c in ActiveSheet.CheckBoxes
        CB_List(c.Name)
    Next c
End Sub

Или вам, возможно, придется сделать:

Sub Button1_click()
    Dim c as OLEObject
    For Each c in ActiveSheet.OLEObjects
        CB_List(c.Name)
    Next c
End Sub

И измени эту строку:

ActiveSheet.Shapes("CB_" & Name).ControlFormat.Value = 1

к этому:

ActiveSheet.Shapes(Name).ControlFormat.Value = 1
Kyle
источник
Кайл, он говорит, что мне нужно 50 репутации, чтобы комментировать ваш комментарий, поэтому я не знаю, как правильно ответить ... Я попробовал то, что вы написали, но я получаю эту ошибку: «Ошибка компиляции: недопустимая внешняя процедура» Затем я попытался определить c как флажок, но это не помогло ...
SedoSan
@SedoSan см. Редактировать. Эта ошибка просто означает, что вы должны поместить код внутри Sub или Function.
Kyle