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:
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