Для каждого кода, не делающего значение флажка истинным - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь создать код, который проходит через список идентификаторов пользователей (B-цифры), а затем, когда находит соответствующий идентификатор, проверяет, есть ли X в столбце рядом с ним для определенного субъекта с именем SBB005. См. Изображение .Если есть X, я хочу, чтобы значение флажка было истинным.Цикл for для каждого заканчивается, когда он достигает пустой ячейки.

Я объявил диапазоны 'RowYear2' и 'Year2CourseRange' как открытые переменные, и при запуске кода ничего не происходит, и флажок остается не отмеченным!Любая идея, почему флажок не отмечен должным образом?

Я планирую установить несколько флажков, как только это будет работать для всех субъектов в каждом столбце: См. Изображение

Надеясь, что кто-то может помочь мне заставить это работать или даже может предложить более простой способ сделать это для еще 20 флажков!

Большое спасибо:)

Private Sub UserForm_Initialize()

Set Year2CourseRange = Sheets("Year2").Range("A:A")

For Each RowYear2 In Year2CourseRange.Cells
    If RowYear2.Value = BNumberTxt Then
        If RowYear2.Offset(0, 1) = "x" Then
            Me.CHKSBB005.value = True
        Else
            Me.CHKSBB005.value = False
        End If
    ElseIf IsEmpty(RowYear2) Then
        Exit For
    End If
Next RowYear2

LoggedInTxt = Row.Offset(0, -3)
BNumberTxt = Row.Offset(0, -7)
CourseTxt = Row.Offset(0, -1)
CourseNumTxt = Row.Offset(0, -2)

End Sub

Private Sub EnterBtn_Click()

Dim LIMatch As Boolean
Dim Win As Boolean

Email = Me.EmailTxt
Password = Me.PasswordTxt

Set UserRange = Sheets("StudentInformation").Range("H:H")

For Each Row In UserRange.Cells
    If Me.EmailTxt = "" And Me.PasswordTxt = "" Then
        MsgBox ("Please enter an email and password")
        LIMatch = False
        Win = True
    Exit For
    ElseIf Me.EmailTxt = "" Then
        MsgBox ("Please enter an email address")
        LIMatch = False
        Win = True
    Exit For
    ElseIf Me.PasswordTxt = "" Then
        MsgBox ("Please enter a password")
        LIMatch = False
        Win = True
    Exit For

    Else

        If UCase(Row.Value) = UCase(Email) Then
            If UCase(Row.Offset(0, -6)) = UCase(Password) Then
                MsgBox "Welcome"
                LIMatch = True
                Win = True
                Attempts = 0
                Exit For
            ElseIf IsEmpty(Row) Then
                Exit For
                Win = False
            Else
                LIMatch = False
                Win = False

            Exit For
            End If
        Else
            LIMatch = False
            Win = False
        End If

    End If
    Next Row

If LIMatch = True And Win = True Then
    Unload Me
    NewForm.Show
ElseIf LIMatch = False And Win = False Then
    MsgBox ("Incorrect login")
    Attempts = Attempts + 1
Else
End If

If Attempts >= 3 Then
MsgBox ("You have entered the incorrect login 3 times")
Unload Me
End If


End Sub

Ответы [ 2 ]

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

Диапазоны и диапазоны

Это ваш код, слегка сжатый и ниже ваши данные:

Private Sub UserForm_Initialize()
Set Year2CourseRange = Sheets("Year2").Range("A:A")
For Each RowYear2 In Year2CourseRange.Cells
    If RowYear2.Value = BNumberTxt Then
        If RowYear2.Offset(0, 1) = "x" Then
            Me.CHKSBB005.value = True
        Else: Me.CHKSBB005.value = False: End If
    ElseIf IsEmpty(RowYear2) Then
        Exit For: End If: Next RowYear2
  LoggedInTxt = Row.Offset(0, -3): BNumberTxt = Row.Offset(0, -7)
  CourseTxt = Row.Offset(0, -1): CourseNumTxt = Row.Offset(0, -2): End Sub

enter image description here

Посмотрите немного, вы можете сами увидеть ошибку.

Тайна CheckBox Tick Mystery

Когда вы пишете Range("A:A"), который относится ко всему столбцу, включая Range("A1"), который выглядит какEMPTY.Код даже не входит в строку If RowYear2.Offset..., а выходит через строку ElseIf.

Переменная строки

Я ненавижу идею объявления переменной Row.Но это действительно.Поскольку задействовано Offset, Row должно быть диапазоном, вероятно, ячейкой.Как указано в комментариях, он должен «выжить» от другой пользовательской формы, скажем, UserFormX.Если он «выжил», вы должны ссылаться на него следующим образом:

UserFormX.Row

или вы должны объявить его в модуле «не объект», чтобы использовать только Row.

Другой EnterBtn_Click

Возможно, теперь бесполезен, но вот код, с которым я работал на днях:

Option Explicit

Public intAttempts As Integer

Private Sub CancelBtn_Click()
  Unload Me
End Sub

Private Sub EnterBtn_Click()

    Const strEmail = "Please enter email address."   ' Email Input Message
    Const strPassword = "Please enter a password."   ' Password Input Message
    Const strLoginCorrect = "Welcome"                ' Correct Login Message
    Const strLoginIncorrect = "Incorrect Login."     ' Incorrect Login Message
    Const strAttempts = "Too many login attempts."   ' Login Attempts Message

    ' Use worksheet name or index e.g. "SInfo" or 1.
    Const vntWsName As String = "StudentInformation" ' Worksheet
    ' Use column letter or column number e.g. "F" or 6.
    Const vntEmailColumn As Variant = "F"            ' Email Column
    Const intFirstRow As Integer = 2                 ' Email Column First Row
    Const intPasswordColumnOffset As Integer = -4    ' Password Column Offset
    Const intMaxAttempts As Integer = 3              ' Maximum Login Attempts

    Dim lngCounter As Long                           ' Email Column Row Counter
    Dim lngLastrow As Long                           ' Email Column Last Row

    ' Check number of login attempts.
    If intAttempts >= intMaxAttempts Then
        MsgBox strAttempts
        Exit Sub
    End If

    ' Show annoying text messages if nothing was entered.
    If Me.EmailTxt.Text = "" Then
        Me.EmailTxt.Text = strEmail: Exit Sub
      ElseIf Me.EmailTxt.Text = strEmail Then Exit Sub
    End If
    If Me.PasswordTxt.Text = "" Then
        Me.PasswordTxt.Text = strPassword: Exit Sub
      ElseIf Me.PasswordTxt.Text = strPassword Then Exit Sub
    End If

    ' Check for data in specified worksheet.
    With ThisWorkbook.Worksheets(vntWsName)

        ' Determine last row of data in Email Column.
        lngLastrow = .Cells(Rows.Count, vntEmailColumn).End(xlUp).Row

        For lngCounter = intFirstRow To lngLastrow
            ' Ceck for email in Email Column.
            If UCase(.Cells(lngCounter, vntEmailColumn).Value) _
                    = UCase(EmailTxt.Text) Then ' Correct email.
                ' Check if correct password in Password Column
                If UCase(.Cells(lngCounter, vntEmailColumn) _
                        .Offset(0, intPasswordColumnOffset).Value) _
                        = UCase(PasswordTxt.Text) Then ' Correct password.
                    Exit For
                  Else ' Wrong password. Set "counter" to "end".
                    ' Faking that the loop was not interrupted.
                    lngCounter = lngLastrow
                End If
'              Else ' Wrong Email. Do nothing. Not necessary.
            End If
        Next
        ' When the loop wasn't interrupted, "lngcounter = lnglastrow + 1".

    End With

    ' Check if loop was NOT interrupted.
    If lngCounter = lngLastrow + 1 Then ' Loop was NOT interrupted.
        intAttempts = intAttempts + 1
        MsgBox strLoginIncorrect
      Else ' Loop was interrupted. Correct email and password.
        MsgBox strLoginCorrect
        Unload Me
        NewForm.Show
    End If

End Sub
0 голосов
/ 11 декабря 2018

Как только вы исправите свою проблему с глобальным Row, вы можете сделать что-то вроде этого:

Private Sub UserForm_Initialize()

    Dim shtData As Worksheet
    Dim Year2CourseRange As Range, HeaderRange As Range, m, c As Range

    Set shtData = ThisWorkbook.Sheets("Year2")
    With shtData
        Set Year2CourseRange = .Range("A:A")
        Set HeaderRange = .Range(.Range("B2"), .Cells(2, 500).End(xlToLeft))
    End With

    'you'll need to fix this part....
    BNumberTxt = Row.Offset(0, -7)
    'etc

    'find a matching row: Match() is a good approach here
    m = Application.Match(BNumberTxt, Year2CourseRange, 0)

    'loop over all the column headers
    For Each c In HeaderRange.Cells
        'Assumes all checkboxes are named "CHK[ColumnHeaderHere]"
        With Me.Controls("CHK" & c.Value)
            If IsError(m) Then
                .Value = False  'clear all if no match
            Else
                .Value = (UCase(shtData.Cells(m, c.Column)) = "X") 'set if "x"
            End If
        End With
    End If

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