Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

nokPT

[Excel2003] Formatar a cor da célula onde está a fórmula de vba

Mensagens Recomendadas

nokPT    4
nokPT

Bom dia,

Estou a tentar mudar a cor do fundo da célula actual onde tenho a formula dependendo do resultado, mas não consigo alterar.

O meu código (resumido) actual é o seguinte:

Public Function TipoDia(ByVal Data As Date) As String
    Dim Ano As Integer
    Dim Mes As Integer
    Dim Dia As Integer
    
    Ano = year(Data)
    Mes = Month(Data)
    Dia = Day(Data)
    
    If Weekday(Data, 2) = 6 Then
        TipoDia = "Sábado"
        ActiveCell.Interior.ColorIndex = 44
    End If
    If Weekday(Data, 2) = 7 Then
        TipoDia = "Domingo"
        ActiveCell.Interior.ColorIndex = 46
    End If
' ...
End Function

Já tentei de outras formas, já acrescentei no cabeçalho da função um range a apontar para a própria célula e na vez de ActiveCell escrevi a variavel desse range. O resultado é sempre o mesmo, altera o texto (da célula), mas não altera a cor do fundo

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nokPT    4
nokPT

Já, aliás comecei por aí ;)

Já vi outros exemplos do teu blog, já procurei na net.

Já usei com ActiveCell, já acrescentei a célula como Range à função, o resultado é sempre o mesmo, não preenche o fundo da célula.

Já experimentei com color e com colorindex.

Devia funcionar  :wallbash:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nokPT    4
nokPT

A ideia é mediante uma data (de célula anexa, enviada como ByVal) e escrever por extenso o dia da semana: Segunda .. Domingo, ou escrever caso seja feriado que feriado é e finalmente no caso de sábados formatar com o fundo azul (p.ex.;), se for feriado preenche com cor amarelo e se for domingo preenche com vermelho.

A ideia é esta.

Já tentei alterar o código da própria célula, e alternativamente de uma célula anexa, mas o resultado foi o mesmo, não formata, mas altera o dia dependendo da data.

Estou há volta com o código e não sei se no meio de tantas alterações o vba se passou, porque a certa altura substitui um variável por Activecell e depois eliminei a declaração da variável, só que agora aparece Activecell em vez de ActiveCell, é um pormenor de pouca importância (em basic mas em C é um mundo de diferenças)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nokPT    4
nokPT

Não consigo passar nada ou formatar por ActiveCell, quando tento escrever em ActiveCell.Value dá-me um erro circular.

As formatações por e simplesmente são ignoradas.

Será por ser uma Function?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

Ok, já entendi, mas tu não podes através de uma função numa célula, alterar a sua formatação. Apenas podes retornar valores.

Podes usar uma formatação condicional ou, como o meu exemplo mostra, através do evento Worksheet_Change

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nokPT    4
nokPT

Também já andei há volta com isso, mas os resultados não são os necessários.

O teu código funciona muito bem se escrevermos linha a linha Texto.

No meu caso estou a usar uma função e faço copy de 1 célula e paste em várias, o resultado é que o Target ou Range deixa de ser uma célula, pelo que o vb dá erro.

O mesmo acontece de seleccionar uma linha inteira e copiar para baixo.

Outro problema é no final do documento, não vou escrever nesta posição, vou escrever em colunas ao lado e quando mudo a data numa coluna ao lado, quero formatar esta coluna (e depois fazer mais umas coisadas), como não estou a escrever nesta coluna, ele não formata a célula, tenho depois que copiar a função célula a célula para formatar.

Provavelmente tenho que fazer muito mais código, (vb.net é muito mais simples)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

Provavelmente tenho que fazer muito mais código, (vb.net é muito mais simples)

Não tens de fazer muito mais código, simplesmente não dá como queres.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nokPT    4
nokPT

Ok, quando são há solução, não há solução...  ;)

Só não sei que icon por :hmm:, nem sei como meter o visto verde para concluir o tópico :nono:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

Não me aparece (ou não vejo) Topic Solved em lado nenhum, nem nesta mensagem nem em mensagens que tenho abertas.

Agora aparece como Topic Not Solved!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
rogi_cps    0
rogi_cps

Não sei se isso pode te ajudar....  é um pedaço de um código que uso para marcar o interior das células de cinza para que eu possa excluílas depois

Public Sub Copia()

X = 1

With Worksheets(1).Range("a1:a500")

    Set c = .Find("ID.*", LookIn:=xlValues)

    If Not c.Interior.Pattern = xlpatterbgray50 Then

        firstAddress = c.Address

        Do

            Worksheets(2).Cells(X, 1).Value = c.Value

            Set c = .FindNext©

            If Worksheets(2).Cells(X, 1).Value = "" Then

                Exit Do

            Else

                X = X + 1

            End If

        Loop While Not c Is Nothing And c.Address <> firstAddress

    End If

End With

Substituir

End Sub

O código do programa é muito extenso, então estou frisando o que uso para mudar o fundo da célula

c.Interior.Pattern = xlpatterbgray50, onde c é range, podendo ser escrita no formato:

worksheets(X).range(a1:a100).interior.pattern = cor

ou

worksheets(x).range(cells(x1,x2),cells(y1,y2)).interior.pattern = cor

Espero que possa te ajudar.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade