2012-04-19 37 views
5

A pesar de que muchas de las publicaciones que revisé son las mismas que en mi pregunta, ninguna de las respuestas satisface lo que estoy buscando. Si puedes vincularme a uno, con gusto lo leería.VBA - ¿Cómo copiar una fila en Excel de un libro de trabajo a otro?

Tengo un libro de trabajo con hojas de trabajo. Para simplificar, digamos que mi libro de trabajo tiene una hoja de trabajo. Y en mi hoja de trabajo que se llama "Hoja1", hay datos en las celdas A1 a A4.

Lo que yo quiero que mi código VBA que hacer es:

  1. Copiar la fila 1 (o específicamente las celdas A1 a A4) de libro de trabajo 'A' en la variable Rango 'myRange'
  2. Cree un nuevo libro, vamos a llamar a este libro de trabajo 'B'
  3. Dar Cuaderno 'de B por defecto 'Sheet1' un nuevo nombre a 'nombre de la prueba'
  4. Abrir Libro de Trabajo 'B'(aunque soy consciente de que el código VBA 'Workbooks.Add' se abre una nueva reservar para que este paso sea redundante ya que Workbooks.Add cubre la mitad del punto 2 y 3)
  5. Pegue 'myRange' en la primera fila del 'Libro de trabajo B'
  6. Guarde el 'Libro de trabajo B' con el nombre 'Libro de prueba' y una marca de tiempo entre corchetes. El archivo debe ser también de la extensión de archivo "xls"
  7. Cerrar 'Cuaderno B' y restablecer el 'Cuaderno A'

Lo que tengo hasta ahora es la siguiente:

Sub OpenAndSaveNewBook() 
    'Declarations 
    Dim MyBook As String 
    Dim MyRange As Range 
    Dim newBook As Workbook 

    'Get name of current wb 
    MyBook = ThisWorkbook.Name 
    Set MyRange = MyBook.Sheets("Sheet1").Range("A1,F1") 

    'Create/Open new wb 
    newBook = Workbooks.Add 

    'Save new wb with XLS extension 
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "/" & "TEST-BOOK", _ 
          FileFormat:=xlNormal, CreateBackup:=False 

    '===NOTE: BEFORE THE FOLLOWING RUNS I NEED TO PERFORM ACTIONS ON CELLS VIA VBA ON 
    '===WORKBOOK 'A'. DOES THE NEWLY CREATE WORKBOOK BECOME THE PRIMARY/ACTIVE WORKBOOK 
    '===? AND SO THEN DO I NEED TO ACTIVATE WORKBOOK 'A'? 
    ActiveWorkbook.Close savechanges:=True 

    'Return focus to workbook 'a' 
    MyBook.Activate 
End Sub 

Como puede ver, me falta el código que se encargará de:

  • el pegado de mis datos copiados en el nuevo libro
  • el cambio de la nueva Nombre sheet1 del libro a otra cosa
  • añadir una marca de tiempo a la cadena de nombre de archivo al guardar

Por último, he incluido una pregunta en mi código que creo que puede tener una mala interpretación del método ActiveWorkbook. AFAIK cuando el código "Workbooks.Add" ejecuta esto se convierte en el Active Workbook, es decir, uno con el foco. ¿Esto afecta a cómo se ejecuta el código de VBA en el Libro de trabajo 'A'? ¿Esto significa que si quisiera agregar código para manipular las celdas del Libro de trabajo 'A', entonces necesitaría usar "MyBook.Activate", donde 'MyBook' contiene la cadena del título real del libro 'A'?

Cualquier ayuda será muy apreciada.

Gracias, QF

Respuesta

9

En lugar de copiar pegar la forma en que se ha mencionado anteriormente, se pueden hacer directamente esto. Esto también negará el uso de una variable.

MyBook.Sheets("Sheet1").Rows("1:4").copy _ 
newBook.Sheets("Sheet1").Rows("1") 

EDITAR

me he dado cuenta de un error con su código.

newBook = Workbooks.Add 

Esta línea le dará un error ya que tienes que usar Set

El código puede ser escrito como

Option Explicit 

Sub OpenAndSaveNewBook() 
    Dim MyBook As Workbook, newBook As Workbook 
    Dim FileNm As String 

    Set MyBook = ThisWorkbook 

    FileNm = ThisWorkbook.Path & "\" & "TEST-BOOK.xls" 
    Set newBook = Workbooks.Add 

    With newBook 
     MyBook.Sheets("Sheet1").Rows("1:4").Copy .Sheets("Sheet1").Rows("1") 

     'Save new wb with XLS extension 
     .SaveAs Filename:=FileNm, FileFormat:=xlNormal, CreateBackup:=False 

     .Close Savechanges:=False 
    End With 
End Sub 

más editar

Abundando en el uso de SET

Le recomendaría que vea esta publicación.

LINK: Worksheets does not work

+0

Haga 'newBook.SaveAs' y' newBook.Close' también. Como has descubierto, puede ser confuso saber a qué se refiere ActiveWorkbook, por lo que es mejor utilizar referencias explícitas siempre que sea posible. – e100

+0

Gracias por su respuesta. Soy un novato de VBA y recibo un mensaje de error 'Calificador Inválido' después de su sugerencia. Supongo que esto se debe a que MyBook es del tipo incorrecto. Además, esto realmente no tiene sentido para mí, ¿dónde está el comando para pegar en newBook? ¿Podrías elaborar? –

+0

@ e100: Estaba editando mi publicación cuando publicó este comentario :) –

3

La cosa impresionante acerca de Excel es la función 'Grabar macro'. Empecé a grabar una macro y limitaba a seguir los pasos que usted ha enunciado, entonces hice algunas modificaciones menores al código que Excel proporciona como la macro grabada:

Range("A1:F1").Select 
Selection.Copy 
Workbooks.Add 
ActiveSheet.Paste 
Sheets("Sheet1").Name = "Test Name" 
Application.CutCopyMode = False 
myNewFileName = myPath & myTestName & "_" & Date & ".xls" 
ActiveWorkbook.SaveAs Filename:=myNewFileName _ 
    , FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False 

La función Date devuelve la fecha actual del sistema. Es importante tener en cuenta que los corchetes que desea no son caracteres de nombre de archivo válidos; Excel arrojará un error si intenta usarlos.

+0

"... Es importante tener en cuenta que los corchetes ... arrojarán un error si intentas usarlos". No tenía ni idea sobre eso. Muchas gracias por tu respuesta. –

4

Evite las referencias a ActiveWorkbook a favor de referencias explícitas siempre que sea posible.

Como has encontrado, puede ser confuso saber lo que está activo actualmente, y no es necesario activar un libro de trabajo para manipularlo.

Por lo tanto usted debe utilizar

newBook.SaveAs... 
newBook.Close... 

Las macros grabadas tienden a activar los libros de trabajo con el fin de trabajar en ellos, pero eso es porque esa es la forma en que un ser humano que las grabó funciona! Toda la activación realmente es cambiar el enfoque.

Lo mismo se aplica a hacer selecciones y luego manipular la selección actual; no es necesario en VBA y tiende a ser más lento que la manipulación directa.

+0

Gracias por la claridad en ActiveWorkbook. –

1

Encienda los macrograbadores; ejecuta cuidadosamente los pasos que quieras; detener el grabador; "editar" la macro generada. Repare lo que necesite para hacer que el programa que desea, por ejemplo, lo parametrice.

Cuestiones relacionadas