Excel - Código VB Macro Expertos

   
Vista:

Código VB Macro Expertos

Publicado por Jorge A. Glez. Cano (7 intervenciones) el 30/12/2009 00:22:25
HOJA1 (datos Origen)
CUENTA--NOMBRE--MATERIA--CALIFICACION
555551-----Juan Perez-----001-----9
555551-----Juan Perez-----002-----7
555551-----Juan Perez-----005-----8
555552-----Pedro Chavez-----001-----6
555552-----Pedro Chavez-----002-----9
555552-----Pedro Chavez-----005-----7
555558-----Ines Flores-----001-----10
555558-----Ines Flores-----002-----9
555558-----Ines Flores-----005-----10

HOJA2 (Nueva Base destino)
CUENTA--NOMBRE--(001)--(002)--(005)
555551-----Juan Perez-----9-----7-----8
555552-----Pedro Chavez-----6-----9----7
555558-----Ines Flores-----10-----9-----10

En la hoja1, los datos se tienen "como de forma Vertical", se repiten los "numeros de cuenta" y los "nombres"; como veo que es muy repetitivo,
La Macro que les pido ayuda, es para crear en la Hoja2, datos "de forma Horizontal", en donde no se tienen que repetir los "numeros de cuenta", ni los "nombres" y, las calificaciones se ajusten de acuerdo a las materias, vamos cada fila sería un registro.

Ahora bien, les pongo el código VB, pero sólo copia en la Hoja2 el primer registro. El segundo registro, es la misma cuenta, con diferente materia, pero no lo copia. Lo que necesito es poner en la Hoja2 un registro con todas las materias (y calificaciones) de cada cuenta con su nombre (como aparece en el ej. de Hoja2 de arriba):

Sub Copia_Regis()
Sheets("hoja1").Select
ActiveSheet.Range("a2").Activate
NoCta = ActiveCell.Offset(0, 0)
APaterno = ActiveCell.Offset(0, 1)
AMaterno = ActiveCell.Offset(0, 2)
Nombre = ActiveCell.Offset(0, 3)
Grupo = ActiveCell.Offset(0, 4)
materia = ActiveCell.Offset(0, 5)
CalifBim1 = ActiveCell.Offset(0, 6)
Faltas = ActiveCell.Offset(0, 7)
Asist = ActiveCell.Offset(0, 8)
Selection.Copy
' Me posiciono en la 2a. base
Sheets("hoja2").Select
ActiveSheet.Range("A1").Activate
'Busca la última celda con datos
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Activate
Loop
ActiveCell.Offset(0, 0).Value = NoCta
ActiveCell.Offset(0, 1).Value = APaterno
ActiveCell.Offset(0, 2).Value = AMaterno
ActiveCell.Offset(0, 3).Value = Nombre
ActiveCell.Offset(0, 4).Value = Grupo
'Creo condicionales para saber a donde pertenece las
'calificaciones de acuerdo al No. de la Materia
'Pongo un contador en 0 paera la posicion de la celda
Posmateria = 0
If materia = 1400 Then
Posmateria = 5
End If
If materia = 1401 Then
Posmateria = 6
End If
If materia = 1402 Then
Posmateria = 7
End If
If materia = 1403 Then
Posmateria = 8
End If
If materia = 1404 Then
Posmateria = 9
End If
If materia = 1405 Then
Posmateria = 10
End If
If materia = 1406 Then
Posmateria = 11
End If
If materia = 1407 Then
Posmateria = 12
End If
If materia = 1408 Then
Posmateria = 13
End If
If materia = 1409 Then
Posmateria = 14
End If
If materia = 1410 Then
Posmateria = 15
End If
If materia = 1411 Then
Posmateria = 16
End If
If materia = 1412 Then
Posmateria = 17
End If
ActiveCell.Offset(0, Posmateria).Value = CalifBim1
ActiveCell.Offset(0, 18).Value = Faltas
ActiveCell.Offset(0, 19).Value = Asist
'Regresa a la Hoja de la 1a.BDatos
Sheets("hoja1").Select
' Regreso a la 1a. BD (Hoja1), y tengo que tomar la segunda fila y
' checo que sea el mismo No. de Cuenta, si es asi, copio los datos
' y de nuevo los tengo que poner en la Hoja2 (en la misma fila que
' le corresponde a la cuenta
End Sub

De antemano agradezco mucho su valiosa ayuda...

Jorge
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Código VB Macro Expertos

Publicado por Abraham Valencia (2418 intervenciones) el 30/12/2009 01:27:49
No es necesario que uses una macro. Create una tabla dinamica con los datos, como rotulos de filas usa los nombres y/o codigos, como rotulos de columna las materias y en los valores agrega las notas y listo, tendras todo como lo pediste

Luego, lo copias, lo pegas como "valores" y completas el codigo y/o nombre con BUSCARV

Abraham
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Código VB Macro Expertos

Publicado por Jorge A. Glez. Cano (1 intervención) el 30/12/2009 03:55:19
Abraham,

Gracias por el dato. Lo voy a hacer y te comento como me fue...
Lo importante es que tenga en la Hoja2 los datos "de forma vertical"; una fila por registro y cada columna es un campo; para después empezar a hacer busquedas, reportes, etc.
El punto es que la base creada, la va a manipular personas que no manejan mucho el excel (como yo..jijijiji) y que existan errores de dedo.
Con macros, creo evitar ese problema y solo le dejo al usuario "botones" y que las macros hagan lo demás... bueno, esa es la idea...
Recibe un cordial saludo y te platico como me fue va?

Jorge
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Código VB Macro Expertos

Publicado por Jorge A. Glez. Cano (7 intervenciones) el 30/12/2009 10:36:11
Abraham,

Ya encontré una solución. Te la paso para tener una referencia para futuras dudas que iré teniendo, pues apenas empiezo a usar código VB para Macros.
De antemano te agradezco el tiempo que me dedicaste.
Y como te decía, el chiste es que el usuario inexperto (como yo), no tenga que hacer cosas que despues por "error de dedo", se sufra...

HOJA1:
NcCta---A.Pater---A.Mater---Nombre---Grupo---Materia---Calific---Faltas---Asist.
90001---Flores---Perez---Fernando---A1001---100001---9----------1---------8
90002---Flores---Perez---Fernando---A1001---100002---7----------1---------8
90003---Flores---Perez---Fernando---A1001---100003---6----------1---------8
90004---Juarez---Ruiz---Armando---A1001---100001---6----------1---------8
90005---Juarez---Ruiz---Armando---A1001---100002---7----------1---------8
90006---Juarez---Ruiz---Armando---A1001---100003---8----------1---------8
90007---Marquez---Gomez---Irma---A1001---100001---7----------1---------8
90008---Marquez---Gomez---Irma---A1001---100002---7----------1---------8
90009---Marquez---Gomez---Irma---A1001---100003---6----------1---------8

HOJA2:
Poner los datos lineales de forma Horizontal

MACRO:
Sub Copia_Regis()
' Crea una Hoja1 con datos verticales a Hoja2 poniendo los datos horizontales
Sheets("hoja1").Select
ActiveSheet.Range("a2").Activate
FilaNoCta = 2
Do While Not IsEmpty(ActiveCell)
' Pongo en variables los datos
NoCta = ActiveCell.Offset(0, 0)
APaterno = ActiveCell.Offset(0, 1)
AMaterno = ActiveCell.Offset(0, 2)
Nombre = ActiveCell.Offset(0, 3)
Grupo = ActiveCell.Offset(0, 4)
' Paso los valores de las variables a la Hoja2
Sheets("Hoja2").Cells(FilaNoCta, 1) = NoCta
Sheets("Hoja2").Cells(FilaNoCta, 2) = APaterno
Sheets("Hoja2").Cells(FilaNoCta, 3) = AMaterno
Sheets("Hoja2").Cells(FilaNoCta, 4) = Nombre
Sheets("Hoja2").Cells(FilaNoCta, 5) = Grupo
'Hacer mientras el No. de cuenta sea el mismo
Do While ActiveCell.Offset(0, 0).Value = NoCta
materia = ActiveCell.Offset(0, 5)
Faltas = ActiveCell.Offset(0, 7)
Asist = ActiveCell.Offset(0, 8)
Select Case materia
Case 1400
PosMateria = 6
Case 1401
PosMateria = 9
Case 1402
PosMateria = 12
Case 1403
PosMateria = 15
Case 1404
PosMateria = 18
Case 1405
PosMateria = 21
Case 1406
PosMateria = 24
Case 1407
PosMateria = 27
Case 1408
PosMateria = 30
Case 1409
PosMateria = 33
Case 1410
PosMateria = 36
Case 1411
PosMateria = 39
Case 1412
PosMateria = 42
End Select
' Paso los datos a la Hoja2
CalifBim1 = ActiveCell.Offset(0, 6)
Sheets("Hoja2").Cells(FilaNoCta, PosMateria) = CalifBim1
Sheets("Hoja2").Cells(FilaNoCta, PosMateria + 1) = Faltas
Sheets("Hoja2").Cells(FilaNoCta, PosMateria + 2) = Asist
ActiveCell.Offset(1, 0).Activate
Loop
FilaNoCta = FilaNoCta + 1
Loop
End Sub

Saludos
Jorge
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar