о многостраничности: если не все страницы имеют ввод, commandbuttom2 отключен - PullRequest
0 голосов
/ 15 декабря 2018

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

'Button accepting how many number of pages
Private Sub CommandButton1_Click()

RowChar = 70
MultiPage1.Pages.Clear

For i = 0 To TextBox1.Value - 1
    MultiPage1.Pages.Add
    MultiPage1.Pages(i).Caption = "Variable" & i + 1

    Call LabelPerPage

    Set txtbx = UserForm1.MultiPage1.Pages(i).Controls.Add("Forms.TextBox.1", "NameBox")
    With txtbx
        .Top = 20
        .Left = 100
    End With

    Set txtbx = UserForm1.MultiPage1.Pages(i).Controls.Add("Forms.TextBox.1", "MinBox")
    With txtbx
        .Top = 50
        .Left = 100
    End With

    Set txtbx = UserForm1.MultiPage1.Pages(i).Controls.Add("Forms.TextBox.1", "LsbBox")
    With txtbx
        .Top = 20
        .Left = 300
    End With

    Set txtbx = UserForm1.MultiPage1.Pages(i).Controls.Add("Forms.TextBox.1", "Mataas")
    With txtbx
        .Top = 50
        .Left = 300
    End With

    If i = 0 Then
        FormulaString = "= C15"
    Else
        FormulaString = FormulaString & "  " & Chr(RowChar) & "15"
        RowChar = RowChar + 3
    End If

Next i
TextBox2.Value = FormulaString
End Sub

Проблема: я хочу отключить commandbutton2 (кнопка для вычисления MINbox и MAxbox), если все текстовые полявнутри каждой страницы пусто.У вас есть ИДЕЯ как я могу это сделать?Спасибо.

Ответы [ 3 ]

0 голосов
/ 15 декабря 2018

Вы можете циклически проходить по каждому листу в своей книге, а по каждому листу - проходить по всем объектам OLEO.Вы проверите имя типа .Object и проведете там последние тесты.

Я бы создал функцию, которую вы можете легко вызвать, чтобы выполнить эту проверку, и вернет логическое значение True / False.

Function allTextboxEmpty() As Boolean

    Dim oleObj As OLEObject, ws As Worksheet
    allTextboxEmpty = True

    For Each ws In ThisWorkbook.Worksheets
        For Each oleObj In ws.OLEObjects
            If TypeName(oleObj.Object) = "TextBox" Then
                If oleObj.Object.Value <> vbNullString Then
                    allTextboxEmpty = False
                    Exit Function
                End If
            End If
        Next oleObj
    Next ws

End Function

Если вышеуказанная функция возвращает True, то вы знаете, что все ваши текстовые поля в книге пусты.Вы можете использовать эту функцию, как показано в следующем примере:

If allTextboxEmpty Then
    Worksheets("Sheet1").CommandButton2.Enabled = False
Else
    Worksheets("Sheet1").CommandButton2.Enabled = True
End If
0 голосов
/ 15 декабря 2018

Хотя лучший и самый простой способ - это проверить по щелчку в CommandButton2_Click, как ответил @Excelosaurus, я просто предлагаю слегка измененный способ отслеживания событий изменения TextBox с помощью ответа @Mathieu Guindon в сообщении Реализациясобытие изменения для проверки изменений в значениях текстового поля и включения кнопки «применить» .Полный кредит , что этот метод инкапсуляции элемента управления WithEvents MSForms переходит к @Mathieu Guindon

в модуле кода Userform1, может быть изменен, как показано ниже

Public handlers As VBA.Collection     ' added
Private Sub CommandButton1_Click()
RowChar = 70
MultiPage1.Pages.Clear

For i = 0 To TextBox1.Value - 1
    MultiPage1.Pages.Add
    MultiPage1.Pages(i).Caption = "Variable" & i + 1

    'Call LabelPerPage

    Set txtbx = UserForm1.MultiPage1.Pages(i).Controls.Add("Forms.TextBox.1", "NameBox")
    With txtbx
        .Top = 20
        .Left = 100
    End With

    Set txtbx = UserForm1.MultiPage1.Pages(i).Controls.Add("Forms.TextBox.1", "MinBox")
    With txtbx
        .Top = 50
        .Left = 100
    End With

    Set txtbx = UserForm1.MultiPage1.Pages(i).Controls.Add("Forms.TextBox.1", "LsbBox")
    With txtbx
        .Top = 20
        .Left = 300
    End With

    Set txtbx = UserForm1.MultiPage1.Pages(i).Controls.Add("Forms.TextBox.1", "Mataas")
    With txtbx
        .Top = 50
        .Left = 300
    End With

    If i = 0 Then
        FormulaString = "= C15"
    Else
        FormulaString = FormulaString & "  " & Chr(RowChar) & "15"
        RowChar = RowChar + 3
    End If

Next i
TextBox2.Value = FormulaString
CommandButton2.Enabled = False ' added
makeEvents                     ' added   
End Sub

Sub makeEvents()                 ' added             
    Set handlers = New VBA.Collection
    Dim cnt As MSForms.Control

    For i = 0 To UserForm1.MultiPage1.Pages.Count - 1
    For Each cnt In UserForm1.MultiPage1.Pages(i).Controls
        If TypeOf cnt Is MSForms.TextBox Then
            Dim textBoxHandler As DynamicTextBox
            Set textBoxHandler = New DynamicTextBox
            textBoxHandler.Initialize cnt
            handlers.Add textBoxHandler
        'Debug.Print cnt.Name & i & "Inited"
        End If
     Next cnt
     Next i
End Sub

Затем Добавитьновый модуль класса для вашего проекта, назовите его DynamicTextBox

Option Explicit
Private WithEvents encapsulated As MSForms.TextBox
Public Sub Initialize(ByVal ctrl As MSForms.TextBox)
    Set encapsulated = ctrl
End Sub
Private Sub encapsulated_Change()
Dim TextEmpty As Boolean
Dim cnt As Control
Dim i As Integer

For i = 0 To UserForm1.MultiPage1.Pages.Count - 1
    For Each cnt In UserForm1.MultiPage1.Pages(i).Controls
        If TypeOf cnt Is MSForms.TextBox Then
        'Debug.Print cnt.Name & i & "checked"
            If cnt.Value = "" Then
            TextEmpty = True
            Exit For
            End If
        End If
    Next cnt
    If TextEmpty = True Then
    Exit For
    End If
Next i


If TextEmpty Then
UserForm1.CommandButton2.Enabled = False
Else
UserForm1.CommandButton2.Enabled = True
End If

End Sub

Попробовал и нашел работающим

0 голосов
/ 15 декабря 2018

Более простой способ - проверить по щелчку: в CommandButton2_Click отсканируйте динамически созданные текстовые поля и либо продолжите, либо уведомите пользователя о любой ошибке проверки.

Более сложный способ - создать классэто будет контролировать события TextBox.Вы создадите один экземпляр этого класса для каждого TextBox, который вы хотите отслеживать, сохраняя эти экземпляры, например, в массиве.См. Как добавить события в элементы управления, созданные во время выполнения в Excel с VBA .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...