【问题标题】:Copy and paste value to another worksheet by VBA通过 VBA 将值复制并粘贴到另一个工作表
【发布时间】:2017-11-24 23:36:12
【问题描述】:

我正在尝试使用 VBA 将一些单元格值复制并粘贴到同一工作簿中的其他工作表中。

订单列表工作表格式如下:

(Column A)   | (Column B)          | (Column C) | (Column D) | (Column E) | (Column F)
Product Code | Product Description | Price      | Quantity   | Net Amount | Sheet Name 

我需要复制订单列表表中的数量并粘贴到相关表中,如F列所示。

例如,产品代码AAA有数量10个工作表名称订单列表中的艺术。 p>

Product Code | Product Description | Price | Quantity | Net Amount | Sheet Name 
AAA            ...                   ...     5          ...          Art

我需要一个代码来将 Art 表中 AAA 的 Quantity(G 列)替换为 10 而不是 5。Product Code艺术表的 B 列。

(Column B)   | ...           | (Column G)
Product Code | Other headers | Quantity
AAA            ...             10           ' <---- REPLACE WITH 5

我已更新如下:

Dim j As Long, i As Long

j = 18

With Worksheets("Order List")

If Sheets("Order List").Range("F" & j) <> "" And Sheets("Order List").Range("A" & j) <> "" Then

 i = Worksheets(.Range("F" & j)).Columns("B").Find(What:=.Range("A" & j).Value, LookIn:=xlValues, LookAt:=xlWhole).Row

Sheets("Order List").Range("D" & j).Copy Destination:=Worksheets(Worksheets("Order List").Range("F" & j)).Range("G" & i)

j = j + 1

End If

现在没有错误信息,但Art Sheet中的数量也没有替换。 目的地错了吗?你能帮我仔细检查一下吗?非常感谢

【问题讨论】:

  • 您不需要为j 查找值,除非相关工作表和产品代码都可用,因此在检查它们是否可用之前不要尝试使用这些值。
  • @YowE3K 我已经更新了这些列。 A列中的产品代码,D列中的数量和工作表名称在订单列表中的F列中。第一行是订单列表中的 18。产品代码在其他工作表的 B 列中。我知道您编写的代码是查找行号,我使用此行号在其他工作表中查找相关的 G 列(本例中的艺术表)。相关的工作表和产品代码都可用,所以我认为代码应该可以工作。我已对其进行了更新,但仍然看到运行时错误“9”。如果我的代码有误,您能否更正我的代码?非常感谢
  • 您更新后的代码仍在尝试使用Worksheets(.Range("F" &amp; j)),然后再测试是否Sheets("Order List").Range("F" &amp; j) &lt;&gt; ""。因此,如果它为空白,则您正在寻找没有名称的工作表。在检查它们是否可用之前不要尝试使用这些值 - 将 i 的计算移到 inside If 语句中,您将知道它会起作用。
  • @YowE3K 作为您的建议,我再次更新了它。希望我没有误会你。它现在显示类型不匹配。请您再帮我检查一下好吗?非常感谢
  • 看起来这是默认情况下不使用Value 属性的情况之一——.Range("F" &amp; j) 在用作@987654333 的索引时需要更改为.Range("F" &amp; j).Value @ 收藏。我会相应地更新我的答案。

标签: vba excel


【解决方案1】:

尝试使用Find 命令,例如:

Dim j As Long, i As Long

j = 18

With Worksheets("Order List")
    If .Range("F" & j).Value <> "" And .Range("A" & j).Value <> "" Then
        i = Worksheets(.Range("F" & j).Value).Columns("B").Find(What:=.Range("A" & j).Value, LookIn:=xlValues, LookAt:=xlWhole).Row
        .Range("D" & j).Copy Destination:=Worksheets(.Range("F" & j).Value).Range("G" & i)
        'or, if you just want to copy the value, use
        'Worksheets(.Range("F" & j).Value).Range("G" & i).Value = .Range("D" & j).Value
        j = j + 1
    End If
End With

注意事项:

  1. 假设产品代码在您尝试更新的工作表的 A 列中。
  2. 如果相关工作表的 A 列中不存在产品代码,这将崩溃。如果这是可能的,那么您需要在尝试获取 Row 属性之前包含正确的错误检查,以查看 Find 是否成功(即未返回 Nothing)。

【讨论】:

  • 非常感谢。我已经更新了代码。但是,我在这里仍然有一些错误。你能再帮我看看吗?
【解决方案2】:

也许有一个更简单的替代解决方案。您可以使用对用户更友好的工作表查找功能,而不是使用 VBA 处理麻烦的多表订单数量搜索(以及 “放置” 订单表上的新数据)订单列表工作表以“获取”将所有其他工作表中的数据合并到一个位置,然后在适当的时候进行简单的单列复制和粘贴。

[

您可以下载我的 [simple] 演示 XLSM from JumpShare here 来演示我所说的“放置而不是获取”的意思。基本上 1 个查找公式会为您完成所有搜索,只需 2 行代码在需要时复制新数据。 {请注意,该宏不适用于在线查看器。)

【讨论】:

    【解决方案3】:

    VBA 不是我的强项,所以我将您的代码解构为以下内容,以便更好地理解它。

    Dim j As Long, i As Long
    Dim s As String
    Dim ws As Worksheet
    
    j = 18
    Set ws = Worksheets("Order List")
    
    s = ws.Range("A" & j).Value
    i = Worksheets(ws.Range("F" & j)).Columns("B").Find(What:=s, LookIn:=xlValues, _
        LookAt:=xlWhole).Row
    
    If ws.Range("F" & j) <> "" And ws.Range("A" & j) <> "" Then
      ws.Range("D" & j).Copy Destination:=Worksheets("F" & j).Range("G" & i)
      j = j + 1
    End If
    

    让我眼前一亮的一件事是最后一行真正的代码:

    Destination:=Worksheets("F" & j).Range("G" & i)
    

    这告诉我您的工作簿中有一个名为“Fx”的工作表(其中 x 是一个数字)。有没有可能是这个意思?

    Destination:=Worksheets(ws.Range("F" & j))
    

    【讨论】:

    • 感谢您的建议。我已将工作表更改为 Worksheet.Range。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多