5
respostas

Comparação com horas em VBA

Preciso selecionar um conjunto de informações compreendidas entre 06:00h da manhã de um dia até as 05:50h do próximo. Não sei o motivo de sair do meu laco, mesmo a condição ainda sendo verdadeira. A iteração para no horário de 00:01:21. Agradeço qualquer ajuda.

   Sub teste_separar_dias_2()

    Range("a1048576").Select
    ActiveCell.End(xlUp).Select


    Do While ActiveCell = "09/05/2018"
        ActiveCell.Offset(0, 1).Select
        If ActiveCell > "0,25" Then 'testa se o horario maior que seis da manhã
            Do While ActiveCell < "22:00:00"
                Range(ActiveCell.Offset(0, 1), ActiveCell.Offset(0, 2)).Interior.ColorIndex = 24
                ActiveCell.Offset(-1, 0).Select
            Loop
        Else
            ActiveCell.Offset(-1, 0).Select
        End If
        ActiveCell.Offset(0, -1).Select
    Loop
    ActiveCell.Offset(-1, 0).Select

End Sub
5 respostas

Faz tempo que não mexo com VBA e não estou com o Excel aqui pra debugar, mas tá faltando colocar a propriedade do ActiveCell:

DE: ActiveCell

PARA: ActiveCell.Value

Também fiquei na dúvida quando à representação das horas que você colocou "0,25" (no mínimo não seria . ao invés de ,?).

E se você está usando a mesma célula para testar a data e depois as horas , então dificilmente será igual, pois você deve recuperar somente a data para comparar com "09/05/2018" e depois somente as horas pra comparar com "0,25" ou "22:00:00".

Enfim, salvo engano, tem que usar um int() pra recuperar a parte inteira (que seria a data), e a parte fracionária seriam as horas.

Oi Rodrigo, tudo bem?

A resposta do Jorge te ajudou? Se ajudou, pode marcar como solução :)

Bons estudos.

Olá, boa tarde

Obrigado Jorge, por responder ao meu problema. Mas acredito que não fui claro quanto ao meu problema. Utilizei a dica que me deu sobre usar vírgula e reformulei o meu programa. Os dados me são apresentados da seguinte forma:Data hora vazão11/05/2018 01:21:45 3,670173407

O que eu preciso é verificar a data, se a data bater com a digitada pelo usuário, o programa segue pra coluna de horas e a partir daí verifica se ela é maior que seis da manhã. Em caso positivo, desejo pegar até o horário de 05:59 do próximo dia. Pensei em algumas soluções e reestruturei o meu programa, ficando conforme abaixo. A questão agora é que não consigo pensar em um método de parada para o for com variável de controle j. Se conseguir pensar em algo seria de grande ajuda. Muito obrigado pela atenção.

Sub separar_dias()

    Dim i, j, K As Integer
    Dim data As String

    data = Application.InputBox("Informe uma data", "Entrada de dados")

    If data = "" Then
        Mensagem = "Não foi informado nenhum  valor de data"
    Else
        Mensagem = "O valor de data informado foi: " & data
    End If
    Msg = MsgBox(Mensagem, vbOKOnly + vbInformation, "Informacão")

    Range("A1048576").Select
    ActiveCell.End(xlUp).Select

    For i = 0 To 26549
        If ActiveCell <> data Then
            ActiveCell.Offset(-1, 0).Select
        Else
            If ActiveCell = data Then
                ActiveCell.Offset(0, 1).Select
                For j = 0 To 26549
                    If ActiveCell > 0.25 Then 'And ActiveCell < "05:50:00" Then
                        Range(ActiveCell.Offset(0, -1), ActiveCell.Offset(0, 1)).Interior.ColorIndex = 24
                        ActiveCell.Offset(-1, 0).Select
                    Else
                        If ActiveCell > 0 Then ' problema aqui
                            ActiveCell.Offset(-1, 0).Select
                        Else
                            j = 26549
                        End If
                    End If
                Next
                For K = 0 To 26549
                    If ActiveCell > 0 And ActiveCell < 0.249988426 Then '0,243055556
                        Range(ActiveCell.Offset(0, -1), ActiveCell.Offset(0, 1)).Interior.ColorIndex = 24
                        ActiveCell.Offset(-1, 0).Select
                    Else
                        K = 26549
                    End If
                Next
                i = 26549
            End If
        End If
    Next

   End Sub

Acho que você está esquecendo de informar a propriedade correta do objeto ActiveCell. Você está comparando um objeto com um valor. Você tem que comparar uma propriedade do objeto (que retorne um valor) com o valor desejado com mesmo tipo que o da propriedade.

Por exemplo, se você quiser saber o número da linha da célula ativa, você tem que usar ActiveCell.Row.

Agora, se você quer saber o valor que está na célula ativa, você usa ActiveCell.Value.

Então, antes mesmo de chegar onde está causando o erro, acho que o algoritmo está agindo de forma indesejada antes disso (por exemplo, em ActiveCell > 0.25), porque não menciona qual a propriedade.

O método de parada poderia ser quando a ActiveCell.Row = 1.

Também creio que a manipulação de datas vá te causar problemas cedo ou tarde. Sugiro a seguinte leitura:

http://www.macoratti.net/vb_datas.htm

Oi Rodrigo, conseguiu avançar? Viu a resposta do Jorge? Espero que tenha te ajudado ^^.