2013-05-31 15:52:45 +0000 2013-05-31 15:52:45 +0000
8
8

¿Cómo se escribe una fórmula de Excel que pegue un valor específico en una celda diferente?

Básicamente quiero escribir una fórmula que compruebe una condición, y si esa condición se cumple, entonces quiero pegar una línea específica de texto en una celda diferente. Debo tener en cuenta que no quiero que la fórmula exista en la celda en la que quiero pegar un valor. Así, por ejemplo, si quiero pegar un valor en B5, no quiero que la fórmula esté en la celda B5…

Respuestas (4)

7
7
7
2013-06-02 23:43:38 +0000

El siguiente enfoque hace uso de una solución descrita aquí y aquí para permitir que una función de la hoja de cálculo definida en VBA establezca el valor de otra celda.

La función personalizada almacena en variables globales la dirección de la celda de destino y el valor al que se va a establecer dicha celda. Luego, una macro que se activa cuando la hoja de trabajo recalcula lee las variables globales y establece la celda de destino al valor especificado.

El uso de la función personalizada es sencillo:

=SetCellValue(target_cell, value)

donde target_cell es una referencia de cadena a una celda de la hoja de cálculo (por ejemplo, “A1”) o una expresión que se evalúa a dicha referencia. Esto incluye una expresión como =B14 donde el valor de B14 es “A1”. La función puede utilizarse en cualquier expresión válida.

SetCellValue devuelve 1 si el valor se escribe con éxito en la celda de destino, y 0 en caso contrario. Cualquier contenido anterior de la celda de destino se sobrescribe.

Se necesitan tres piezas de código:

  • el código que define a SetCellValue en sí mismo
  • la macro que es lanzada por el evento de cálculo de la hoja de trabajo; y
  • una función de utilidad IsCellAddress para asegurar que target_cell es una dirección de celda válida.

Código para la función SetCellValue

Este código necesita ser pegado en un módulo estándar insertado en el libro de trabajo. El módulo se puede insertar a través del menú del editor de Visual Basic, al que se accede seleccionando Visual Basic en la pestaña Developer de la cinta de opciones.

Option Explicit

  Public triggerIt As Boolean
  Public theTarget As String
  Public theValue As Variant

  Function SetCellValue(aCellAddress As String, aValue As Variant) As Long

      If (IsCellAddress(aCellAddress)) And _
             (Replace(Application.Caller.Address, "$", "") <> _
              Replace(UCase(aCellAddress), "$", "")) Then
          triggerIt = True
          theTarget = aCellAddress
          theValue = aValue
          SetCellValue = 1
      Else
          triggerIt = False
          SetCellValue = 0
      End If

  End Function

Worksheet_Calculate Macro Code

Este código debe incluirse en el código específico de la hoja de trabajo en la que se va a utilizar el SetCellValue. La forma más fácil de hacerlo es hacer clic con el botón derecho del ratón en la pestaña de la hoja de trabajo en la vista Home, seleccionar View Code, y luego pegar el código en el panel del editor que aparece.

Private Sub Worksheet_Calculate()

      If Not triggerIt Then
          Exit Sub
      End If
      triggerIt = False
      On Error GoTo CleanUp
      Application.EnableEvents = False
      Range(theTarget).Value = theValue
  CleanUp:
      Application.EnableEvents = True
      Application.Calculate

  End Sub

Código para la función IsCellAddress

Este código se puede pegar en el mismo módulo que el código SetCellValue.

Function IsCellAddress(aValue As Variant) As Boolean

      IsCellAddress = False

      Dim rng As Range ' Input is valid cell reference if it can be
      On Error GoTo GetOut ' assigned to range variable
      Set rng = Range(aValue)
      On Error GoTo 0

      Dim colonPos As Long 'convert single cell "range" address to
      colonPos = InStr(aValue, ":") 'single cell reference ("A1:A1" -> "A1")
      If (colonPos <> 0) Then
          If (Left(aValue, colonPos - 1) = _
                Right(aValue, Len(aValue) - colonPos)) Then
              aValue = Left(aValue, colonPos - 1)
          End If
      End If

      If (rng.Rows.Count = 1) And _
          (rng.Columns.Count = 1) And _
          (InStr(aValue, "!") = 0) And _
          (InStr(aValue, ":") = 0) Then
          IsCellAddress = True
      End If 'must be single cell address in this worksheet
      Exit Function

  GetOut:

  End Function
2
2
2
2013-06-02 05:30:07 +0000

Supongamos que quieres que el texto “Texto A’ se muestre en la celda C5 si la celda B5 contiene el valor "verde”.

Puedes** utilizar una fórmula, pero como las fórmulas no pueden cambiar los valores de otras celdas, la fórmula tendrá que introducirse en la celda C5.

=IF(ISNUMBER(FIND("green",B5)),"Text A","")

La celda C5 ahora sólo mostrará “Texto A” si B5 contiene la palabra “verde”.

Una fórmula como esta puede ser construida para trabajar con muchas condiciones. Necesita definir sus requerimientos para obtener ayuda en su situación específica.

Si no quieres que C5 tenga una fórmula, también puedes usar un enfoque VBA. Puedes ejecutar un evento de Cambio de Hoja de Trabajo que se ejecutará cada vez que la celda B5 sea cambiada, ya sea editando manualmente el valor o pegando algo en ella.

Un ejemplo de esta macro podría ser

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B5")) Is Nothing Then
    If InStr(1, Target, "green", vbTextCompare) Then
        Target.Offset(0, 1) = "Text A"
    End If
End If
End Sub

Las condiciones y la colocación de la salida son sólo un ejemplo, por supuesto, y deben ajustarse a sus necesidades.

La diferencia entre la fórmula y el enfoque de la macro es

  • con el enfoque de la fórmula, la celda C5 contendrá una fórmula. Si el usuario borra accidentalmente la fórmula, la funcionalidad que ofrece se borrará también. (Sin embargo, hay formas de gestionar esto)
  • con la macro VBA, la celda C5 no mostrará ninguna fórmula, y tendrá el texto literal como valor, pero cambiar la configuración requiere conocimientos de Excel VBA. Además, con un enfoque VBA, el libro de trabajo debe guardarse como un libro de trabajo habilitado para macros y el usuario debe permitir las macros o hacer que el archivo sea un archivo de confianza.

Nota: lo anterior es sólo un ejemplo. Debe definir sus requisitos, si debe evaluar números o texto, si la evaluación distingue entre mayúsculas y minúsculas, cuáles son las reglas de evaluación, dónde colocar el resultado, etc.

1
1
1
2019-10-06 11:03:17 +0000

Para comprobar si se cumple una condición, escriba una fórmula IF en alguna celda para actualizar “una línea específica de texto en una celda diferente”. La celda de resultado sólo contendrá el valor de la fórmula, NO la fórmula que generó ese valor, así

Celda de trabajo (ej. J5) =IF(A1="yes","Specific line of text","") Celda de resultado (ej. B5) =J5

Así que si la condición se cumple (A1=“sí”), B5 contendrá “una línea específica de texto”. En caso contrario, se queda en blanco.

Notas: Las celdas que tienen valores variables normalmente contendrán algún tipo de fórmula para ir actualizando sus valores.

Si no quieres que nadie conozca la fórmula real que está creando el valor, la fórmula puede ir en alguna otra celda para generar el valor, que luego se copiará en la celda de resultado, por ejemplo B5.

Para ocultar la fórmula que generó el valor o para ocultar la celda a la que se refiere B5 (para seguir comprobando si el valor necesita ser actualizado), consulte: https://support.office.com/en-us/article/display-or-hide-formulas-f7f5ab4e-bf24-4efc-8fc9-0c1b77a5356f

Otras funciones que pueden lograr el mismo efecto incluyen CHOOSE, HLOOKUP, LOOKUP, VLOOKUP.

-1
-1
-1
2020-01-17 07:27:23 +0000

=valor(celda)

Fórmula sencilla de usar, tenía el mismo problema y funciona.