Estoy escribiendo una macro para hacer un complejo de copiar/pegar el ejercicio. Es bastante sencillo conceptualmente, pero estoy atascado en un solo lugar. Todos los diferentes bloques de datos se identifican con diversos rangos con nombre. Necesito iterar a través de esta lista de nombres, que pasa cada nombre como argumento a una función (en realidad una subrutina, pero la misma idea). La fuente de los datos está en un libro, mientras que el destino se encuentra en otro libro.

Aquí es lo que tengo (para un bloque de datos):

Private Sub copyABU()
   copyPaste(ThisWorkbook.Names("myRange1").RefersToRange)
   copyPaste(ThisWorkbook.Names("myRange2").RefersToRange)
   copyPaste(ThisWorkbook.Names("myRange3").RefersToRange)
   //etc
End Sub

Private Sub copyPaste(thisRange As Range)
    Windows(someworkbook).Range(thisRange).Copy
    Range(thisRange).PasteSpecial Paste:=xlPasteValues
End Sub

Por desgracia, tengo un error en tiempo de ejecución en este. Yo creo que hay un tipo de desajuste, pero no estoy seguro acerca de esto, y no puedo entender lo que me estoy perdiendo. Cualquiera puede ver por qué esto no funciona? (Estoy usando Excel 2010).

Gracias!

InformationsquelleAutor AndroidDev | 2012-05-23

2 Comentarios

  1. 1

    El código de trabajo con un par de pequeños ajustes.

    Primer lugar, usted necesita agregar un prefijo a su llamada a copyPaste con la palabra Call. (Vea la nota de abajo si usted no lo desea.)

    Private Sub copyABU()
       Call copyPaste(ThisWorkbook.Names("myRange1").RefersToRange)
       Call copyPaste(ThisWorkbook.Names("myRange2").RefersToRange)
       Call copyPaste(ThisWorkbook.Names("myRange3").RefersToRange)
       ' //etc
    End Sub

    Segundo, agregar un .Address después de thisRange.

    Private Sub copyPaste(thisRange As Range)
        Range(thisRange.Address).Copy
        thisRange.PasteSpecial Paste:=xlPasteValues
    End Sub

    No quería molestar con la creación de un someworkbook variable, por lo que sólo he eliminado esa parte.

    Nota: Usted tiene que utilizar el Call palabra clave si se llama a un procedimiento con una lista de argumentos entre paréntesis. https://stackoverflow.com/a/7715070/138938

    Si usted no desea utilizar el Call palabra clave, omitir los paréntesis:

    copyPaste ThisWorkbook.Names("myRange1").RefersToRange
  2. 1

    aquí mi respuesta:

    Sub init()
    Windows("Book1.xlsx").Activate
    Call copyPaste(2, Range(Cells(1, 1), Cells(10, 10)), "copy")
    Windows("Book2.xlsx").Activate
    Call copyPaste(1, Range(Cells(1, 1), Cells(10, 10)), "paste")
    End Sub
    
    Function copyPaste(wksInt As Integer, thisRange As Range, copyPasteStr As String)
        Dim workSheetRange As Range
        With Worksheets(wksInt)
            Set workSheetRange = thisRange
        End With
        workSheetRange.Select
        If copyPasteStr = "copy" Then
            Selection.Copy
        Else
            Worksheets(wksInt).Paste
        End If
    End Function

    Esto funciona siempre y cuando los Rangos para copiar y pegar la misma dimensión. Si la dimensión varía, usted necesita para cambiar workSheetRange.Seleccione en la condición y sólo tiene que seleccionar la primera celda del rango para pegar. PAX

    • Gracias. Me olvidé de mencionar 2 cosas: en Primer lugar, sólo tengo un único archivo de código fuente y un archivo de destino único, por lo que los nombres de los libros son de fácil. Segundo, el nombre de rango son idénticos en ambos archivos. Así que el único argumento necesario para ser pasados a la función es el nombre de la gama que estoy tratando en ese momento en particular. Si yo puedo lograr eso, el resto debe ser fácil. Incluso con su sugerencia, todavía tengo el mismo problema, que es que no puedo conseguir el argumento a pasar en el destinatario de la función, incluso si todo lo que hice fue un «Hola Mundo» cuadro de mensaje dentro de ella.
    • Creo que lo he conseguido. En lugar de tratar de pasar la gama como un objeto, acabo de pasar el nombre de la gama como una cadena y luego se fue de allí. Parece que funciona muy bien. Gracias por la ayuda! Se los agradezco.
    • tal vez usted ha visto a mi actualiza el código de arriba, así que si esto te ayudó, usted puede podría cerrar el caso. THX PS: si hay alguna pregunta más sobre el uso de diferentes rangos, házmelo saber!

Dejar respuesta

Please enter your comment!
Please enter your name here