【问题标题】:Find a cell value, look up corresponding code in another sheet and copy multiple values that correspond找到一个单元格值,在另一张表中查找相应的代码并复制多个对应的值
【发布时间】:2013-12-05 16:06:40
【问题描述】:

我有一个如下所示的 excel“Sheet4”:

名称 成本代码 类型 项目 1 10 美元一个 项目 2 - PR6 A 项目 3 $15 B 项目 4 - PR2 B 项目 5 $15 B

然后是第二个“Sheet3”,如下所示:

代码 PR6 CLR 10 美元 GRY 12 美元 BRN 12 美元 GRN $12 红 $13 GRX $17 代码 PR2 CLR 12 美元 GRY 14 美元 BRN 14 美元 GRN $14 红 $14 GRX $20

我需要做的是构建一个宏来查找 sheet1 中空白价格值的代码,并从 sheet2 复制不同颜色的多个价格,以便 sheet1 中的最终读数如下所示:

名称 成本代码 类型 项目 1 10 美元一个 项目 2 10 美元 CLR A 项目 2 $12 GRY A 项目 2 $17 GYX A 项目 3 $15 B 项目 4 12 美元 CLR B 项目 4 14 美元 GRY B 项目 4 $20 GYX B 项目 5 $15 B

sheet2 中的所有颜色和价格都在单独的单元格中。

我只需要每个颜色相同的颜色(即需要复制 CLR、GRY 和 GYX),但 sheet2 中的某些组没有所需颜色之一(可能只有 CLR 和GYX 没有 GRY)。

我已经尝试了下面的代码,但我认为这很难,因为我正在使用 Offset 引用“项目”范围内的一个单元格,并且它说“对象不支持此属性或方法”。我需要能够将从 Sheet3 获得的值粘贴到 Sheet4 的正确列中; B 列和 C 列。

如果我可以让下面的代码工作,我唯一要做的就是为每个相应的颜色添加 Elseif 语句,然后让它插入行并复制要填充的行。

子产品Test()

Dim st1, st2 As Worksheet
Set st1 = Sheets("Sheet4")
Set st2 = Sheets("Sheet3")
Dim items As Range
Set items = st1.Range(st1.Range("A1"), st1.Range("A" & Rows.Count).End(xlUp))
Dim item As Range

For Each item In items
    Dim cost As String
    Dim code As String
    Dim t As String
    cost = item.Offset(0, 1).Value
    code = item.Offset(0, 2).Value
    t = item.Offset(0, 3).Value
    If cost = "0" Then
        Dim prodPos As Range
        Dim prodColors As Range
        Dim prodColor As Range
        Dim colorcost As String
        Dim color As String

        Set prodPos = st2.Cells.Find(What:=code, LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
        Set prodColors = Range(prodPos.Offset(1, -1), prodPos.Offset(6, 6))

        For Each prodColor In prodColors
            If prodColor.Value = "CLR" Then
                color = prodColor.Value
                colorcost = prodColor.Offset(0, 1).Value
                   'This is where its encountering a problem
                Worksheets("Sheet4").item.Offset(0, 2).Activate
                ActiveCell.Value = color
                st1.item.Offset(0, 1).Value = colorcost
            End If
        Next prodColor

    End If
Next item

结束子

【问题讨论】:

  • 要求代码的问题必须表明对所解决问题的最低理解。包括尝试的解决方案、它们为什么不起作用以及预期的结果(来自:Help Center)。另请参阅:Stack Overflow question checklist。因此,从您的代码开始,发布它,然后告诉我们您遇到的问题。
  • 对此感到抱歉,因为我试图按顺序做很多事情,每次尝试进入它时我都有点不知所措。当我取得一点进展时,我将处理 brWHigino 发布的内容并编辑我的帖子。

标签: vba excel


【解决方案1】:

希望这会对您有所帮助:

Sub productsPrice()

    Dim st1, st2 As Worksheet
    Set st1 = Sheets("sheet1")
    Set st2 = Sheets("sheet2")
    Dim items As Range
    Set items = st1.Range(st1.Range("A2"), st1.Range("A" & Rows.Count).End(xlUp))
    Dim item As Range
    For Each item In items
        Dim cost As String
        Dim code As String
        Dim t As String
        cost = item.Offset(0, 1).Value
        code = item.Offset(0, 2).Value
        t = item.Offset(0, 3).Value
        If cost <> "-" Then
            MsgBox (item & ", " & cost & ", " & code & ", " & t)
        Else
            Dim prodPos As Range
            Dim prodColors As Range
            Dim prodColor As Range
            Set prodPos = st2.Cells.Find(What:=code, LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
            Set prodColors = Range(prodPos.Offset(1, -1), prodPos.Offset(2, 4))
            Dim index As Integer
            index = 0
            For Each prodColor In prodColors
                If index Mod 2 = 0 Then
                    MsgBox (prodColor & ", " & prodColor.Offset(0, 1) & ", " & code & ", " & t)
                End If
                index = index + 1
            Next prodColor
        End If
    Next item

End Sub

而不是 MsgBox,只需将结果放在适合您的位置即可。

【讨论】:

  • 谢谢,这给了我一个很好的框架。我将对其进行一些审查和修改,并可能在我处理完之后发布更新。欣赏它。
【解决方案2】:

我解决了:

Sub productsTest()

Dim st1, st2 As Worksheet
Set st1 = Sheets("Sheet4")
Set st2 = Sheets("Sheet3")
Dim items As Range
Set items = st1.Range(st1.Range("A1"), st1.Range("A" & Rows.Count).End(xlUp))
Dim item As Range

For Each item In items
    Dim cost As String
    Dim code As String
    Dim R As Long
    Dim C As Long
    item.Activate
    R = ActiveCell.Row
    C = ActiveCell.Column
    cost = item.Offset(0, 1).Value
    code = item.Offset(0, 2).Value
    If cost = "0" Then
        Dim prodPos As Range
        Dim prodColors As Range
        Dim prodColor As Range
        Dim colorcost As String
        Dim color As String

        Set prodPos = st2.Cells.Find(What:=code, LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
        Set prodColors = Range(prodPos.Offset(1, -1), prodPos.Offset(6, 6))

        'I added a For statement for each color
        For Each prodColor In prodColors
            If prodColor.Value = "CLR" Then
                color = prodColor.Value
                colorcost = prodColor.Offset(0, 1).Value
                st1.Cells(R, C).Offset(0, 2).Value = color
                st1.Cells(R, C).Offset(0, 1).Value = colorcost
            End If
        Next prodColor
        For Each prodColor In prodColors
            If prodColor.Value = "PGX" Then
                color = prodColor.Value
                colorcost = prodColor.Offset(0, 1).Value
                st1.Range("A" & R & ":D" & R).Select
                Selection.Copy
                Selection.Insert Shift:=xlDown
                st1.Cells(R, C).Offset(0, 2).Value = color
                st1.Cells(R, C).Offset(0, 1).Value = colorcost
            End If
        Next prodColor
        For Each prodColor In prodColors
            If prodColor.Value = "TGY" Then
                color = prodColor.Value
                colorcost = prodColor.Offset(0, 1).Value
                st1.Range("A" & R & ":D" & R).Select
                Selection.Copy
                Selection.Insert Shift:=xlDown
                st1.Cells(R, C).Offset(0, 2).Value = color
                st1.Cells(R, C).Offset(0, 1).Value = colorcost
            End If
        Next prodColor
                    For Each prodColor In prodColors
            If prodColor.Value = "TVG" Then
                color = prodColor.Value
                colorcost = prodColor.Offset(0, 1).Value
                st1.Range("A" & R & ":D" & R).Select
                Selection.Copy
                Selection.Insert Shift:=xlDown
                st1.Cells(R, C).Offset(0, 2).Value = color
                st1.Cells(R, C).Offset(0, 1).Value = colorcost
            End If
        Next prodColor
                    For Each prodColor In prodColors
            If prodColor.Value = "GYC" Then
                color = prodColor.Value
                colorcost = prodColor.Offset(0, 1).Value
                st1.Range("A" & R & ":D" & R).Select
                Selection.Copy
                Selection.Insert Shift:=xlDown
                st1.Cells(R, C).Offset(0, 2).Value = color
                st1.Cells(R, C).Offset(0, 1).Value = colorcost
            End If
        Next prodColor
                    For Each prodColor In prodColors
            If prodColor.Value = "PGX" Then
                color = prodColor.Value
                colorcost = prodColor.Offset(0, 1).Value
                st1.Range("A" & R & ":D" & R).Select
                Selection.Copy
                Selection.Insert Shift:=xlDown
                st1.Cells(R, C).Offset(0, 2).Value = color
                st1.Cells(R, C).Offset(0, 1).Value = colorcost
            End If
        Next prodColor
    End If
Next item

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多