Evitar usar cálculo iterativo y remplazar por otra lógica

Necesito de sus sugerencias para evitar utilizar el cálculo iterativo que me relentiza todo el Excel.

Esto es lo que tengo ahora:

Descripción:

Los números en fila 1, van cambiando de 1 en 1 de manera automatica, no cambian todos a la vez.

En B se van ingresando números, uno a uno.

Tengo muchas casillas como verán.

Lo que necesito: Alguna lógica, que si ingreso un número en B3, y T1 se mantiene en 1, entonces en T3 me escriba 1... Y así para cada dato ingresado en B.

Lo ya ingresado de T3 en adelante debe quedar congelado (hasta q se borren datos en B).

Si luego T1 vale 2, entones para cada nuevo dato ingresado debe figurar 2.

Ejemplo cómo es la secuencia que necesito .

De B3 hasta B5, T1 valía 1, y desde B6 en adelante ahora T1 vale 2.

Espero de su gran ayuda cómo siempre para que me saquen esta duda lo antes posible!.

1 Respuesta

Respuesta
2

No es clara la secuencia.

- T1 = 1

- B3 = 6

- entonces T3 = 1, ¿qué pasa con U3, V3, etc...?

- B4 = 28

- entonces T4 = 1, ¿qué pasa con U4, V4, etc...?

- B5 = 6

- entonces T5 = 1, ¿qué pasa con U5, V5, etc...?

- ¿B6 = 7 o primero T1 = 2?

- Si primero T1 = 2

- B6 = 7

- entonces T6 = 2, ¿qué pasa con U6, V6, etc...?

Hola Dante. Sería de la siguiente manera:

El valor de cada columna en la fila 1 es independiente del resto entre si. Por ello la fórmula que se observa hace referencia a la misma columna (En el ejemplo a T1 y sería igual en cada una de las siguientes columnas.) y al valor de cada celda  en la columna de B que se va ingresando uno a uno.

Creo que con esto se responde a:

- T1 = 1

- B3 = 6

- entonces T3 = 1, ¿qué pasa con U3, V3, etc...?

- B4 = 28

- entonces T4 = 1, ¿qué pasa con U4, V4, etc...?

- B5 = 6

- entonces T5 = 1, ¿qué pasa con U5, V5, etc...?

- ¿B6 = 7 o primero T1 = 2? . Primero T1 = 2 y luego se Ingresa dato en B6 y da como resultado T6=2

- Si primero T1 = 2

- B6 = 7

- entonces T6 = 2, ¿qué pasa con U6, V6, etc...? . Si solo cambia T1=2, entonces U6,V6, etc continuan siendo según la fila 1 indicado en su columna.

Saludos

Entiendo que los valores iniciales en la fila 1 ya están precargados...

- Borra todas tus fórmulas y valores de la fila 3 en adelante.

- Prueba el siguiente código en los eventos de tu hoja.

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim cell As Range, rng As Range
  Dim lc As Long
  '
  lc = Cells(2, Columns.Count).End(1).Column
  Set rng = Intersect(Target, Range("B2:B" & Rows.Count))
  If Not rng Is Nothing Then
    Application.EnableEvents = False
    For Each cell In rng
      If cell.Value = "" Then
        Range("T" & cell.Row, Cells(cell.Row, lc)).ClearContents
      Else
        Range("T" & cell.Row, Cells(cell.Row, lc)).Value = Range("T1", Cells(1, lc)).Value
      End If
    Next
    Application.EnableEvents = True
  End If
End Sub

Funciona!!. Solo 2 consultas: cómo le puedo poner un fin hasta la columna BL por ejemplo?. Y la última, si en B, los datos se tipean en la Hoja1 y se muestran en B de la Hoja2 (donde colocaría la macro), que se debe hacer para que los lea la macro?.

Saludos!

Cómo le puedo poner un fin hasta la columna BL

La macro va a funciona hasta el último título de la fila 2.

Si quieres que sea en un rango específico, cambia esta línea

lc = Cells(2, Columns.Count).End(1).Column

Por esta:

lc = columns("BL"). Column

los datos se tipean en la Hoja1 y se muestran en B de la Hoja2

[Eso es algo que debes mencionar en tu pregunta inicial. Como ya te comenté, no debes obviar nada.

[No olvides valorar la respuesta.

¡Gracias! 

Prueba esto en la hoja1


Private Sub Worksheet_Change(ByVal Target As Range)
  Dim cell As Range, rng As Range
  Dim lc As Long
  '
  lc = Columns("BL").Column
  Set rng = Intersect(Target, Range("B2:B" & Rows.Count))
  If Not rng Is Nothing Then
    Application.EnableEvents = False
    For Each cell In rng
      With Sheets("Hoja2")
        If cell.Value = "" Then
          .Range("T" & cell.Row, .Cells(cell.Row, lc)).ClearContents
        Else
          .Range("T" & cell.Row, .Cells(cell.Row, lc)).Value = .Range("T1", .Cells(1, lc)).Value
        End If
      End With
    Next
    Application.EnableEvents = True
  End If
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas