Excel - simplificacion codigo

 
Vista:

simplificacion codigo

Publicado por alfredo Torné Reverté (7 intervenciones) el 03/04/2013 19:45:33
Hola de nuevo Jcs,
Estoy siguiendo con mi control de faltas y tengo un par de problemas. El primero es anidar los 9 meses de que consta el curso. Y segundo la lentitud en que copia los datos de la matriz de una hoja a la otra, podria ir más ràpido? Os envio el codigo de un par de meses. Como podreis apreciar se mueve 8 celdas hacia la derecha cada mes " f= 8"

Sub pasardatos()
Dim e As Variant, f As Variant
Dim c As Variant, d As Variant
Dim i As Variant, j As Variant, MiMatriz(1 To 35, 1 To 7)
Dim advertencia As String

'------ SETEMBRE -----
If Range("H4").Text = "CFGS P3 MATI" Then


If Range("C4").Text = "SETEMBRE" Then 'si es SETEMBRE guardara les dades als dies de SETEMBRE.
c = 6
d = 2
e = Val(Range("E4").Value) * 40 - 37
f = 0
For i = 1 To 35
For j = 1 To 7
MiMatriz(i, j) = Worksheets("FALTES").Cells(c + i, j + d).Value
Worksheets("P3M").Cells(e + i, j + f).Value = Worksheets("FALTES").Cells(c + i, j + d).Value
Next j
Next i
Range("D7:I41").ClearContents
Range("H4").Select
End If 'fi de la instruccio de setembre.

'-------OCTUBRE-------

If Range("C4").Text = "OCTUBRE" Then 'si es OCTUBRE guardara les dades als dies de OCTUBRE.
c = 6
d = 2
e = Val(Range("E4").Value) * 40 - 37
f = 8
For i = 1 To 35
For j = 1 To 7
MiMatriz(i, j) = Worksheets("FALTES").Cells(c + i, j + d).Value
Worksheets("P3M").Cells(e + i, j + f).Value = Worksheets("FALTES").Cells(c + i, j + d).Value
Next j
Next i
Range("D7:I41").ClearContents
Range("H4").Select

End If 'fi de la instruccio de OCTUBRE.
Muchas gracias.
Saludos.
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
sin imagen de perfil

simplificacion codigo

Publicado por jcs (494 intervenciones) el 04/04/2013 09:11:15
Muy buenas.

Varias cosas que te puedo decir del código:
El código para cada mes es en esencia el mismo, así que se podría hacer uno solo que hiciera variar el dato “f”. ¿No hay otro dato en que se pueda sacar el mes diferente de C4? Porque si fuera numérico se podría convertir automáticamente. Si no es así, podrías utilizar una tabla, que con un BUSCARV te devolviera el valor de f en función de C4. Otra posibilidad es que en el código uses un SELECT CASE.

Otra cosa, según yo lo veo, la línea
MiMatriz(i, j) = Worksheets("FALTES").Cells(c + i, j + d).Value
No te sirve para nada

Todo lo anterior te va a hacer mejorar la rapidez de ejecución, pero muy poco, porque lo que realmente lo hace muy lento, es el par de bucles que hace que pase por ahí 245 veces, ejecutando instrucciones. Así, a ojo, yo creo que lo que puedes hacer es copiar todo el rango y luego pegarlo:

Con todo esto, el código podría quedar así:

SELECT CASE Range("C4").Text
Case “SETEMBRE”
f=0
Case “OCTUBRE”
f=0

END SELECT
c = 6
d = 2
e = Val(Range("E4").Value) * 40 – 37
Range("D7:I41").copy
Worksheets("P3M").select
Cells(e + 1, 1 + f). select
ActiveSheet.Paste
Worksheets("FALTES").select
Range("D7:I41").ClearContents
Range("H4").Select

Esto, si funciona, haría mejorar la rapidez de ejecución enormemente.

Ya me dirás.

Un saludo. Juanjo.
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

macro que funciona en todas las hojas

Publicado por ANDERSON (1 intervención) el 17/05/2017 12:04:53
solo quiero que funcione en la hoja regander pero al duplicar esta hoja funciona en todas, que puedo hacer ...


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub CopiarHoja()
    On Error Resume Next
    nombreHoja = InputBox("Indique el nombre de la Hoja que desea copiar")
    For x = 1 To Sheets.Count
        If ActiveWorkbook.Sheets(x).Name = nombreHoja Then
            ExisteHoja = True
            IndiceHoja = x
        End If
    Next x
 
    If ExisteHoja = True Then
        NumeroDeCopias = InputBox("Indique cuantas veces lo desea copiar")
        For y = 1 To NumeroDeCopias
            Nombre = Val(nombreHoja) + y
            Sheets(IndiceHoja).Select
            Sheets(IndiceHoja).Copy After:=Sheets(Sheets.Count)
            Sheets(Sheets.Count).Name = Nombre
        Next y
    Else
        MsgBox "La hoja no existe"
    End If
End Sub
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