Nano Hash - криптовалюты, майнинг, программирование

У меня проблема с созданием динамических опций (переключателей) в формах Excel VBA.

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

У меня есть форма с фиксированными кнопками дерева, принадлежащими Group1. С именем OptionButton2 в Optionbutton4. Я хочу создать один динамически созданный optionbutton с именем OptionButton1, также в Group1. Затем выберите одну из кнопок, значения должны быть записаны в ячейках. От OptionButton2 до OptionButton4 работает нормально, но не кнопка, созданная кодом. Кто-то с супермозгом, хотите мне помочь? (В финальном коде я создам цикл для создания множества кнопок)

Option Explicit
Dim opSel As String

Private Sub UserForm_initialize()
Dim OptionButton1 As Control
Set OptionButton1 = Controls.Add("Forms.OptionButton.1", "OptionButton1", True)
With OptionButton1
.Name = "OptionButton1"
.Caption = "OptionButton1"
.GroupName = "Group1"
.Value = 0
.Top = 5
.Left = 10
End With
End Sub

Private Sub OptionButton1_Click()
  opSel = OptionButton1.GroupName & " " & OptionButton1.Name
    Debug.Print "Selected button: " & opSel
    ThisWorkbook.Sheets("Blad1").Cells(1, 1).Value = "TEST-Button1"
End Sub

Private Sub OptionButton2_Click()
  opSel = OptionButton2.GroupName & " " & OptionButton2.Name
    Debug.Print "Selected button: " & opSel
    ThisWorkbook.Sheets("Blad1").Cells(2, 1).Value = "TEST-Button2"
End Sub

Private Sub OptionButton3_Click()
  opSel = OptionButton3.GroupName & " " & OptionButton3.Name
    Debug.Print "Selected button: " & opSel
    ThisWorkbook.Sheets("Blad1").Cells(3, 1).Value = "TEST-Button3"
End Sub

Private Sub OptionButton4_Click()
  opSel = OptionButton4.GroupName & " " & OptionButton4.Name
    Debug.Print "Selected button: " & opSel
    ThisWorkbook.Sheets("Blad1").Cells(4, 1).Value = "TEST-Button4"
End Sub


'Private Sub CommandButton1_Click()
'ThisWorkbook.Sheets("Blad1").Columns("A:A").Clear
'End Sub

  • При динамическом добавлении элементов управления наиболее гибким подходом является использование массива элементов управления, что избавляет вас от необходимости писать обработчики для каждого добавляемого элемента управления. См., например: siddharthrout.com/index.php /2018/01/15/vba-control-массивы 04.05.2021
  • Спасибо @Tim, ваш ответ дает мне подсказку, как это сделать, и теперь он работает как свечение. 17.05.2021

Ответы:


1

Мое решение, используемое в пользовательской форме шириной 1000: я использую TAG, чтобы поймать значение, которое я затем хочу использовать позже в модуле Class1. Отредактируйте то, что должно произойти в модуле class1. В моем окончательном решении я буду ловить и вводить значения в определенные ячейки Excel.

'In class1 module:
Option Explicit
Public WithEvents CmdEvents As MSForms.OptionButton
Private Sub CmdEvents_Click()
  Debug.Print Me.CmdEvents.Tag
End Sub

'In form code
Dim cmdArray_1_2() As New Class1
Dim cmdArray_2_1() As New Class1
Dim cmdArray_2_2() As New Class1
Dim cmdArray_3_1() As New Class1
Dim cmdArray_3_2() As New Class1

Dim rng As Range
Dim rcell As Range
Dim Offset
Dim CountRowLoop
Dim topval As String
Dim starttop
Dim offsetcell As String

starttop = 135
topval = 165
offsetcell = 135
CountRowLoop = 1

Set rng = ThisWorkbook.Sheets("Sheet1").Range("A1:A" & ThisWorkbook.Sheets("Sheet1").UsedRange.Rows.Count)
For Each rcell In rng.Cells

'--OptionButtonSection1----------------
Dim optArtStat1 As Control, optArtStat2 As Control
Set optArtStat1 = Controls.Add("Forms.OptionButton.1", "optArtStat1_" & CountRowLoop, True)
With optArtStat1
    .Name = "optArtStat1_" & CountRowLoop
    .GroupName = "optArtStat" & CountRowLoop
    .Caption = "Option 1_" & CountRowLoop
    .Tag = "TESTING Option:1 Button:1 Row:" & CountRowLoop
    .Left = 610
        If CountRowLoop = 1 Then
            .Top = starttop
        End If
            If CountRowLoop > 1 Then
            .Top = offsetcell
        End If
    End With
ReDim Preserve cmdArray_1_1(1 To CountRowLoop)
Set cmdArray_1_1(CountRowLoop).CmdEvents = optArtStat1
'--OptionButtonSection2----------------
Set optArtStat2 = Controls.Add("Forms.OptionButton.1", "optArtStat2_" & CountRowLoop, True)
With optArtStat2
    .Name = "optArtStat2_" & CountRowLoop
    .GroupName = "optArtStat" & CountRowLoop
    .Caption = "Option 1_2_" & CountRowLoop
    .Tag = "TESTING Option:1 Button:2 Row:" & CountRowLoop
    .Left = 610
        If CountRowLoop = 1 Then
            .Top = starttop + 15
        End If
            If CountRowLoop > 1 Then
            .Top = offsetcell + 15
        End If
    End With
ReDim Preserve cmdArray_1_2(1 To CountRowLoop)
Set cmdArray_1_2(CountRowLoop).CmdEvents = optArtStat2
17.05.2021
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..