2011-04-29 12 views
5

Sí, he escrito esta macro para Microsoft Excel (2010 si eso ayuda), con la ayuda de otra persona. Me pregunto si alguien tiene una forma de acortarlo y hacerlo más eficiente. Sin embargo, ¿sigue obteniendo el mismo resultado que dio antes? Un ejemplo del formato CSV con el que tengo que trabajar se puede encontrar aquí ... Y sí, lamentablemente, tienen que colocarse en esas columnas y celdas ...Microsoft Excel 2010 Copiar/Pegar Editar ideas y solicitud de ayuda sobre detalles menores

El único problema en el que estoy realmente perplejo es esto : en .Cell(2, 3) por ejemplo ... Si nota, en cada sección copiaría y pegaría, tiene una nueva fila ... Quiero que haga eso ... Soy novato en esto, y no pude encontrar una manera de haz que pegue cada uno en la siguiente fila disponible ... Así que mi solución para esto fue hacer 2, 3, 4, 5 ... Y así sucesivamente ... Si alguien sabe cómo cambiar esto también para hacer esto ... Loop ? Por decir, sería una gran ayuda. Simplemente repita la cantidad de datos que se está copiando y no repita.

Aquí hay un CSV de ejemplo: Media Fire Es limpio, lo prometo. Gracias por tu tiempo.

código de macro para copiar ciertas celdas de datos de columnas/filas de una hoja a otra a células específicas

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 
+0

ok, actualizados la respuesta, funciona muy bien con sus datos ahora. –

Respuesta

2

He aquí una refactorizado Sub

Puntos a destacar:

  • matrices uso de variantes para el procesamiento de bucle/datos porque bucle a través de las células es lento

  • puede cambiar el valor de srcBlocks para controlar cuántos bloques para procesar, o extraerlo de los datos de origen

  • referirse a la hoja de destino por índice puede ser problemático si se mueve. Más seguro para referirse a él por nombre 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 

Para añadir flexability, de número variable de columnas de datos de origen

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 
+0

Si tuviera que cambiar la cantidad de filas que debía copiar en la hoja dos, para asegurarme de no estropearla ... ¿Cómo haría eso? Aparte de eso, funciona muy bien! ¡Gracias! (creo que quieres decir que srcBlocks es eso, ¿correcto?) – Leaum

+0

@Leaum, respuesta actualizada para permitir el número variable de columnas. No estoy seguro de lo que estás preguntando sobre srcBlocks? –

1

Aquí está una manera muy compacta de hacerlo, tenga en cuenta que la barra en la fórmula rindex es una barra invertida:

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 
+0

+1. Eso es muy eficiente. –

Cuestiones relacionadas