【问题标题】:Copy value N times in Excel在 Excel 中复制值 N 次
【发布时间】:2012-08-04 04:29:54
【问题描述】:

我有简单的清单:

  A     B
item1   3
item2   2
item3   4
item4   1

需要输出:

  A
item1
item1
item1
item2
item2
item3
item3
item3
item3
item4

【问题讨论】:

    标签: excel copy duplicates


    【解决方案1】:

    这是不使用 VBA 的一种方法:

    1. 在 A 的左侧插入一列,因此您当前的 A 和 B 列现在是 B 和 C。
    2. 1放入A1
    3. =A1+C1放入A2并向下复制到A5
    4. 在 B5 中放置一个空字符串,只需在单元格中输入一个单引号 (')
    5. 在E1中放一个1,在E2中放一个2,然后复制下来得到1、2、...、10
    6. =VLOOKUP(E1,$A$1:$B$5,2) 输入F1 并向下复制。

    应该是这样的:

    | A  | B     | C | D | E  | F     |
    |----|-------|---|---|----|-------|
    | 1  | item1 | 3 |   | 1  | item1 |
    | 4  | item2 | 2 |   | 2  | item1 |
    | 6  | item3 | 4 |   | 3  | item1 |
    | 10 | item4 | 1 |   | 4  | item2 |
    | 11 |       |   |   | 5  | item2 |
    |    |       |   |   | 6  | item3 |
    |    |       |   |   | 7  | item3 |
    |    |       |   |   | 8  | item3 |
    |    |       |   |   | 9  | item3 |
    |    |       |   |   | 10 | item4 |
    

    【讨论】:

    • ...然后可能按值复制。
    • (Visual Basic for Application 给出静态结果)
    • @MUYBelgium,这取决于。如果你想保持动态,那就不行。 OP 在这方面并不具体,所以我将保持原样
    • @user1581199 你应该使用这个技巧,因为它可以让你保持动态。使用 for each 循环的 Visual Basic 例程将不是动态的。一般来说,使用 Excel 的“普通”、“图形”或“通过菜单/公式”的方式总是比使用 VBA 更好,因为 VBA 并不像看起来那么简单,也无法移植到其他办公套件。
    • 代替 VLOOKUP(E1,$A$1:$B$5,2),您可以使用 VLOOKUP(ROW(F1),$A$1:$B$5,2) 并忘记 E列。
    【解决方案2】:

    这是 VBA 解决方案。我不太明白 VBA 不会是动态的评论。它就像你做的那样充满活力,就像一个公式。请注意,此宏将擦除 Sheet1 上的所有数据将其替换为新的输出。如果您希望在不同的工作表上获得所需的输出,请将引用更改为 Sheet2 或您有什么。

    Option Explicit
    
    Sub MultiCopy()
    
    Dim arr As Variant
    Dim r As Range
    Dim i As Long
    Dim currRow As Long
    Dim nCopy As Long
    Dim item As String
    
    'store cell values in array
    arr = Sheet1.UsedRange
    currRow = 2
    
    'remove all values
    Sheet1.Cells.ClearContents
    Sheet1.Range("A1") = "A"
    
    For i = 2 To UBound(arr, 1)
        item = arr(i, 1)
        nCopy = arr(i, 2) - 1
        If nCopy > -1 Then
            Sheet1.Range("A" & currRow & ":A" & (currRow + nCopy)).Value = item
            currRow = currRow + nCopy + 1
        End If
    Next
    
    End Sub
    

    【讨论】:

    • 我也不同意@MUYBelgium 关于 VBA 是非动态的评论。但是,为了证明您的情况,您不应该编写函数而不是子函数吗?然后该函数可以作为数组公式的一部分调用,一切都将是动态的。
    • @flodel 也许我应该有,但我太新手了,无法解决会产生的并发症。这种 VBA 方法似乎更容易。使用函数,用户必须手动选择与预期输出大小相同的范围,或者函数必须以手动填充数组公式的方式返回值,直到单元格停止接收值(列表末尾- 我想你可以用#VALUE- 等来表示它)。从最终用户 POV 看来,这似乎更有效,并且逻辑更易于遵循。不过,它可能更通用一些。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 2014-02-18
    • 2020-05-17
    相关资源
    最近更新 更多