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.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Current Donation Goals

    • Raised 0.00 EUR of 130.00 EUR target
  • Archivos

  • Estadísticas de descargas

    • Archivos
      188
    • Comentarios
      98
    • Revisiones
      29

    Más información sobre "Cambios en el Control Horario"
    Última descarga
    Por pegones1

    4    1

  • Crear macros Excel

  • Mensajes

    • Hola, veo que tienes 365, así que esta forma funcionará   Almacen.xlsx
    • Buenos días  @LeandroA espero estes bien Tengo un caso idéntico al planteado en la siguiente pregunta: Sin embargo, a diferencia de quien planteo originalmente la pregunta al correr el código no obtengo ningún resultado podrían ayudarme a resolver este inconveniente y que al hacer click en el Botón Guardar (CommandButton3) del Formulario RCS (frmrcs) el archivo pdf quede configurado con orientación vertical, márgenes superior, inferior, derecho e izquierdo = 1 y en página tamaño carta. Si acaso influye uso Microsoft Excel LTSC MSO (versión 2209 Compilación16.0.1.15629.20200) de 64 bits Mucho le sabre agradecer la ayuda que me pueda dar  RCS PRUEBA - copia.xlsm
    • @JSDJSDCon gusto mi estimado Para la opción 1: Sub Surtirhastadondealcanse() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 4 Dim filaFin As Integer: filaFin = 7 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Else solicitudes(i) = 0 End If surtido(i) = "POR FALTA STOCK" Next i ' Surtir de acuerdo al inventario disponible For i = 1 To numClientes If solicitudes(i) > 0 Then If inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) ElseIf inventario > 0 Then surtido(i) = inventario totalSurtido = totalSurtido + inventario inventario = 0 Else surtido(i) = "POR FALTA STOCK" End If End If Next i ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = "POR FALTA STOCK" Then .Value = surtido(i) .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Para la opción 2:   Sub surtirenpartesiguales() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 13 Dim filaFin As Integer: filaFin = 16 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 Dim totalPedido As Double: totalPedido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) totalPedido = totalPedido + solicitudes(i) Else solicitudes(i) = 0 End If surtido(i) = 0 Next i ' Si hay suficiente inventario, surtir lo que el cliente pide If inventario >= totalPedido Then For i = 1 To numClientes If solicitudes(i) > 0 And inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) End If Next i Else ' Reparto base igualitario Dim baseSurtido As Long baseSurtido = Int(inventario / numClientes) For i = 1 To numClientes If solicitudes(i) > 0 Then If solicitudes(i) <= baseSurtido Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) Else surtido(i) = baseSurtido inventario = inventario - baseSurtido totalSurtido = totalSurtido + baseSurtido End If End If Next i ' Repartir sobrante restante uno por uno, respetando lo pedido Do While inventario > 0 For i = 1 To numClientes If surtido(i) < solicitudes(i) Then surtido(i) = surtido(i) + 1 totalSurtido = totalSurtido + 1 inventario = inventario - 1 If inventario = 0 Then Exit For End If Next i Loop End If ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = 0 Then .Value = "POR FALTA STOCK" .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Saludos, Diego
    • Buenos dias.  Estoy trabajando en una hoja para poder llevar un control de un pequeño almacén.  Tengo un pedido con varias líneas y "lotes" y necesito sacar las ubicaciones que coincidan con la referencia y lote que pone en el pedido. El problema viene cuando tengo la misma referencia y mismo lote en ubicaciones diferentes y necesito sacar la información en columnas diferentes. No se si  me he explicado bien, pero creo que con el ejemplo adjunto se entiende mejor. Agradecería mucho si me pudieran ayudar  Libro1.xlsx
    • Exelente solución mil gracias 
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • 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.