1

因此,如果您了解 VBA 的方法,我相信这很容易,我只是能够让它为我工作。

这是我的表的一个例子。如果 A 列相同,我想将所有内容移到一行中。这就是我所期待的桌子。

A   B    C         D            E     F          G        H         I
11  Yes Yellow  8/1/2013 20:46  11  Yes 8/1/2013 20:46  Yellow  8/1/2013 20:46
11  No  Blue    8/1/2013 20:46  12  Yes 8/1/2013 20:46  Yellow  8/1/2013 20:46
11  YY  Red 8/1/2013 20:46      13  Yes 8/1/2013 20:46   Red    8/1/2013 20:46
11  NN  Yellow  8/1/2013 20:46                  
11  YYY Yellow  8/1/2013 20:46                  
11  NNN Blue    8/1/2013 20:46                  
11  YYYYY   Red 8/1/2013 20:46                  
11  NNNN    Yellow  8/1/2013 20:46                  
12  Yes Yellow  8/1/2013 20:46                  
12  No  Blue    8/1/2013 20:46                  
12  YY  Red 8/1/2013 20:46                  
12  NN  Yellow  8/1/2013 20:46                  
12  YYY Yellow  8/1/2013 20:46                  
12  NNN Blue    8/1/2013 20:46                  
13  Yes Red 8/1/2013 20:46                  
13  No  Yellow  8/1/2013 20:46                  
13  YY  Yellow  8/1/2013 20:46                  
13  NN  Blue    8/1/2013 20:46                  
13  YYY Red 8/1/2013 20:46                  
13  NNN Yellow  8/1/2013 20:46                  

这就是我试图用 VBA 做的事情。不是最好的,但我正在尝试。

Sub Sample()
    Dim lastRow As Long, i As Long
    Dim ws As Worksheet

    Set ws = Sheets("Sheet1")

    lastRow = ws.range("A" & Rows.Count).End(xlDown).Row


    With ws
        For i = 1 To lastRow
            If range("A" & i).Value = range("E" & i) Then range("f" & i).Value = range("b" & i).Value
        Next i
    End With
End Sub

有人可以帮助我完成这项工作所需的 VBA。我在循环循环并将每个 A 值与 E 中的每个值进行比较时遇到问题。

4

2 回答 2

0

我不太确定你想要实现什么。但是我根据自己的理解做了一个代码。试试看。

Sub Sample()
    Dim lastRowA As Long, lastRowB As Long, i As Long
    Dim ws As Worksheet
    Set ws = Sheets("Sheet1")
    With ws
        lastRowA = .Cells(.Rows.Count, 1).End(xlUp).Row
        lastRowE = .Cells(.Rows.Count, 5).End(xlUp).Row
    End With
    With ws
        For i = 1 To lastRowE
            CurrentEValue = Range("E" & i).Value
            MatchFound = False
            For j = 1 To lastRowA
                CurrentAValue = Range("A" & j).Value
                If CurrentAValue = CurrentEValue And Not MatchFound Then
                    Range("f" & i).Value = Range("b" & j).Value
                    MatchFound = True
                End If
            Next
        Next
    End With
End Sub
于 2013-08-02T09:18:06.500 回答
0

因此,您想将第 1 到第 8 行、B 到 D 列中的数据放入第 1 行、F 列及以下,因为对于第 1 到第 8 行,A 列中的“11”与 E1 中的“11”匹配?
例如 B1->F1, C1->H1 (这是我缺少某些订单的第一个位置),D1->G1,??->I1 (我从哪里来的列的内容?),
(附加同一目标行中的下一个源代码行:) B2->J1, ...

首先,您需要澄清 F 到 I 列(以及更多)中的数据来自何处。
然后:
如果我对您的意图的假设是正确的,那么这会带来其他问题:

  • col E 是否总是包含 col A 的所有可能值,或者 col A 中是否存在 col E 中缺少的值(例如“14”)?
  • col E 中值的位置是否固定?

以下是一些建议,澄清后可能会出现代码:

  • 确定 col A 中的行数
  • 确定 col E 中的行数
  • 使用 2 个循环:一个外部循环用于从 col A 获取数据,一个内部循环用于搜索从 col E 获取的数据
  • 使用 ws.cells(row, col).value 而不是 range()
  • 如果要将来自不同源行的数据附加到同一目标行中,请添加一个数组变量,以保留每个目标行的下一个空闲列的位置。

一般建议:

  • 不要使用像“i”这样的变量名。不明确的变量名称伴随着许多缺点。改用 iRow 或类似的东西(易于处理搜索和替换,独特的含义,有关变量类型的信息(i =整数),...)
  • 在模块顶部使用 Option Explicit。这将迫使您显式声明所有变量并确保正确使用变量。
于 2013-08-02T08:51:35.070 回答