Поиск и редактирование записей с использованием пользовательской формы - PullRequest
0 голосов
/ 15 ноября 2018

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

Я уже достиг кирпичной стены и уже некоторое время разбиваю ей голову, мне очень хотелось бы помочь с моей парадигмой (только сейчас я уверен) !!

Таким образом, я могу искать записи и заполнять мою пользовательскую форму, после чего я хотел бы обновить найденную запись через ту же форму, нажав кнопку обновления, которая присутствует в указанной пользовательской форме.

Private Sub btsearch_Click()
Dim totrows As Long
totrows = Worksheets("Report").Range("A1").CurrentRegion.Rows.Count
If Txtforename.Text = "" Then
MsgBox "Please enter guest name!!"
End If

For i = 2 To totrows
If Trim(Report.Cells(i, 1)) <> Trim(Txtforename.Text) And i = totrows Then
MsgBox "Guest Not Found"
End If
If Trim(Report.Cells(i, 1)) = Trim(Txtforename.Text) Then
Txtforename.Text = Report.Cells(i, 1)
Txtsurename.Text = Report.Cells(i, 2)
Cboidtype.Text = Report.Cells(i, 3)
txtidnumber.Text = Report.Cells(i, 4)
Cboroomno.Text = Report.Cells(i, 5)
txtcheckin.Text = Report.Cells(i, 6)
txtcheckout.Text = Report.Cells(i, 7)
Cbopaymenttype.Text = Report.Cells(i, 9)
Txttotalpayment.Text = Report.Cells(i, 10)
cmbouser.Text = Report.Cells(i, 11)
Exit For
End If
Next i

End Sub

Private Sub btnupdate_Click()

answer = MsgBox("Would you like to update guest details?", vbYesNo + 
vbQuestion, "Update Record")
If answer = vbYes Then
Cells(currentrow, 1) = Txtforename.Text
Cells(currentrow, 2) = Txtsurename.Text
Cells(currentrow, 3) = Cboidtype.Text
Cells(currentrow, 4) = txtidnumber.Text
Cells(currentrow, 5) = Cboroomno.Text
Cells(currentrow, 6) = txtcheckin.Text
Cells(currentrow, 7) = txtcheckout.Text
Cells(currentrow, 9) = Cbopaymenttype.Text
Cells(currentrow, 10) = Txttotalpayment.Text
Cells(currentrow, 11) = cmbouser.Text
End If
End Sub

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Нечто подобное должно работать (не проверено). Соответствующая строка сохраняется в глобальной переменной, поэтому вы можете обновить ее, когда закончите редактирование

Dim CurrentRow As Range 'to store the matched row

Private Sub btsearch_Click()
    Dim totrows As Long, i As Long, fName

    fName = Trim(Txtforename.Text)
    If Len(fName) = 0 Then
        MsgBox "Please enter guest name!!"
        Exit Sub
    End If

    totrows = Report.Range("A1").CurrentRegion.Rows.Count
    Set CurrentRow = Nothing 'clear any previous row

    For i = 2 To totrows
        If Trim(Report.Cells(i, 1)) = fName Then
            Set CurrentRow = Report.Rows(i)
            LoadRow CurrentRow '<< save the matched row
            Exit For
        End If
    Next i

    If CurrentRow Is Nothing Then
        MsgBox "not found!"
    End If

End Sub

Private Sub btnupdate_Click()

    If MsgBox("Would you like to update guest details?", _
               vbYesNo + vbQuestion, "Update Record") = vbYes Then

        SaveRow CurrentRow

    End If
End Sub

'load a row of data into the userform
Sub LoadRow(rw As Range)
    With rw
        Txtforename.Text = .Cells(1).Value
        Txtsurename.Text = .Cells(2).Value
        Cboidtype.Text = .Cells(3).Value
        'etc etc
    End With
End Sub

'save the userform data back to the sheet
Sub SaveRow(rw As Range)
    With rw
        .Cells(1).Value = Txtforename.Text
        .Cells(2).Value = Txtsurename.Text
        .Cells(3).Value = Cboidtype.Text
        'etc etc
    End With
End Sub
0 голосов
/ 15 ноября 2018

Первое, что я хотел бы проверить, это значение результата MsgBox.MsgBox всегда возвращает целое число, а answer является вариантом.
Во-вторых, я бы объявил answer как целое число.Вместе это могло бы стать таким:

. . .
    Dim answer As Integer
    answer = Msgbox("Would you ... ecord")
    Debug.Print "' answer := " & answer ' display result in immediate-window
    MsgBox "' answer := " & answer ' or display the result with a msgbox
    If answer = vbYes Then
        Debug.Print "' then"
        ' while you are busy debugging, display this value too
        Debug.Print "' currentrow := " & currentrow
        . . . 
    Else
        Debug.Print "' else"
    End If
. . .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...