Microsoft Excel 2010复制/粘贴编辑创意&帮助请求小细节

时间:2011-04-29 19:17:49

标签: excel excel-vba vba

是的,我已经在其他人的帮助下为Microsoft Excel(2010,如果有帮助)编写了此宏。我想知道是否有人有办法缩短它,并使其更有效率。然而,它之前仍然得到了相同的结果?我可以在这里找到我需要使用的CSV格式的一个例子......是的,不幸的是,它们必须被放入那些列和单元格中。

我真正难以接受的唯一问题是: 以.Cell(2, 3)为例......如果你注意到,它会复制并粘贴每个部分,它会有一个新行..我希望它能做到这一点..我是新手,但找不到方法,使它只是粘贴每一个到下一个可用的行..所以我的解决方案是做2,3,4,5 ..等等..如果有人知道如何改变这也是为了做到这一点。 。循环?每说,这将是很大的帮助。只需循环播放正在复制的数据量,而不是重复。

以下是一个示例CSV:Media Fire这是干净的,我保证。谢谢你的时间。

宏代码,用于将某些列/行数据单​​元格从一个工作表复制到另一个工作表到特定单元格

Sub FormatData()
Dim col As Integer

For col = 1 To 1
    With Worksheets(2)
       .Cells(2, 2) = Cells(1, col)
       .Cells(2, 3) = Cells(2, col) & ". " & Cells(3, col) & ". " & Cells(4, col) & ". " & Cells(5, col) & "."
       .Cells(2, 4) = Cells(7, col)
       .Cells(2, 5) = Cells(10, col)
    End With
Next col
    For col = 2 To 2
    With Worksheets(2)
       .Cells(3, 2) = Cells(1, col)
       .Cells(3, 3) = Cells(2, col) & ". " & Cells(3, col) & ". " & Cells(4, col) & ". " & Cells(5, col) & "."
       .Cells(3, 4) = Cells(7, col)
       .Cells(3, 5) = Cells(10, col)
    End With
Next col
    For col = 3 To 3
    With Worksheets(2)
       .Cells(4, 2) = Cells(1, col)
       .Cells(4, 3) = Cells(2, col) & ". " & Cells(3, col) & ". " & Cells(4, col) & ". " & Cells(5, col) & "."
       .Cells(4, 4) = Cells(7, col)
       .Cells(4, 5) = Cells(10, col)
    End With
Next col
    For col = 4 To 4
    With Worksheets(2)
       .Cells(5, 2) = Cells(1, col)
       .Cells(5, 3) = Cells(2, col) & ". " & Cells(3, col) & ". " & Cells(4, col) & ". " & Cells(5, col) & "."
       .Cells(5, 4) = Cells(7, col)
       .Cells(5, 5) = Cells(10, col)
    End With
Next col

    For col = 1 To 1
    With Worksheets(2)
       .Cells(6, 2) = Cells(13, col)
       .Cells(6, 3) = Cells(14, col) & ". " & Cells(15, col) & ". " & Cells(16, col) & ". " & Cells(17, col) & "."
       .Cells(6, 4) = Cells(19, col)
       .Cells(6, 5) = Cells(22, col)
    End With
Next col
        For col = 2 To 2
    With Worksheets(2)
       .Cells(7, 2) = Cells(13, col)
       .Cells(7, 3) = Cells(14, col) & ". " & Cells(15, col) & ". " & Cells(16, col) & ". " & Cells(17, col) & "."
       .Cells(7, 4) = Cells(19, col)
       .Cells(7, 5) = Cells(22, col)
    End With
Next col
        For col = 3 To 3
    With Worksheets(2)
       .Cells(8, 2) = Cells(13, col)
       .Cells(8, 3) = Cells(14, col) & ". " & Cells(15, col) & ". " & Cells(16, col) & ". " & Cells(17, col) & "."
       .Cells(8, 4) = Cells(19, col)
       .Cells(8, 5) = Cells(22, col)
    End With
Next col
        For col = 4 To 4
    With Worksheets(2)
       .Cells(9, 2) = Cells(13, col)
       .Cells(9, 3) = Cells(14, col) & ". " & Cells(15, col) & ". " & Cells(16, col) & ". " & Cells(17, col) & "."
       .Cells(9, 4) = Cells(19, col)
       .Cells(9, 5) = Cells(22, col)
    End With
Next col
        For col = 1 To 1
    With Worksheets(2)
       .Cells(10, 2) = Cells(25, col)
       .Cells(10, 3) = Cells(26, col) & ". " & Cells(27, col) & ". " & Cells(28, col) & ". " & Cells(29, col) & "."
       .Cells(10, 4) = Cells(31, col)
       .Cells(10, 5) = Cells(34, col)
    End With
Next col
        For col = 2 To 2
    With Worksheets(2)
       .Cells(11, 2) = Cells(25, col)
       .Cells(11, 3) = Cells(26, col) & ". " & Cells(27, col) & ". " & Cells(28, col) & ". " & Cells(29, col) & "."
       .Cells(11, 4) = Cells(31, col)
       .Cells(11, 5) = Cells(34, col)
    End With
Next col
        For col = 3 To 3
    With Worksheets(2)
       .Cells(12, 2) = Cells(25, col)
       .Cells(12, 3) = Cells(26, col) & ". " & Cells(27, col) & ". " & Cells(28, col) & ". " & Cells(29, col) & "."
       .Cells(12, 4) = Cells(31, col)
       .Cells(12, 5) = Cells(34, col)
    End With
Next col
        For col = 4 To 4
    With Worksheets(2)
       .Cells(13, 2) = Cells(25, col)
       .Cells(13, 3) = Cells(26, col) & ". " & Cells(27, col) & ". " & Cells(28, col) & ". " & Cells(29, col) & "."
       .Cells(13, 4) = Cells(31, col)
       .Cells(13, 5) = Cells(34, col)
    End With
Next col
        For col = 1 To 1
    With Worksheets(2)
       .Cells(14, 2) = Cells(37, col)
       .Cells(14, 3) = Cells(38, col) & ". " & Cells(39, col) & ". " & Cells(40, col) & ". " & Cells(41, col) & "."
       .Cells(14, 4) = Cells(43, col)
       .Cells(14, 5) = Cells(46, col)
    End With
Next col
        For col = 2 To 2
    With Worksheets(2)
       .Cells(15, 2) = Cells(37, col)
       .Cells(15, 3) = Cells(38, col) & ". " & Cells(39, col) & ". " & Cells(40, col) & ". " & Cells(41, col) & "."
       .Cells(15, 4) = Cells(43, col)
       .Cells(15, 5) = Cells(46, col)
    End With
Next col
        For col = 3 To 3
    With Worksheets(2)
       .Cells(16, 2) = Cells(37, col)
       .Cells(16, 3) = Cells(38, col) & ". " & Cells(39, col) & ". " & Cells(40, col) & ". " & Cells(41, col) & "."
       .Cells(16, 4) = Cells(43, col)
       .Cells(16, 5) = Cells(46, col)
    End With
Next col
        For col = 4 To 4
    With Worksheets(2)
       .Cells(17, 2) = Cells(37, col)
       .Cells(17, 3) = Cells(38, col) & ". " & Cells(39, col) & ". " & Cells(40, col) & ". " & Cells(41, col) & "."
       .Cells(17, 4) = Cells(43, col)
       .Cells(17, 5) = Cells(46, col)
    End With
Next col
        For col = 1 To 1
    With Worksheets(2)
       .Cells(18, 2) = Cells(49, col)
       .Cells(18, 3) = Cells(50, col) & ". " & Cells(51, col) & ". " & Cells(52, col) & ". " & Cells(53, col) & "."
       .Cells(18, 4) = Cells(55, col)
       .Cells(18, 5) = Cells(58, col)
    End With
Next col
        For col = 2 To 2
    With Worksheets(2)
       .Cells(19, 2) = Cells(49, col)
       .Cells(19, 3) = Cells(50, col) & ". " & Cells(51, col) & ". " & Cells(52, col) & ". " & Cells(53, col) & "."
       .Cells(19, 4) = Cells(55, col)
       .Cells(19, 5) = Cells(58, col)
    End With
Next col
        For col = 3 To 3
    With Worksheets(2)
       .Cells(20, 2) = Cells(49, col)
       .Cells(20, 3) = Cells(50, col) & ". " & Cells(51, col) & ". " & Cells(52, col) & ". " & Cells(53, col) & "."
       .Cells(20, 4) = Cells(55, col)
       .Cells(20, 5) = Cells(58, col)
    End With
Next col
        For col = 4 To 4
    With Worksheets(2)
       .Cells(21, 2) = Cells(49, col)
       .Cells(21, 3) = Cells(50, col) & ". " & Cells(51, col) & ". " & Cells(52, col) & ". " & Cells(53, col) & "."
       .Cells(21, 4) = Cells(55, col)
       .Cells(21, 5) = Cells(58, col)
    End With
Next col
        For col = 1 To 1
    With Worksheets(2)
       .Cells(22, 2) = Cells(61, col)
       .Cells(22, 3) = Cells(62, col) & ". " & Cells(63, col) & ". " & Cells(64, col) & ". " & Cells(65, col) & "."
       .Cells(22, 4) = Cells(67, col)
       .Cells(22, 5) = Cells(70, col)
    End With
Next col
        For col = 2 To 2
    With Worksheets(2)
       .Cells(23, 2) = Cells(61, col)
       .Cells(23, 3) = Cells(62, col) & ". " & Cells(63, col) & ". " & Cells(64, col) & ". " & Cells(65, col) & "."
       .Cells(23, 4) = Cells(67, col)
       .Cells(23, 5) = Cells(70, col)
    End With
Next col
        For col = 3 To 3
    With Worksheets(2)
       .Cells(24, 2) = Cells(61, col)
       .Cells(24, 3) = Cells(62, col) & ". " & Cells(63, col) & ". " & Cells(64, col) & ". " & Cells(65, col) & "."
       .Cells(24, 4) = Cells(67, col)
       .Cells(24, 5) = Cells(70, col)
    End With
Next col
        For col = 4 To 4
    With Worksheets(2)
       .Cells(25, 2) = Cells(61, col)
       .Cells(25, 3) = Cells(62, col) & ". " & Cells(63, col) & ". " & Cells(64, col) & ". " & Cells(65, col) & "."
       .Cells(25, 4) = Cells(67, col)
       .Cells(25, 5) = Cells(70, col)
    End With
Next col
        For col = 1 To 1
    With Worksheets(2)
       .Cells(26, 2) = Cells(73, col)
       .Cells(26, 3) = Cells(74, col) & ". " & Cells(75, col) & ". " & Cells(76, col) & ". " & Cells(77, col) & "."
       .Cells(26, 4) = Cells(79, col)
       .Cells(26, 5) = Cells(82, col)
    End With
Next col
        For col = 2 To 2
    With Worksheets(2)
       .Cells(27, 2) = Cells(73, col)
       .Cells(27, 3) = Cells(74, col) & ". " & Cells(75, col) & ". " & Cells(76, col) & ". " & Cells(77, col) & "."
       .Cells(27, 4) = Cells(79, col)
       .Cells(27, 5) = Cells(82, col)
    End With
Next col
        For col = 3 To 3
    With Worksheets(2)
       .Cells(28, 2) = Cells(73, col)
       .Cells(28, 3) = Cells(74, col) & ". " & Cells(75, col) & ". " & Cells(76, col) & ". " & Cells(77, col) & "."
       .Cells(28, 4) = Cells(79, col)
       .Cells(28, 5) = Cells(82, col)
    End With
Next col
        For col = 4 To 4
    With Worksheets(2)
       .Cells(29, 2) = Cells(73, col)
       .Cells(29, 3) = Cells(74, col) & ". " & Cells(75, col) & ". " & Cells(76, col) & ". " & Cells(77, col) & "."
       .Cells(29, 4) = Cells(79, col)
       .Cells(29, 5) = Cells(82, col)
    End With
Next col
        For col = 1 To 1
    With Worksheets(2)
       .Cells(30, 2) = Cells(85, col)
       .Cells(30, 3) = Cells(86, col) & ". " & Cells(87, col) & ". " & Cells(88, col) & ". " & Cells(89, col) & "."
       .Cells(30, 4) = Cells(91, col)
       .Cells(30, 5) = Cells(94, col)
    End With
Next col
        For col = 2 To 2
    With Worksheets(2)
       .Cells(31, 2) = Cells(85, col)
       .Cells(31, 3) = Cells(86, col) & ". " & Cells(87, col) & ". " & Cells(88, col) & ". " & Cells(89, col) & "."
       .Cells(31, 4) = Cells(91, col)
       .Cells(31, 5) = Cells(94, col)
    End With
Next col
        For col = 3 To 3
    With Worksheets(2)
       .Cells(32, 2) = Cells(85, col)
       .Cells(32, 3) = Cells(86, col) & ". " & Cells(87, col) & ". " & Cells(88, col) & ". " & Cells(89, col) & "."
       .Cells(32, 4) = Cells(91, col)
       .Cells(32, 5) = Cells(94, col)
    End With
Next col
        For col = 4 To 4
    With Worksheets(2)
       .Cells(33, 2) = Cells(85, col)
       .Cells(33, 3) = Cells(86, col) & ". " & Cells(87, col) & ". " & Cells(88, col) & ". " & Cells(89, col) & "."
       .Cells(33, 4) = Cells(91, col)
       .Cells(33, 5) = Cells(94, col)
    End With
Next col
End Sub

2 个答案:

答案 0 :(得分:2)

这是重构的Sub

注意事项:

  • 使用变量数组进行循环/数据处理,因为循环遍历单元格很慢

  • 您可以更改srcBlocks的值以控制要处理的块数,或从源数据中提取它

  • 如果移动,
  • 按索引引用目标表可能会有问题。更安全地通过名称Worksheets("SheetName")

  • 来引用它

Sub FormatData()
    Dim rw2 As Integer, rwA As Integer, colA As Integer
    Dim vDst() As Variant, vSrc As Variant
    Dim srcBlocks As Integer

    srcBlocks = 8 ' process 8 blocks of 12 rows

    vSrc = ActiveSheet.Range("A1:D" & srcBlocks * 12)
    ReDim vDst(1 To srcBlocks * 4 + 1, 1 To 5)

    For rwA = 0 To srcBlocks * 12 - 1 Step 12  ' = 0, 12, 24, ...
        For colA = 1 To 4                      ' 4 columns in Src
            rw2 = (rwA \ 12) * 4 + colA + 1    ' 4 Dst rws per block, = 2..5, 6..9, ...

            vDst(rw2, 2) = vSrc(rwA + 1, colA)
            vDst(rw2, 3) = vSrc(rwA + 2, colA) & ". " & _
                           vSrc(rwA + 3, colA) & ". " & _
                           vSrc(rwA + 4, colA) & ". " & _
                           vSrc(rwA + 5, colA) & "."
            vDst(rw2, 4) = vSrc(rwA + 7, colA)
            vDst(rw2, 5) = vSrc(rwA + 10, colA)
        Next colA
    Next rwA

    Worksheets(2).Range("A1:E" & CStr(srcBlocks * 4 + 1)) = vDst
End Sub

为源数据中的可变数量的列添加灵活性

Sub FormatData()
    Dim rw2 As Integer, rwA As Integer, colA As Integer
    Dim vDst() As Variant, vSrc As Variant
    Dim srcBlocks As Integer, srcColumns As Integer

    srcBlocks = 8  ' process 8 blocks of 12 rows '
    srcColumns = 5 ' Columns in source data '

    vSrc = ActiveSheet.Range( _
             ActiveSheet.Cells(1, 1), _
             ActiveSheet.Cells(srcBlocks * 12, srcColumns))
    ReDim vDst(1 To srcBlocks * srcColumns + 1, 1 To 5)

    For rwA = 0 To srcBlocks * 12 - 1 Step 12           ' = 0, 12, 24, ... '
        For colA = 1 To srcColumns                      ' srcColumns columns in Source '
            rw2 = (rwA \ 12) * srcColumns + colA + 1    ' srcColumns rows in Destination per Source block '

            vDst(rw2, 2) = vSrc(rwA + 1, colA)
            vDst(rw2, 3) = vSrc(rwA + 2, colA) & ". " & _
                         vSrc(rwA + 3, colA) & ". " & _
                         vSrc(rwA + 4, colA) & ". " & _
                         vSrc(rwA + 5, colA) & "."
            vDst(rw2, 4) = vSrc(rwA + 7, colA)
            vDst(rw2, 5) = vSrc(rwA + 10, colA)
        Next colA
    Next rwA

    Worksheets(2).Range("A1:E" & CStr(srcBlocks * 4 + 1)) = vDst
End Sub

答案 1 :(得分:1)

这是一种非常紧凑的方法,请注意rindex公式中的斜线是反斜杠:

Sub FormatData()

Dim rw As Integer
Dim rindex As Integer

  With Worksheets(2)
      For rw = 2 To 33
          rindex = (rw - 2) \ 4
          .Cells(rw, 2) = Cells(12 * rindex + 1, (rw - 1) - 4 * rindex)
          .Cells(rw, 3) = Cells(12 * rindex + 2, (rw - 1) - 4 * rindex) & "." & _
                          Cells(12 * rindex + 3, (rw - 1) - 4 * rindex) & "." & _
                          Cells(12 * rindex + 4, (rw - 1) - 4 * rindex) & "." & _
                          Cells(12 * rindex + 5, (rw - 1) - 4 * rindex) & "."
          .Cells(rw, 4) = Cells(12 * rindex + 7, (rw - 1) - 4 * rindex)
          .Cells(rw, 5) = Cells(12 * rindex + 10, (rw - 1) - 4 * rindex)
      Next rw
  End With

End Sub