Saltar al contenido

"resize" de una fórmula hasta la ultima fila con datos


Recommended Posts

publicado

Hola a todos,

tengo una macro que me busca una celda con una texto concreto, me crea una columna justo después y la rellena con una fórmula. Todo funciona, pero quiero que la fórmula la rellena solo hasta la última celda con datos de la columna vecina. Ahora tengo puesto que me copie la fórmula hasta la fila 6000.

Selection.AutoFill Destination:=Selection.Resize(6000, 1)

P.D: mi pregunta de hoy es más concreta y espero que sencilla :-)

Muchas gracias de antemano!

Paula

RESIZE ejemplo.zip

publicado

Prueba a ver que tal va.

Sub Column_NT()
Dim D As Range, Columna As Integer
Application.ScreenUpdating = False
Sheets("Soll Modelle").Select
For Each D In Range("A1:AR7").Cells
If D = "*P-Teile" Then
Columna = D.Column + 1
Columns(Columna).Insert
Cells(1, Columna) = "Normteile"
Cells(2, Columna).FormulaR1C1 = _
"=IF(OR(LEFT(RC[-8],4)=""WHT."",LEFT(RC[-8],4)=""N .""),""X"","""")"
Cells(2, Columna).Copy _
Range(Cells(3, Columna), Cells(Range("A1").End(xlDown).Row, Columna))
End If
Next
End Sub
[/CODE]

publicado

Selecciona cualquier hoja y ejecuta la macro.

Vale para cualquier hoja y cualquier número de filas y columnas.

Sub Column_NT()
Dim D As Range, Columna As Integer
Application.ScreenUpdating = False
Set D = Rows(1).Find("*P-Teile")
If Not D Is Nothing And _
Not D.Offset(0, 1) = "Normteile" Then
Columna = D.Column + 1
Columns(Columna).Insert
Columns(Columna).NumberFormat = "General"
Cells(1, Columna) = "Normteile"
Cells(2, Columna).FormulaR1C1 = _
"=IF(OR(LEFT(RC[-8],4)=""WHT."",LEFT(RC[-8],4)=""N .""),""X"","""")"
Cells(2, Columna).Copy _
Range(Cells(3, Columna), Cells(Range("A1").End(xlDown).Row, Columna))
End If
End Sub
[/CODE]

Si te interesa, te puedo adaptar la macro para que actúe en todas las hojas de una vez.

.

publicado

Creo que es esto:

Sub Column_NT_All()
Dim D As Range, Columna As Integer, H As Worksheet
'-----------------------------------------------------
Const Buscar As String = "*P-Teile" 'Columna a buscar
Const Añadir As String = "Normteile" 'Columna a añadir
'-----------------------------------------------------
Application.ScreenUpdating = False
For Each H In Sheets
Set D = H.Rows(1).Find(Buscar)
If Not D Is Nothing And _
Not D.Offset(0, 1) = Añadir Then
Columna = D.Column + 1
H.Columns(Columna).Insert
H.Columns(Columna).NumberFormat = "General"
H.Cells(1, Columna) = Añadir
H.Cells(2, Columna).FormulaR1C1 = _
"=IF(OR(LEFT(RC[-8],4)=""WHT."",LEFT(RC[-8],4)=""N .""),""X"","""")"
H.Cells(2, Columna).Copy _
H.Range(H.Cells(3, Columna), H.Cells(H.Range("A1").End(xlDown).Row, Columna))
End If
Next
End Sub
[/CODE]

publicado

Hola macro Antonio!

utilizo esta macro integrada en más código, y con tu ejemplo para aplicar la macro a más páginas de una vez, me da error...

Si lo personalizo para que actue en cada una de la hojas:

Dim D As Range, Columna As Integer
Application.ScreenUpdating = False
Sheets("Soll Modelle").Select
For Each D In Range("A1:AR7").Cells
If D = "*P-Teile" Then
Columna = D.Column + 1
Columns(Columna).Insert
Cells(1, Columna) = "Normteile"
Cells(2, Columna).FormulaR1C1 = _
"=IF(OR(LEFT(RC[-8],4)=""WHT."",LEFT(RC[-8],4)=""N .""),""X"","""")"
Cells(2, Columna).Copy _
Range(Cells(3, Columna), Cells(Range("A1").End(xlDown).Row, Columna))
End If
Next


Sheets("Fehlteile").Select
For Each D In Range("A1:AR7").Cells
If D = "*P-Teile" Then
Columna = D.Column + 1
Columns(Columna).Insert
Cells(1, Columna) = "Normteile"
Cells(2, Columna).FormulaR1C1 = _
"=IF(OR(LEFT(RC[-8],4)=""WHT."",LEFT(RC[-8],4)=""N .""),""X"","""")"
Cells(2, Columna).Copy _
Range(Cells(3, Columna), Cells(Range("A1").End(xlDown).Row, Columna))
End If
Next[/CODE]

Me funciona en la primera hoja y luego la fórmula se copia asi: "=IF(OR(LEFT(RC[-8],4)="WHT.",LEFT(RC[-8],4)="N ."),"X","")". Y no se reconoce la fórmula...

Muchas gracias de antemano!

Paula

post-203762-145877016656_thumb.png

post-203762-145877016667_thumb.png

post-203762-145877016677_thumb.png

post-203762-145877016679_thumb.png

publicado

Creo que para corregir la fórmula es tan simple como saber un poco de inglés:

IF = SI

OR = O

AND = Y

LEFT = IZQUIERDA

Prueba modificando estas palabras en la fórmula y nos comentas.

publicado
Sub Column_NT_All()
Dim D As Range, Columna As Integer, H As Worksheet
'-----------------------------------------------------
Const Buscar As String = "*P-Teile" 'Columna a buscar
Const Añadir As String = "Normteile" 'Columna a añadir
'-----------------------------------------------------
Application.ScreenUpdating = False
For Each H In Sheets
Set D = H.Rows(1).Find(Buscar)
If Not D Is Nothing Then
If Not D.Offset(0, 1) = Añadir Then
Columna = D.Column + 1
H.Columns(Columna).Insert
H.Columns(Columna).NumberFormat = "General"
H.Cells(1, Columna) = Añadir
H.Cells(2, Columna).FormulaR1C1 = _
"=IF(OR(LEFT(RC[-8],4)=""WHT."",LEFT(RC[-8],4)=""N .""),""X"","""")"
H.Cells(2, Columna).Copy _
H.Range(H.Cells(3, Columna), H.Cells(H.Range("A1").End(xlDown).Row, Columna))
End If
End If
Next
End Sub[/CODE]

publicado

.

Por partes, el error es culpa mía, y se producía cuando había una hoja sin la columna "*P-Teile".

En cuanto al problema de la fórmula, se arregla convirtiendo el formato de las celdas a "General" .

Las fórmulas en la macro están en formato R1C1, esto significa que todos los rangos están refererenciados en relación a la celda que contiene la fórmula, así, si pones en la celda H1 la formula =RC[-8] estás nombrado a la celda 8 columnas a la izquierda de la celda H1, es decir, la celda A1. En definitiva H1=RC[-8] es lo mismo que H1=A1.

A raíz de lo expuesto, me acabo de dar cuenta que la macro está rematadamente mal ya que la fórmula solo vale para la hoja "Soll Modelle".

Corrijo y la subo de nuevo.

.

publicado

Ahora creo que si está OK.

Sub Column_NT_AllOk()
Dim D As Range, Columna As Integer
Dim H As Worksheet, Gap As Integer
'-----------------------------------------------------
Const Buscar As String = "*P-Teile" 'Columna a buscar
Const Añadir As String = "Normteile" 'Columna a añadir
Const SachnummerPS As Integer = 4 'Columna de Sachnummer PS
'-----------------------------------------------------
Application.ScreenUpdating = False
For Each H In Sheets
Set D = H.Rows(1).Find(Buscar)
If Not D Is Nothing Then
If Not D.Offset(0, 1) = Añadir Then
Columna = D.Column + 1
Gap = SachnummerPS - Columna
H.Columns(Columna).Insert
H.Columns(Columna).NumberFormat = "General"
H.Cells(1, Columna) = Añadir
H.Cells(2, Columna).FormulaR1C1 = _
"=IF(OR(LEFT(RC[" & Gap & "],4)=""WHT."",LEFT(RC[" & Gap & "],4)=""N .""),""X"","""")"
H.Cells(2, Columna).Copy _
H.Range(H.Cells(3, Columna), H.Cells(H.Range("A1").End(xlDown).Row, Columna))
End If
End If
Next
End Sub
[/CODE]

publicado

Con este código no me da ningún error, pero no me crea la columna...

Sin embargo el primer código que me escribiste sí funciona aunque solo sea en la hoja "Soll Modelle" Las hojas son 4 y siempre se llaman igual. Habría una manera de adpatar la macro a ellas para q funciona como el primer código?

Dim D As Range, Columna As Integer
Application.ScreenUpdating = False
Sheets("Soll Modelle").Select
For Each D In Range("A1:AR7").Cells
If D = "*P-Teile" Then
Columna = D.Column + 1
Columns(Columna).Insert
Cells(1, Columna) = "Normteile"
Cells(2, Columna).FormulaR1C1 = _
"=IF(OR(LEFT(RC[-8],4)=""WHT."",LEFT(RC[-8],4)=""N .""),""X"","""")"
Cells(2, Columna).Copy _
Range(Cells(3, Columna), Cells(Range("A1").End(xlDown).Row, Columna))
End If
NextDim D As Range, Columna As Integer
Application.ScreenUpdating = False
Sheets("Soll Modelle").Select
For Each D In Range("A1:AR7").Cells
If D = "*P-Teile" Then
Columna = D.Column + 1
Columns(Columna).Insert
Cells(1, Columna) = "Normteile"
Cells(2, Columna).FormulaR1C1 = _
"=IF(OR(LEFT(RC[-8],4)=""WHT."",LEFT(RC[-8],4)=""N .""),""X"","""")"
Cells(2, Columna).Copy _
Range(Cells(3, Columna), Cells(Range("A1").End(xlDown).Row, Columna))
End If
Next[/CODE]

publicado

[uSER=46507]@Macro Antonio[/uSER]. El problema está en el código con el que combino esta macro. Ese código también me crea columnas y colisiona de alguna manera con esta última versión de la macro. Sin embargo con las versión original, la primera que me enviaste funciona de lujo y no hay colisiones en los códigos

Sub Column_NT()

Dim D As Range, Columna As Integer

Application.ScreenUpdating = False

Sheets("Soll Modelle").Select

For Each D In Range("A1:AR7").Cells

If D = "*P-Teile" Then

Columna = D.Column + 1

Columns(Columna).Insert

Cells(1, Columna) = "Normteile"

Cells(2, Columna).FormulaR1C1 = _

"=IF(OR(LEFT(RC[-8],4)=""WHT."",LEFT(RC[-8],4)=""N .""),""X"","""")"

Cells(2, Columna).Copy _

Range(Cells(3, Columna), Cells(Range("A1").End(xlDown).Row, Columna))

End If

Next

End Sub

Adjunto te envio el código completo. Añado esa parte justo al final del módulo que se llama "Verbauungsmatrix" (te he comentado en el código a aprtir de cuando quiero añadir el código). Te envio también un ejemplo de archivo de entrada con el que usar la macro. Espero que puedas ayudarme. Y muchísimas gracias por todo de antemano!

Un saludo

Paula

ejemplo con resto del código.zip

archivo de entrada.zip

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.