Назначение заголовков для кнопок управления динамическими формами на основе значения ячейки - PullRequest
0 голосов
/ 08 мая 2019

Я довольно новичок в Excel VBA, поэтому заранее прошу прощения, если что-то будет расплывчато. У меня есть код, который вставляет на листе «Обзор спроса» в столбец W определенное количество названий продуктов («Продукт X», «Продукт Y» и т. Д. .... количество продуктов динамически меняется от 1 до 100) всегда начинается в ячейке W2 и всегда пропускает одну ячейку между каждым продуктом (например, продукт X будет в W2, продукт Y в W4 и т. д.) То, что я хотел бы кодировать в VBA, это создать кнопку управления формой для каждого из названий продуктов и изменить их заголовок на название продуктов в столбце W. Я мог бы написать код для динамического создания столько кнопок управления формой, сколько названий продуктов в столбце W, однако я изо всех сил пытаюсь присвоить им заголовки, так как я всегда получаю ошибку: «Невозможно получить свойство Buttons объекта Рабочий лист класса "

Логика назначения будет состоять в том, что Кнопка 1 получит название продукта, расположенное в W2, Кнопка 2 получит название продукта, расположенное в W4 и т. Д.

Любая помощь будет принята с благодарностью! Заранее спасибо!

Sub AddInfo()


Dim butn As Button
Dim rng As Range
Dim trial As Range
Dim i As Integer

Sheets("Demand Overview").Select
Set rng = ActiveSheet.Range("S:S")
For Each trial In ActiveSheet.Range("W:W")

 If trial.Value <> "" Then Set butn = ActiveSheet.Buttons.Add(rng.Left, 
 trial.Top, 150, 26)

Next trial

'the code works until this point

With ActiveSheet
For i = 1 To 100
.Buttons("Button" & i).Caption = Range("W" & 2 * i)
 Next i
 End With

 End Sub

1 Ответ

1 голос
/ 08 мая 2019

Попробуй это.Думаю, что имеет больше смысла ссылаться на кнопку при ее создании, чтобы вы знали, что ссылаетесь на правильную.

Sub AddInfo()

Dim butn As Button
Dim rng As Range
Dim trial As Range
Dim i As Long

With Sheets("Demand Overview")
    Set rng = .Range("S:S")
    For Each trial In .Range("W:W")
        If trial.Value <> "" Then
            Set butn = .Buttons.Add(rng.Left, trial.Top, 150, 26)
            i = i + 1
            butn.Caption = .Range("W" & 2 * i).Value
        End If
    Next trial
End With

End Sub

Кстати, я бы не стал перебирать всю W, найдите последнийгрести и ограничивать цикл тем, что необходимо, а не миллионами строк.

...