使用用户表单更新现有行数据

时间:2019-09-12 19:46:21

标签: excel vba userform

我正在使用用户表单来更新工作表上的现有数据。我可以 创建新记录就好了。我创建了一个带有 组合框以搜索名称。它可以很好地提取人员数据,并且我可以更改信息。但是,当我单击更新按钮时,会发生错误。在添加一条我不想发生的全新行之前,我调整了代码。我只想用编辑后的信息更新现有的数据行。

在复制记录后,我尝试在VBA中使用MATCH函数。

Private Sub Update_record_Click()
Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets("Master")
Dim n As Long
Dim empname As String

empname = Application.Match(VBA.CStr(Me.Update_record.Value), 
sh.Range("C:C"), 0)

sh.Range("A" & empname).Value = Me.First_Name.Value
sh.Range("B" & empname).Value = Me.Last_Name.Value
sh.Range("D" & empname).Value = Me.MainPX.Value
sh.Range("E" & empname).Value = Me.AltPX.Value
sh.Range("F" & empname).Value = Me.Job_Role.Value
sh.Range("G" & empname).Value = Me.WristBand.Value
sh.Range("H" & empname).Value = Me.Team.Value
sh.Range("I" & empname).Value = Me.Unit.Value


Range("A2:J" & n).Sort key1:=Range("A2:A" & n), order1:=xlAscending, 
Header:=xlNo

 Me.First_Name.Value = ""
 Me.Last_Name.Value = ""
 Me.MainPX.Value = ""
 Me.AltPX.Value = ""
 Me.Job_Role.Value = ""
 Me.WristBand.Value = ""
 Me.Team.Value = ""
 Me.Unit.Value = ""


 MsgBox "Record has been updated", vbInformation
 End Sub

这是应用程序出错的地方...它在此处停止...在此行上

empname = Application.Match(VBA.CStr(Me.Update_record.Value), 
sh.Range("C:C"), 0)

因此数据永远不会更新到该行。以下是两个屏幕截图...一个工作表和一个用户窗体。

Worksheet Screenshot

Userform Screenshot

1 个答案:

答案 0 :(得分:1)

我可以立即考虑通过三种方式进行处理。我还没有测试前两个,所以如果您遇到任何问题,请告诉我。

单向

Dim fName As String
Dim lName As String
Dim NameToSearch As String
Dim RecRow As Long
Dim sh As Worksheet

Set sh = ThisWorkbook.Sheets("Master")

fName = FirstNameTextbox.Value '<~~ First Name textBox
lName = LastNameTextbox.Value  '<~~ Last Name textBox

NameToSearch = fName & ", " & lName

empname = Application.WorksheetFunction.Match(NameToSearch, sh.Range("C:C"), 0)

两种方式

此方法使用.Find

Dim fName As String
Dim lName As String
Dim NameToSearch As String
Dim aCell As Range
Dim ws As Worksheet
Dim RecRow As Long

fName = FirstNameTextbox.Value
lName = LastNameTextbox.Value

NameToSearch = fName & ", " & lName

Set ws = ThisWorkbook.Sheets("Master")

With ws
    Set aCell = .Columns(3).Find(What:=NameToSearch, LookIn:=xlValues, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)

    If Not aCell Is Nothing Then
        RecRow = aCell.Row '<~~ This is the row where the data is
    Else
        MsgBox SearchString & " not Found"
    End If
End With

三种(我更喜欢)

在工作表A的列中插入一列,并将其命名为ID。这将具有唯一的序列号(行号?)。读取项目时,也要阅读该项目,并将其写回到单元格中,请使用该ID进行写回。无需使用Match.Find

搜索记录

在这种情况下,假设序列号从第2行的1开始,您将始终更新(ID + 1)行。