Jump to content

Recommended Posts

Posted

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

Ricardo Timóteo

Posted

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:

Ricardo Timóteo

Posted

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)

Ricardo Timóteo

Posted

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?

Ricardo Timóteo

Posted

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

Posted

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)

Ricardo Timóteo

Posted

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

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

Ricardo Timóteo

  • 3 weeks later...
Posted

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.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.