【问题标题】:How to insert data from userform to a specific row with a specific value如何将数据从用户窗体插入到具有特定值的特定行
【发布时间】:2020-06-24 07:12:39
【问题描述】:

我想创建一个用户表单,可以在 E 列中找到“销售”值,然后将剩余数据输入到同一行。

Set APAC = Sheet2
APAC.Activate
Range("E18:E1888").Select
For Each D In Selection
    If D.Value = "TWO.Sales.Value" Then
        Exit For
    End If
Next D


Rows(D.Row).Select

    D.Offset(0, 2).Value = TWO.RSA.Value
    D.Offset(0, 3).Value = TWO.Part.Value
    D.Offset(0, 4).Value = Application.WorksheetFunction.VLookup(TWO.Part.Value, Worksheets("DataEntry").Range("T2:U70").Value, 2, False)
    D.Offset(0, 5).Value = TWO.Program.Value
    D.Offset(0, 6).Value = TWO.QTY.Value
    Sheet2.Activate

这是我的代码,但是

运行时错误'91'

发生。

【问题讨论】:

  • 哪一行出现错误?
  • 如果两条记录的销售额相同怎么办?
  • 我在 "Rows(D.Row).select" 行有错误
  • 首先,声明所有变量。在代码模块的顶部添加Option Explicit。你会发现TWO.RSA 是一个没有被声明的对象。然后不要选择激活任何东西。 For Each D in Sheet2.Range("E18:E1888") 的结果与您的 3 行代码生成的结果完全相同 - 减去杂乱。

标签: excel vba


【解决方案1】:

我在“Rows(D.Row).select”行有错误 – Jacob 2 分钟前

这意味着在Range("E18:E1888") 中找不到"TWO.Sales.Value",因此D 什么也不是。您需要检查是否找到该值。我也有一种感觉,你想要If D.Value = TWO.Sales.Value Then 而不是If D.Value = "TWO.Sales.Value" Then

也不需要Select/Activate。您可以直接使用对象。你可能想看看How to avoid using Select in Excel VBA

每当您使用VLookup 时,最好处理未找到匹配项时可能弹出的错误。有多种方法可以做到这一点。我在下面的代码中展示了一种方式。

这是你正在尝试的吗? (未测试

Option Explicit

Sub Sample()
    Dim APAC As Worksheet
    Dim curRow As Long
    Dim aCell As Range
    Dim Ret

    Set APAC = Sheet2

    With APAC
        For Each aCell In .Range("E18:E1888")
            If aCell.Value = TWO.Sales.Value Then
                curRow = aCell.Row
                Exit For
            End If
        Next aCell

        If curRow = 0 Then
            MsgBox "Not Found"
        Else
            .Range("G" & curRow).Value = TWO.RSA.Value
            .Range("H" & curRow).Value = TWO.Part.Value

            On Error Resume Next
            Ret = Application.WorksheetFunction.VLookup(TWO.Part.Value, _
                  Worksheets("DataEntry").Range("T2:U70").Value, 2, False)
            On Error GoTo 0

            If Ret <> "" Then .Range("I" & curRow).Value = Ret

            .Range("J" & curRow).Value = TWO.Program.Value
            .Range("K" & curRow).Value = TWO.QTY.Value
        End If
    End With
End Sub

注意:如果.Range("E18:E1888") 的范围是动态的,那么您可能希望找到最后一行,如HERE 所示,然后将范围用作.Range("E18:E" &amp; LastRow)

【讨论】:

  • 你也可以用 Range.Find 替换第一个循环来寻找销售价值
  • 是的,如图所示HERE
  • @SiddharthRout 我试过你的代码,但他们说即使在 E18:E1888 范围内也找不到 TWO.Sales.Value。
  • 非常感谢你们的帮助。最后我使用 Range.find 函数,因为我觉得它更容易。
  • @Jacob:可能是因为有一些空格或者它区分大小写。尝试将If aCell.Value = TWO.Sales.Value Then 替换为If Upper(Trim(aCell.Value)) = Upper(Trim(TWO.Sales.Value)) Then。是的,不过以更好的方式使用.Find。无论如何,其余的代码有帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多