【问题标题】:Excel VBA UserForm - Update/Override DataExcel VBA 用户窗体 - 更新/覆盖数据
【发布时间】:2018-08-15 00:35:06
【问题描述】:

我正在尝试通过UserForm 提取和更新一些记录,我几乎已经完成了,除了一段代码没有按预期工作。它应该覆盖以前的记录(在与 IDNum 找到的记录相同的行中找到的任何信息。

由于某种原因,当它应该覆盖 Column A 的所有内容时,它开始复制 B 列的数据。

这是代码。

Private Sub RecordUpdate_Click()
    Dim LastRow As Long
    Dim IDNum As String
    Dim rngIDNum As Range
    Dim WriteRow As Long
    Dim ws As Worksheet

    Set ws = Worksheets("Records")

    With ActiveSheet
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        Set rngIDNum = .Range("E1:E" & LastRow)
        IDNum = txtID.Value
        WriteRow = Application.Match(IDNum, rngIDNum, 0)
        Cells(WriteRow, 1).Select
        With ActiveCell
            .Offset(0, 1).Value = txtName.Value
            .Offset(0, 2).Value = txtlName.Value
            .Offset(0, 3).Value = txtGender.Value
            .Offset(0, 4).Value = txtAge.Value
            .Offset(0, 5).Value = txtID.Value
        End With
    End With
End Sub

它会保留Column A 中的所有内容,并将已编辑的条目从 B 复制到 F,而不是从 A 复制到 E。非常感谢任何输入。

【问题讨论】:

    标签: excel userform vba


    【解决方案1】:

    开头应该是:

    .Offset(0, 0).Value = txtName.Value
    

    ColumnIndex 设置为 1 将使其定位到右侧的 1 列。
    此外,您可以像这样直接处理对象,而不是使用Select

    With .Cells(WriteRow, 1)
        .Offset(0, 0).Value = txtName.Value
        .
        .
        .Offset(0, 4).Value = txtID.Value
    End With
    

    或者您也可以使用 Range.Find Method 尝试此版本的代码。

    Private Sub RecordUpdate_Click()
        Dim LastRow As Long
        Dim IDNum As String
        Dim rngIDNum As Range
        Dim ws As Worksheet
    
        Set ws = Worksheets("Records")
        ' Find the ID 
        With ws
            LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
            IDNum = txtID.Value
            Set rngIDNum = .Range("E1:E" & LastRow).Find(IDNum, .Range("E" & LastRow))
        End With
        ' Inform and Exit if ID doesn't exist
        If rngIDNum Is Nothing Then MsgBox "ID not found": Exit Sub
        ' Update the values
        With rngIDNum
            .Offset(0, -4).Value = txtName.Value
            .Offset(0, -3).Value = txtlName.Value
            .Offset(0, -2).Value = txtGender.Value
            .Offset(0, -1).Value = txtAge.Value
            .Offset(0, 0).Value = txtID.Value
        End With
    End Sub
    

    我假设您正在处理您在ws 变量中分配的Worksheet("Records")

    【讨论】:

    • 感谢您的及时回复和帮助。我尝试了这两个选项,只有第一个选项有效。修改后的脚本版本的第二个选项产生了错误。运行时错误 1004:应用程序定义或对象定义错误。我会选择第一个选项。再次感谢。
    • 它指向.Offset(0, -4).Value = txtName.Value。我现在实际上对这两个脚本都有问题。在第一个选项上 WriteRow = Application.Match(IDNum, rngIDNum, 0) 导致脚本崩溃 “WriteRow” 当我在调试时将鼠标悬停在它上面时返回 0。
    • 我正在尝试您的第二个选项,并修复了运行时错误 1004:应用程序定义或对象定义错误。我在 txtID.Value 之前和之后添加了一个列,这使它查看了错误的偏移数字。但是,脚本没有错误地通过,但它没有保存我在运行脚本之前对数据所做的更改。任何想法为什么?
    • @user1582396 如果未找到匹配项,则不会保存更改。如果您在 Column E 中搜索,那么代码应该没有问题。我已经尝试过了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多