Microsoft Excel 2010 Копировать / Вставить Редактировать Идеи и Запрос справки на незначительные детали - PullRequest
5 голосов
/ 29 апреля 2011

Да, я написал этот макрос для 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 ]

2 голосов
/ 30 апреля 2011

Вот рефакторинг 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 голос
/ 29 апреля 2011

Вот довольно компактный способ сделать это, обратите внимание, что косая черта в формуле 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...