none
Resultado da macro incoerente. RRS feed

  • Pergunta

  • No Excel tenho a seguinte situação :

    09/01/2015 00:04

    9

    1

    2015

    00:04:00

    09/01/2015 00:05

    9

    1

    2015

    00:05:00

    09/01/2015 00:05

    9

    1

    2015

    00:05:00

    09/01/2015 00:06

    9

    1

    2015

    00:06:00

    Na parte em azul temos a data e horas juntas. Ao lado temos mês, dia, ano e horas separadas. Foi usado Separador de Colunas passo a passo manualmente (Dados à Texto para Colunas à ...).

     

    Então foi feita um macro seguindo passo a passo no item anterior. Abaixo o resultado após rodar a macro.

    09/01/2015 00:04

    1

    9

    2015

    12:04:00

    AM

    09/01/2015 00:05

    1

    9

    2015

    12:05:00

    AM

    09/01/2015 00:05

    1

    9

    2015

    12:05:00

    AM

    09/01/2015 00:06

    1

    9

    2015

    12:06:00

    AM

    Observamos que a ordem do mês e dia alteraram e horas aparece no sistema americano.

    Então para que rodemos um macro e que apresente o resultado do primeiro exemplo, qual(is) modificações devo fazer.

    Segue abaixo o macro do segundo exemplo :

     

    Sub Macro1()

    '

    ' Macro1 Macro

    ''

        Columns("A:A").Select

        Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _

            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _

            Semicolon:=False, Comma:=False, Space:=True, Other:=True, OtherChar:= _

            "/", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)), _

            TrailingMinusNumbers:=True

    End Sub

    quarta-feira, 9 de setembro de 2015 21:54

Respostas

  • Olá!

    Não sei quais modificações deveriam ser feitas no seu código, mas alternativamente você pode desenvolver outros métodos para realizar esta tarefa. Uma alternativa seria trabalhar com fórmulas na própria planilha com as funções DIA, MÊS, ANO e para a hora usar o valor da célula menos a parte inteira, por exemplo A1-INT(A1), com a célula formatada em horas. Com uma linha de fórmula desenvolvida bastaria arrastar para as demais e transformar em valores.

    Ou então criar um outro método por código, como por exemplo:

    Sub Data_Hora()
    
    Dim rCell As Excel.Range
    
    Application.ScreenUpdating = False
    
        Range("A1").Select
        Range(Selection, Selection.End(xlDown)).Select
        
        For Each rCell In Selection
            rCell.Activate
            ActiveCell.Offset(0, 1).FormulaR1C1 = Day(rCell.Value)
            ActiveCell.Offset(0, 2).FormulaR1C1 = Month(rCell.Value)
            ActiveCell.Offset(0, 3).FormulaR1C1 = Year(rCell.Value)
            ActiveCell.Offset(0, 4).FormulaR1C1 = rCell.Value - Int(rCell.Value)
            ActiveCell.Offset(0, 4).NumberFormat = "[$-F400]h:mm:ss AM/PM"
        Next rCell
    
    Application.ScreenUpdating = True
    
    End Sub

    Abraços!


    Rafael Kamimura - http://excelmaniacos.com

    quinta-feira, 10 de setembro de 2015 12:33

Todas as Respostas

  • Olá!

    Não sei quais modificações deveriam ser feitas no seu código, mas alternativamente você pode desenvolver outros métodos para realizar esta tarefa. Uma alternativa seria trabalhar com fórmulas na própria planilha com as funções DIA, MÊS, ANO e para a hora usar o valor da célula menos a parte inteira, por exemplo A1-INT(A1), com a célula formatada em horas. Com uma linha de fórmula desenvolvida bastaria arrastar para as demais e transformar em valores.

    Ou então criar um outro método por código, como por exemplo:

    Sub Data_Hora()
    
    Dim rCell As Excel.Range
    
    Application.ScreenUpdating = False
    
        Range("A1").Select
        Range(Selection, Selection.End(xlDown)).Select
        
        For Each rCell In Selection
            rCell.Activate
            ActiveCell.Offset(0, 1).FormulaR1C1 = Day(rCell.Value)
            ActiveCell.Offset(0, 2).FormulaR1C1 = Month(rCell.Value)
            ActiveCell.Offset(0, 3).FormulaR1C1 = Year(rCell.Value)
            ActiveCell.Offset(0, 4).FormulaR1C1 = rCell.Value - Int(rCell.Value)
            ActiveCell.Offset(0, 4).NumberFormat = "[$-F400]h:mm:ss AM/PM"
        Next rCell
    
    Application.ScreenUpdating = True
    
    End Sub

    Abraços!


    Rafael Kamimura - http://excelmaniacos.com

    quinta-feira, 10 de setembro de 2015 12:33
  • Recomendo a solução do Rafael, ela vai evitar o problema que o VBA tem com datas. O VBA está considerando o formato mm/dd/aaaa ou dd/mm/aaaa dependendo do valor da data. Experimente alterar para um valor maior que doze o valor do mês, e verás que a lógica troca.


    Thank you,

    F. Schubert
    System Administrator

    MCP | Microsoft Certified Professional
    MCTS 70-640 | Microsoft Certified Technology Specialist: Windows Server 2008 Active Directory, Configuration
    MCTS 70-642 | Microsoft Certified Technology Specialist: Windows Server 2008 Network Infrastructure, Configuration
    MCTS 70-643 | Microsoft Certified Technology Specialist: Windows Server 2008 Applications Infrastructure, Configuring
    MCTS 70-680 | Microsoft Certified Technology Specialist: Windows 7, Configuration

    segunda-feira, 14 de setembro de 2015 02:11
  • No sub acima (Data_Hora), o comando do dia apresenta como resultado o mes e o do mes o do dia.

    12/08/2015 15:57
    12/08/2015 17:05
    12/10/2015 06:11
    12/13/2015 21:08
    12/13/2015 21:08

    No exemplo acima, quando chega no dia 12/13/2015 as coisas se invertem.

    No comando do dia aparece como dia e do mes como mes e não separa mais as horas e acusa erro.

    sexta-feira, 18 de dezembro de 2015 09:40