Excel.Macros.Ejercicios: Abrir un libro excel, desde otro

En un articulo precedente, utilizamos una hoja de calculo que tenia las notas de varios alumnos para tres asignaturas, y realizamos distintas acciones sobre ella: la propuesta que os hago ahora es que abramos una hoja de calculo nueva, y, desde ella, abramos la hoja que contenía las notas y creemos en nuestro nuevo libro, una hoja con las calificaciones por alumno, esto es :una joja por alumno, con las notas de todas asignaturas con su nombre, en vertical. Pero, aunque por no complicar el ejercicio, los datos estarán en posiciones fijas, deberemos extraerlos nombres de las asignaturas.

Lo primero que hacemos, es abrir la hoja de notas, para ello comprobamos en que directorio de nuestro disco se encuentra, y despues la abrimos con:

Set Wb1 = Workbooks.Open("D:\documentos\Downloads\ejercicios\ej03.xls")

Esto nos dejara en la variable Wb1 el libro de notas, ahora utilizando With para no tener que estar repitiendo continuamente Wb1.Sheets(“Hoja1”), solamente pondremos un punto (.),  leemos las asignaturas, y las guardamos directamente en un array con

titulos = .Range("B5:D5").Value

y determinamos el numero de columnas (asignaturas) que contiene el rango con

num = .Range("B5:D5").Columns.Count

Si, estais en lo cierto, va a dar 3, pero…. asi hemos aprendido a contar las columnas que contiene un Range, o una selection…

Las dos siguientes instrucciones, nos encuentran la ultima celda antes de blanco después de A6, y nos monta una string que tendrá como celda inicial A6, luego dos puntos (:) y la celda encontrada. Ni mas ni menos que la forma de escribir un rango en excel, por lo que podemos utilizar celdaFin para establecer el rango en donde se encuentran los nombres de los alumnos, y con Cells, dejar en alumnos, la colección de celdas que contienen los nombres de los alumnos.

Ya estamos preparados para recorrer las celdas con los nombre, recordad que lo que recibimos en celda es realmente un rango, con todas sus posibilidades, por lo que para cada alumno, creamos una hoja, y le damos el nombre del alumno. y, en la hoja recien creada, vamos a escribir las asignaturas y las notas, por lo que hacemos un bucle para recorrer el array de titulos, segun el numero que calculamos antes, de columnas de notas.

En cada celda, vamos poniendo el nombre de la asignatura en columna 1, supongo que eso lo veis sin problemas, y en la columna 2 debemos poner la nota..vamos a ver como

hoja.Cells(a, 2).Value = celda.Offset(0, a).Value

Si tenemos en cuenta que celda es un range, que ademas apunta al nombre del alumno, cuando hago celda.Offset(0,a) estoy apuntando a la columna de la nota,teniendo en cuenta que, cuando a cambie de valor, también cambiará la celda desde la que tengo que recoger la nota…

Es un poco difícil de explicar, pero si ejecutáis la macro, con el paso a paso del debugger, y vais mirando los valores de las variables lo entenderéis fácilmente.

El resultado, debería ser un libro con una hoja por alumno mas o menos como este:

Hoja de calculo excel. Ejemplo de Macros

Aquí os dejo la macro

Sub leernotas()

Dim Wb1 As Workbook
Dim titulos As Variant
Dim alumnos As Range
Dim celda As Range
Dim hoja As Worksheet
Dim a As Integer
Dim celdaFin As String
Dim num As Integer

Application.ScreenUpdating = False

    Set Wb1 = Workbooks.Open("D:\documentos\Downloads\ejercicios\ej03.xls")
    With Wb1.Sheets("Hoja1")
        titulos = .Range("B5:D5").Value
        num = .Range("B5:D5").Columns.Count
        celdaFin = "A6:" & .Range("A6").End(xlDown).Address
        Set alumnos = .Range(celdaFin).Cells
        For Each celda In alumnos
            Set hoja = ThisWorkbook.Sheets.Add
            hoja.Name = celda.Value
            For a = 1 To num
                hoja.Cells(a, 1).Value = titulos(1, a)
                hoja.Cells(a, 2).Value = celda.Offset(0, a).Value
            Next a
        Next
    End With
    Application.ScreenUpdating = True
End Sub

Acerca de Miguel Garcia

Programador, Desarrollador web, Formador en distintas areas de informatica y director de equipos multidisciplinares.
Esta entrada fue publicada en Excel, Formacion y etiquetada , , . Guarda el enlace permanente.

Deja un comentario