使用非空白和空行作为头尾循环复制​​列表

时间:2017-03-29 13:41:17

标签: excel vba excel-vba excel-formula textjoin

HI所以我有一组我要复制的数据。基本上我想创建一个if函数。如果我们在列B中搜索空行并且它是空白的,则循环到下一行,并继续直到第一个非空行。如果我们在列c中的所有空行中点击非空白副本。

    Sub NotReadys()

 ' NotReadys Macro'
Dim Z As Integer 'Supplier Beginning Row'
Dim X As Integer 'Next Non Blank row'
Dim Q As Integer '# of suppliers'
Dim Y As Integer 'Paste Row'
Y = 6
'For T = 1 To 195


ActiveWindow.SmallScroll Down:=-33


Range("B" & Y).Select
Selection.Copy

Range("E" & Y).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Range("F" & Y).Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=TEXTJOIN(CHAR(10),FALSE,RC[-3]:R[30]C[-3])"
Range("F" & Y).Select
ActiveWindow.SmallScroll Down:=-30
Range("F" & Y).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    Y = Y + 1
    Next T

    End Sub

http://imgur.com/XGwB4XR

1 个答案:

答案 0 :(得分:0)

我很难理解您的数据结构,但使用For Each x In Selection可能会对您有所帮助。我假设您的数据至少与以下类似,其中供应商名称在A列中,而PO在B列中

     |   A   |   B   |   C   |   D   |
-----|-------|-------|-------|-------|
  1  |   s1  |  PO1  |       |       |
-----|-------|-------|-------|-------|
  2  |   s2  |  PO2  |       |       |
-----|-------|-------|-------|-------|
  3  |   s3  |       |       |       |
-----|-------|-------|-------|-------|
  4  |   s4  |  PO3  |       |       |
-----|-------|-------|-------|-------|

此代码会将任何供应商和采购订单(其中采购订单不为空白)复制到C和D列:

outRow = 1  ' Set this to the index of the first row you want to output to

' Run through each cell in Selection, left to right, top to bottom
For Each selCell In Selection
  ' Check for non-blank, but only if we're looking at column 2 (B)
  If selCell.Column = 2 & selCell <> "" then
    ' Store the selected Row and Column
    sRow = selCell.Row
    sCol = selCell.Column

    ' Has the effect of prefixing ActiveSheet to any values that start with "."
    With ActiveSheet
      ' Copy value from cols 1 and 2 (A & B) to col 3 and 4 (C & D)
      .Cells(outRow, 3).Value = .Cells(sRow, sCol - 1).Value
      .Cells(outRow, 4).Value = selCell.Value
    End With

    outRow = outRow +1  ' Moves to next output row
  End If
Next

在我的示例中,假设您在运行函数之前选择了A1:B4,您将获得以下输出。

     |   A   |   B   |   C   |   D   |
-----|-------|-------|-------|-------|
  1  |   s1  |  PO1  |   s1  |  PO1  |
-----|-------|-------|-------|-------|
  2  |   s2  |  PO2  |   s2  |  PO2  |
-----|-------|-------|-------|-------|
  3  |   s3  |       |   s4  |  PO3  |
-----|-------|-------|-------|-------|
  4  |   s4  |  PO3  |       |       |
-----|-------|-------|-------|-------|

我猜你正在使用宏录制选项来制作你拥有的代码;这是学习VBA如何工作的好方法(我们大多数人在某些时候都这样做了),但是没有产生好的代码。 Excel中的内置文档实际上非常好,当你遇到录音机的限制时值得一看。

编辑:我越看你的问题,我就越不确定你所问的是什么,但希望上面至少会把你推向正确的方向。