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

Como se escreve uma fórmula Excel que cola um valor específico numa célula diferente?

Portanto, basicamente quero escrever uma fórmula que verifique uma condição, e se essa condição for preenchida, então quero colar uma linha específica de texto numa célula diferente. Devo notar que não quero que a fórmula exista na célula em que quero colar um valor. Por exemplo, se eu quiser colar um valor em B5, não quero que a fórmula esteja na célula B5.

Respostas (4)

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

A abordagem seguinte faz uso de uma alternativa descrita aqui e aqui para permitir uma função de folha de trabalho definida em VBA para definir o valor de outra célula.

A função personalizada armazena em variáveis globais o endereço da célula de destino e o valor para o qual essa célula deve ser definida. Depois, uma macro que é accionada quando a folha de trabalho recalcula lê as variáveis globais e define a célula-alvo para o valor especificado.

A utilização da função personalizada é simples:

=SetCellValue(target_cell, value)

onde target_cell é uma referência em cadeia a uma célula da folha de trabalho (por exemplo, “A1”) ou uma expressão que avalia uma tal referência. Isto inclui uma expressão como =B14 em que o valor de B14 é “A1”. A função pode ser utilizada em qualquer expressão válida.

SetCellValue devolve 1 se o valor for escrito com sucesso na célula alvo, e 0 caso contrário. Qualquer conteúdo anterior da célula-alvo é sobrescrito.

São necessários três pedaços de código:

  • o código que define SetCellValue ele próprio
  • a macro que é accionada pelo evento de cálculo da folha de trabalho; e
  • uma função utilitária IsCellAddress para assegurar que target_cell é um endereço válido da célula.

Código para a Função SetCellValue

Este código precisa de ser colado num módulo padrão inserido na pasta de trabalho. O módulo pode ser inserido através do menu do editor Visual Basic, ao qual se acede seleccionando Visual Basic a partir do separador Developer da fita.

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

Folha de trabalho_Calcular código macro

Este código deve ser incluído no código específico da folha de trabalho em que se vai utilizar SetCellValue. A forma mais fácil de o fazer é clicar com o botão direito do rato no separador da folha de trabalho na visualização Home, seleccionar View Code, e depois colar o código no painel do 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 a Função IsCellAddress

Este código pode ser colado no mesmo módulo que o 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

Vamos assumir que quer que o texto “Texto A” apareça na célula C5 se a célula B5 contiver o valor “verde”.

Você ** pode*** utilizar uma abordagem de fórmula, mas como as fórmulas não podem alterar os valores noutras células, a fórmula terá de ser introduzida na célula C5.

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

Célula C5 só mostrará agora “Texto A” se B5 contiver a palavra “verde”.

Uma fórmula como esta pode ser construída para funcionar com muitas condições. É necessário definir os seus requisitos para obter ajuda na sua situação específica.

Se não quiser que C5 tenha uma fórmula, pode também usar uma abordagem VBA. Pode executar um evento de alteração da folha de trabalho que será executado sempre que a célula B5 for alterada, quer editando manualmente o valor ou colando algo nela.

Um exemplo para tal macro poderia 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

As condições e a colocação da saída são apenas um exemplo, claro, e precisam de ser ajustadas às suas necessidades.

A diferença entre a fórmula e a abordagem da macro é

  • com a abordagem da fórmula, a célula C5 conterá uma fórmula. Se o utilizador apagar acidentalmente a fórmula, a funcionalidade que ela fornece também será apagada. (Há formas de gerir isso, no entanto)
  • com a macro VBA, a célula C5 não mostrará qualquer fórmula, e terá o texto literalmente como um valor, mas alterar a configuração requer conhecimento de Excel VBA. Além disso, com uma abordagem VBA, a pasta de trabalho deve ser guardada como uma pasta de trabalho com macro e o utilizador deve permitir macros ou tornar o ficheiro num ficheiro de confiança.

Nota: o anterior é apenas um exemplo. É necessário definir os seus requisitos, se deve avaliar números ou texto, se a avaliação é sensível a casos, quais são as regras de avaliação, onde colocar o resultado, etc.

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

Para verificar se uma condição é cumprida, escrever uma fórmula IF em alguma célula para actualizar “uma linha específica de texto numa célula diferente”. A célula de resultado conterá apenas o valor da fórmula, NÃO a fórmula que gerou esse valor, como tal:

Célula de trabalho (ex. J5) =IF(A1="yes","Specific line of text","") Célula de resultado (ex. B5) =J5

Assim, se a condição for satisfeita (A1=“sim”), B5 conterá “uma linha específica de texto”. Caso contrário, fica em branco.

Notas: Células que têm valores variáveis conterão normalmente algum tipo de fórmula para continuar a actualizar os seus valores.

Se não quiser que ninguém saiba a fórmula real que está a criar o valor, a fórmula pode ir noutra célula para gerar o valor, que será então copiada para a célula de resultado, por exemplo, B5.

Para ocultar a fórmula que gerou o valor ou para ocultar a célula a que B5 se refere (para continuar a verificar se o valor precisa de ser actualizado), consulte: https://support.office.com/en-us/article/display-or-hide-formulas-f7f5ab4e-bf24-4efc-8fc9-0c1b77a5356f

Outras funções que podem alcançar o mesmo efeito incluem: CHOOSE, HLOOOKUP, LOOKUP, VLOOOKUP.

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

=valor(célula)

Fórmula directa a utilizar, teve o mesmo problema e funciona.