У меня есть простой список:
A B
item1 3
item2 2
item3 4
item4 1
Нужно вывести:
A
item1
item1
item1
item2
item2
item3
item3
item3
item3
item4
У меня есть простой список:
A B
item1 3
item2 2
item3 4
item4 1
Нужно вывести:
A
item1
item1
item1
item2
item2
item3
item3
item3
item3
item4
Вот один из способов сделать это без VBA:
1
в A1=A1+C1
в A2 и скопируйте в A5.'
) в ячейку.1
в E1, 2
в E2 и скопируйте вниз, чтобы получить 1, 2, ..., 10=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 |
Вот решение VBA. Я не совсем понимаю комментарий о том, что VBA не будет динамическим. Это так же динамично, как вы это делаете, как формула. Обратите внимание, что этот макрос удалит все данные на Листе 1 и заменит их новыми выходными данными. Если вы хотите получить желаемый результат на другом листе, измените ссылку на 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
#VALUE
или -
и т. д.). Это казалось более эффективным с точки зрения конечного пользователя, и логике было проще следовать. Хотя это могло бы быть немного более общим. :) 07.08.2012