insertar fila en blanco

24/03/2006 - 18:20 por klomkbock | Informe spam
Hola a todos

Supongo que no debe ser dificil, pero llevo tropecientos intentos y no
consigo dar con ello. Quiero insertar una fila en blanco si se cumplen
unas condiciones. El ultimo intento ha sido asi:

With Celda2 In .Range(.[f6], .[f65536].End(xlUp))
If .Value <> .Offset(-1, 0) And .ofsset(-1, 0) <> "" _
And IsNumeric(.Offset(-1, -5)) Then
Rows(.EntireRow).Insert shift:=xlUp

Para que no de problemas al principio del codigo he puesto:

For Each Celda2 In .Range(.[f7], .[f65536].End(xlUp))
If .[f65536].End(xlUp).Row = 5 Then
Exit For
ElseIf Celda2 = "" Then
Rows(Celda2.EntireRow).Delete
End If
Next Celda2

En cualquier caso no consigo dominar/comprender el uso de insert.

Si podeis ayudarme os lo agradezco.

Un saludo y hasta pronto
Ivan

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
25/03/2006 - 06:15 | Informe spam
hola, Ivan !

... insertar una fila en blanco si se cumplen unas condiciones. El ultimo intento ha sido asi:
With Celda2 In .Range(.[f6], .[f65536].End(xlUp))
If .Value <> .Offset(-1, 0) And .ofsset(-1, 0) <> "" _
And IsNumeric(.Offset(-1, -5)) Then
Rows(.EntireRow).Insert shift:=xlUp
Para que no de problemas al principio del codigo he puesto:
For Each Celda2 In .Range(.[f7], .[f65536].End(xlUp))
If .[f65536].End(xlUp).Row = 5 Then
Exit For
ElseIf Celda2 = "" Then
Rows(Celda2.EntireRow).Delete
End If
Next Celda2
En cualquier caso no consigo dominar/comprender el uso de insert.



1) no puedes 'combinar' estructuras de diferente tipo [p.e.]
o utilizas With...End With
o utilizas For <Contador> = <Minimo> To <Maximo> ... Next
o utilizas For Each <Variable> In <Alcance> ... Next

2) el uso del 'With' es util para evitar una 'repeticion' del objeto al que se necesita hacer referencia [p.e.]

a) SIN el 'With' es necesario 'repetir' la variable 'Celda2' -> DENTRO del bucle 'For...Next'
For Each Celda2 In .Range(.[f6], .[f65536].End(xlUp))
If Celda2 <> Celda2.Offset(-1) And Celda2.Ofsset(-1) <> "" _
And IsNumeric(Celda2.Offset(-1, -5)) Then
' aqui las instrucciones... '
End If
Next

b) CON el 'With' puedes evitar la repeticion de la variable 'Celda2' -> DENTRO del bloque 'With' ;)
For Each Celda2 In .Range(.[f6], .[f65536].End(xlUp))
With Celda2
If .Value <> .Offset(-1) And .Ofsset(-1) <> "" And IsNumeric(.Offset(-1, -5)) Then
' aqui las instrucciones... '
End If
End With
Next

has pruebas y... si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#2 klomkbock
25/03/2006 - 19:53 | Informe spam
Hola Hector Miguel, muchas gracias de nuevo.

b) CON el 'With' puedes evitar la repeticion de la variable 'Celda2' ->




DENTRO del bloque 'With'

Me temo que(raro en mi) he pecado de breve en mi consulta. En realidad en
el codigo lo tengo puesto practicamente igual que en tu ejemplo, aunque
dentro de un For Each bastante extenso, que no es el que expongo en la
consulta. Este lo que hace (o al menos intento que haga) es eliminar las
filas que luego voy a insertar incrementadas dependiendo de los nuevos
datos introducidos en una hoja.

El codigo, sin las instrucciones relacionadas con el insert funciona
bastante bien, pero no consigo que "este" me obedezca (lo cierto es que ya
me ha pasado en alguna otra ocasion). Debe haber algo en el metodo Insert
(aparentemente sencillo en su sintaxis) que se me escapa, y de momento no
logro dar con ello. Tambien puede ser que en este codigo cometa algun
error, pues es bastante largo y enrevesado (y probablemente
innecesariamente repetitivo). Aqui es donde me gustaria que me echaras una
mano: con el dichoso Insert. Al final te envio el codigo, con las
instruciones que tienen que ver con el insert, puestos como comentario.
Por supuesto hay algunas instrucciones que elimino al hacer las pruebas
por no ser necesarias ya. Lo que hace el codigo (antes de empezar a probar
el insert) es sacar el subtotal de cada pedido de una lista de articulos
pedidos y colocarlo en las celdas a la derecha de la primera fila de cada
pedido. Con el insert trataba de trasladar estas celdas debajo decampo
correspondiente de cada pedido.



Da la casualidad de que las instrucciones que hacian referencia a insert
(y muchas otras) ya no son necesarias, pues resulta que he descubierto -lo
que hace currar la ignorancia- el metodo subtotal. Pero sigo con el insert
dandome vueltas a la cabeza. Si me puedes echar una mano una vez mas, te
lo agradezco.

El codigo es pesado pero lo que interesa esta en forma de comentario.

En cualquier caso muchas gracias.
Un saludo y hasta pronto
Ivan

Sub GuardarPedidoCasiCasiOk3()
Dim Cliente As String, i As Long
Dim Celda As Range, Celda2 As Range
Dim Total As Long, Piezas As Long
Application.ScreenUpdating = False
With Worksheets("Hoja1"): Cliente = .[b1]
If .[b1] = "" Then
MsgBox ("Falta el nombre del cliente.")
.Activate: .[b1].Select: Exit Sub
ElseIf .[e1] = "" Then
MsgBox ("Falta el numero del pedido.")
.Activate: .[e1].Select: Exit Sub
End If
On Error Resume Next
If IsError(ActiveWorkbook.Sheets(Cliente)) Then
Worksheets.Add After:=Worksheets("Hoja1")
ActiveSheet.Name = Cliente
.[a1:c3].Copy
With Worksheets(Cliente): .[a1].PasteSpecial xlPasteValues
.[a5:g5] = Array _
("Pedi", "Cod", "Nombre", "Precio", "Total", "NºPedi", "Fecha")
.[d1] = "PIEZAS": .[d2] = "TOTAL $"
' For Each Celda2 In .Range(.[f7], .[f65536].End(xlUp))
' If .[f65536].End(xlUp).Row = 5 Then
' Exit For
' ElseIf Celda2 = "" Then
' Rows(Celda2.EntireRow).Delete
' End If
' Next Celda2
End With: End If
With .[a65536].End(xlUp)
If .Row = 5 Then
MsgBox ("No has introducido la cantidad pedida.")
.Activate: .Offset(1, 0).Select: Exit Sub
ElseIf .Row > 5 And Not IsNumeric(.Value) Then
MsgBox ("El dato introducido no es valido, revisalo.")
.Activate: .Select: Exit Sub
Else
Range(Range("a6"), .Range).Sort (.[a6])
End If: End With
For Each Celda In .Range(.[a6], .[a65536].End(xlUp))
.Range(Celda, Celda.Offset(, 2)).Copy
With Worksheets(Cliente): i = .[a65536].End(xlUp).Row
.Range(.[a1].Offset(i, 0), .[c1] _
.Offset(i, 0)).PasteSpecial xlPasteValues
Celda.Offset(0, 4).Copy
.[d1].Offset(i, 0).PasteSpecial xlPasteValues
.[e1].Offset(i, 0) = Celda.Offset(0, 4) * Celda
.[f1].Offset(i, 0) = Worksheets("Hoja1").[e1]
.[g1].Offset(i, 0) = Worksheets("Hoja1").[e2]
.[g1].Offset(i, 0) = FormatDateTime(.[g1].Offset(i, 0))
Celda.Offset(0, 3) = Celda.Offset(0, 3) - Celda
Celda.ClearContents: i = i + 1: End With: Next Celda
With Worksheets(Cliente)
.Range(.[a6], .[g65536].End(xlUp).Address) _
.Sort Key1:=.[f6], Order1:=xlDescending, _
Key2:=.[b6], Order2:=xlAscending
.[e1] = Application.Sum(.Range(.[a6], _
.[a1].Offset(.[a65536].End(xlUp).Row - 1, 0)))
.[e2] = Application.Sum(.Range(.[e6], _
.[e1].Offset(.[e65536].End(xlUp).Row - 1, 0)))
.Range(.[h6], .[k1].Offset(.[f65536].End(xlUp).Row, 0)).Delete
.Range(.[a1], .[b3]).Borders(xlInsideHorizontal).LineStyle = xlDouble
.Range(.[b1], .[b3]).Font.Bold = True
With .Range(.[e1], .[e2])
.Font.Bold = True
.BorderAround Weight:=xlMedium
.Borders(xlInsideHorizontal).Weight = xlMedium
End With
With .Range(.[a5], .[g5])
.Font.Bold = True
.BorderAround Weight:=xlMedium
.Borders(xlInsideVertical).Weight = xlMedium
End With
With .Range(.[a6], .[g65536].End(xlUp))
.BorderAround Weight:=xlMedium
.Borders(xlInsideHorizontal).Weight = xlThin
.Borders(xlInsideVertical).Weight = xlThin
End With
For Each Celda2 In .Range(.[f6], .[f65536].End(xlUp))
With Celda2: Total = .Offset(0, -1).Value
Piezas = .Offset(0, -5).Value
If .Value <> .Offset(-1, 0) Then
.Offset(0, 2) = "TT PedNº" & .Value
.Offset(0, 3) = Total
.Offset(0, 4) = "Pzs PedNº" & .Value
.Offset(0, 5) = Piezas
With Range(.Offset(0, 2), .Offset(0, 3))
.BorderAround Weight:=xlThick
.Interior.ColorIndex = 8
End With
.Offset(0, 3).Font.Bold = True
With Range(.Offset(0, 4), .Offset(0, 5))
.BorderAround Weight:=xlThick
.Interior.ColorIndex = 8
End With
.Offset(0, 5).Font.Bold = True
ElseIf .Value = .Offset(-1, 0) Then
.Offset(0, 3).End(xlUp) = .Offset(0, 3).End(xlUp) + Total
.Offset(0, 5).End(xlUp) = .Offset(0, 5).End(xlUp) + Piezas
End If
'' If .Value <> .Offset(-1, 0) And .ofsset(-1, 0) <> "" _
'' And IsNumeric(.Offset(-1, -5)) Then
' Rows(.EntireRow).Insert shift:=xlUp
' .Offset(-1, 2).End(xlUp).Cut .Offset(-1, -2)
' .Offset(-1, 3).End(xlUp).Cut .Offset(-1, -1)
' .Offset(-1, 4).End(xlUp).Cut .Offset(-1, -4)
' .Offset(-1, 5).End(xlUp).Cut .Offset(-1, -5)
' Application.CutCopyMode = False
' With Range(.Offset(-1, -5), .Offset(-1, -4))
' .BorderAround Weight:=xlThick
' .Interior.ColorIndex = 8
' End With
' .Offset(-1, -1).Font.Bold = True
' With Range(.Offset(-1, -5), .Offset(-1, -4))
' .BorderAround Weight:=xlThick
' .Interior.ColorIndex = 8
' End With
' .Offset(-1, -5).Font.Bold = True

' End If:
End With: Next Celda2: .Columns.AutoFit
End With
.Range(.[a6], .[e65536].End(xlUp).Address).Sort (.[b6])
.Range(.[b1], .[b3]).ClearContents
.Range(.[e1], .[e2]).ClearContents
End With
End Sub
Respuesta Responder a este mensaje
#3 klomkbock
26/03/2006 - 03:28 | Informe spam
HolaHéctor Miguel, esta vez a la par que reiterarte mi agradecimiento te
quiero pedir disculpas por mi precipitacion/falta de atencion

> With Celda2 In .Range(.[f6], .[f65536].End(xlUp))



disculpame pero al releer tu respuesta (y por añadiduria mi consulta) me
he dado cuenta del error. La verdad es que me he debido equivocar al
copiarlo o algo asi, porque en el codigo tengo un for each ( o a lo mejor
el error lo tenia al probarlo y no me entere, voy a volver a intentarlo).
Cuando lei tu respuesta y te envie el post anterior no me di ni cuenta del
with (debi leerlo como for each directamente) y de ahi mi respuesta. De
todas formas el insert se me ha atragantado un poco.

En cualquier caso muchas gracias.

Un saludo y hasta pronto.
Ivan

PD: una disculpa a todos por llenar el foro de post
precipitados/innecesarios/involuntarios.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida