Insertar filas entre dos

08/07/2007 - 13:11 por Feliciano | Informe spam
Hola a todos:
En el desarrollo de una macro necesito incluir una instruccion para insertar
tantas lineas como las indicadas con la siguiente formula:
+SI(RESIDUO(B1;4)>0;365;366)-2 donde B1 es un año determinado; por ejemplo
para el año 2007 nos daria 363 y para el 2008 año bisiesto nos daria 364.
Esta cantidad de lineas son las que necesito insertar entre el primer y
ultimo dia del año que se encuentran respectivamente en las celdas A4 y A5
(antes de insertar).
La idea es registrar desde la celda A4 (primer dia del año) todos los dias
del año con solo introducir el año en la celda B1.
En la macro expuesta inserto solo 5 filas hasta no averiguar como se
insertan 364 o 363 (en funcion de si el año es o no bisiesto).

Gracias anticipadas y saludos cordiales,

Feliciano.

Nota: a continuacion pego las instrucciones que llevo hasta ahora; seguro
que es mejorable y en este sentido agradeceria vuestros comentario:
Sub Macro1()
'
' Macro1 Macro
' Macro grabada el 08/07/2007
'
' Antes de nada nos posicionamos en B2 para indicar el año; por ejemplo
2007.
'
Range("D1").Select
'
' Con ActiveCell.FormulaR1C1 = "=+IF(MOD(RC[-2],4)>0,365,366)" calculamos
los días
' que tiene el año indicado en B2; para 2007 como ejemplo arroja 365.
'
ActiveCell.FormulaR1C1 = "=+IF(MOD(RC[-2],4)>0,365,366)"
'
Range("A4").Select
'
' Con ActiveCell.FormulaR1C1 = "=+DATE(R[-3]C[1],1,1)" calculamos y grabamos
el
' primer día del año; para 2007 del ejemplo arroja 01/01/2007
'
ActiveCell.FormulaR1C1 = "=+DATE(R[-3]C[1],1,1)"
'
Range("A5").Select
'
' Con ActiveCell.FormulaR1C1 = "=+R[-1]C+R[-4]C[3]-1" calculo y grabo el
último día
' del año; para el año 2007 del ejemplo sería 31/12/2007.
'
ActiveCell.FormulaR1C1 = "=+R[-1]C+R[-4]C[3]-1"
'
' Con Selection.EntireRow.Insert se inserta una fíla. Como aún estoy en la
celda
' A5 e introduzco 5 veces la misma instrucción [cuestión pendiente hasta
saber ¿cómo
' introducir directamente las 363 filas necesarias?], la fecha 31/12/2007
pasa de
' la celda A5 a la celda A10.
'
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
'
' Con ActiveCell.FormulaR1C1 = "=+R[-1]C+1" calculo y grabo el segundo día
del año;
' para el año 2007 del ejemplo ya teníamo informado en A4 el primer día del
año
' y como aún sigo estando en A5 basta con añadir 1 al contenido de A4
obtenemos
' 02/01/2007.
'
ActiveCell.FormulaR1C1 = "=+R[-1]C+1"
'
Selection.Copy
Range("A6").Select
ActiveSheet.Paste
'
' Con Application.CutCopyMode = False no sé realmente lo que hace ¿no corte
el contenido?
'
Application.CutCopyMode = False
'
' Con Selection.AutoFill Destination:=Range("A6:A9"), Type:=xlFillDefault
¿se indica
' el destino de pegado con formato defecto igual al de origen?
Selection.AutoFill Destination:=Range("A6:A9"), Type:=xlFillDefault
Range("A6:A9").Select
Range("A4").Select
'
End Sub

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
08/07/2007 - 20:42 | Informe spam
hola, Feliciano !

En... una macro necesito... una instruccion para insertar tantas lineas como las indicadas con la siguiente formula:
+SI(RESIDUO(B1;4)>0;365;366)-2
donde B1 es un a#o determinado; por ejemplo para el a#o 2007 nos daria 363 y para el 2008 a#o bisiesto nos daria 364.
... lineas... que necesito insertar entre el primer y ultimo dia del a#o que se encuentran respectivamente en... A4 y A5 (antes de insertar).
La idea es registrar desde la celda A4 (primer dia del a#o) todos los dias del a#o con solo introducir el a#o en la celda B1.
En la macro expuesta inserto solo 5 filas hasta no averiguar como se insertan 364 o 363 (en funcion de si el a#o es o no bisiesto)...



con el siguiente procedimiento [como ejemplo] solo necesitas tener dos fechas: la inicial y la final [p.e. en 'A4' y 'A5']
los dias [o fechas] entre ambas son 'ajustados' [insertados y rellenados] por el codigo:

Sub Fechas_consecutivas()
Dim Dias_faltantes As Long
With Range("a4")
Dias_faltantes = CLng(CDate(.Offset(1))) - CLng(CDate(.Value)) - 1
.Offset(1).Resize(Dias_faltantes).EntireRow.Insert
.AutoFill .Resize(Dias_faltantes + 1), xlFillDays
End With
End Sub

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#2 Feliciano
08/07/2007 - 21:51 | Informe spam
Hola Hector:
Antes de nada gracias por responder y por el procedimiento que me has
enviado.
He modificado la macro y ha quedado asi:
Sub Macro1()
Range("D1").Select
ActiveCell.FormulaR1C1 = "=+IF(MOD(RC[-2],4)>0,365,366)"
Range("A4").Select
ActiveCell.FormulaR1C1 = "=+DATE(R[-3]C[1],1,1)"
Range("A5").Select
ActiveCell.FormulaR1C1 = "=+R[-1]C+R[-4]C[3]-1"
End Sub

A continuacion ejecuto el procedimiento y efectivamente inserta las filas
necesarias pero siempre aparece la misma fecha (01/01/1900). Supongo que
aparece la misma fecha por introducir =+FECHA(B2;1;1) en la celda A5,
=+FECHA(B3;1;1) en la celda A6 y asi sucesivamente en todas las filas
insertadas, es decir hasta la celda anterior correspondiente al ultimo dia
del año. ¿Se podria cambiar en las nuevas celdas =+A4+1 en la celda A5,
=+A5+1 en la celda A6 y asi sucesivamente en todas hasta la anterior al
ultimo dia del año?.

Saludos,

Feliciano.
"Héctor Miguel" escribió en el mensaje
news:er3k7%
hola, Feliciano !

En... una macro necesito... una instruccion para insertar tantas lineas
como las indicadas con la siguiente formula:
+SI(RESIDUO(B1;4)>0;365;366)-2
donde B1 es un a#o determinado; por ejemplo para el a#o 2007 nos daria
363 y para el 2008 a#o bisiesto nos daria 364.
... lineas... que necesito insertar entre el primer y ultimo dia del a#o
que se encuentran respectivamente en... A4 y A5 (antes de insertar).
La idea es registrar desde la celda A4 (primer dia del a#o) todos los
dias del a#o con solo introducir el a#o en la celda B1.
En la macro expuesta inserto solo 5 filas hasta no averiguar como se
insertan 364 o 363 (en funcion de si el a#o es o no bisiesto)...



con el siguiente procedimiento [como ejemplo] solo necesitas tener dos
fechas: la inicial y la final [p.e. en 'A4' y 'A5']
los dias [o fechas] entre ambas son 'ajustados' [insertados y rellenados]
por el codigo:

Sub Fechas_consecutivas()
Dim Dias_faltantes As Long
With Range("a4")
Dias_faltantes = CLng(CDate(.Offset(1))) - CLng(CDate(.Value)) - 1
.Offset(1).Resize(Dias_faltantes).EntireRow.Insert
.AutoFill .Resize(Dias_faltantes + 1), xlFillDays
End With
End Sub

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

Respuesta Responder a este mensaje
#3 Ivan
09/07/2007 - 00:06 | Informe spam
hola chicos,

disculpadme por meter el cazo en plato ajeno, pero Hector me acaba de volver a dejar alucinado (Llevaba un buen rato
buscando la forma de insertar multiples filas de un golpe sin tener muy claro como)

probando su codigo, y, en tanto regresa el,

esto parece funcionar, aunque solo sea como posibilidad

(espero que no te moleste (Hector) que envie esta adaptacion de tu codigo)

eso si, prescinde de las formulas y usa el change de la hoja. Se supone que el año se ingresa en la celda B1.

' en el modulo de la hoja:


Private Sub Worksheet_Change(ByVal Target As Range)
If Application.Intersect(Rows(1), Columns(2)).Address = Target.Address Then
If Range("a4") <> "" Then Range("a4:a" & Range("a65536").End(xlUp).Row).Clear
Fechas_consecutivas_adaptado
End If
End Sub

' en el mismo modulo o en uno normal (no se que opinara Hector)

Sub Fechas_consecutivas_adaptado()
Dim Dias_faltantes As Long, año As Integer
If Range("b1") <> "" And IsNumeric(Range("b1")) Then
año = Range("b1")
With Range("a4")
.Value = "01/01/" & año: .Offset(1) = "31/12/" & año
Dias_faltantes = CLng(CDate(.Offset(1))) - CLng(CDate(.Value)) - 1
.Offset(1).Resize(Dias_faltantes).EntireRow.Insert
.AutoFill .Resize(Dias_faltantes + 1), xlFillDays
Range(.Address & ":" & .End(xlDown).Address).NumberFormat = "dddd d mmm yy"
End With
End If
End Sub

bueno, lo dicho, no se deja de aprender en cada visita al foro. Muchas gracias
un saludo
Ivan
Respuesta Responder a este mensaje
#4 Héctor Miguel
09/07/2007 - 02:29 | Informe spam
hola, chicos !

de acuerdo con el comentario previo a la propuesta de codigo:
"con el siguiente procedimiento [como ejemplo] solo necesitas tener dos fechas: la inicial y la final [p.e. en 'A4' y 'A5']"
"los dias [o fechas] entre ambas son 'ajustados' [insertados y rellenados] por el codigo:"

el *razonamiento* fue precisamente para no tener que *procuparme* por algunos factores
[como convencionalismos regionales, formatos, formulas, etc.] p.e.:
- si el formato de fechas debe ser dd/mm/aa, mm/dd/aa, o culquiera otro
- que no importe ni sea necesario especificar al a#o en alguna celda [como 'B1' o cualquiera otra]
- que no sea necesario usar formulas en las celdas para determinar si es bisiesto o no
[el codigo esta simplemente rellenando dias entre dos fechas]

[requisitos]: poner dos fechas p.e. [A4] inicial y [A5} final [se supone que el formato y orden ya estan *dados*]
*el resto*... lo hace el codigo [p.e. no tiene por que ser los 365/366 dias]
prueba en [A4] con una fecha cualquiera y en [A5} una fecha p.e. 10 dias despues

si cualquier duda [o informacion adicional]... comantas/n ?
saludos,
hector.
Respuesta Responder a este mensaje
#5 Héctor Miguel
09/07/2007 - 02:48 | Informe spam
P.D. [por si no estuviera claro]:

Ivan: [hasta donde se] las propuestas que se hacen [precisamente]
-> son para que cada quien les adapte mejoras segun sea su mejor conveniencia
recuerda que son solamente *eso*: propuestas basadas en los datos que se desprenden de una consulta

-> lo que [me parece que] no hay que olvidar, es que "trabajar con fechas en excel y vba..." :))

saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida