none
Urgente, recuperar valor de Textbox como número na planilha excel RRS feed

  • Pergunta

  • Bom dia;

    Gostaria de parabenizar a todos por este fórum que tem ajudado a muitos no encontro de soluções aos mais diversos problemas.

    Eu já procurei em alguns fórum, mas ainda não consegui um resposta para minha dúvida.

    Solicito a ajuda dos colegas para me orientar sobre esta dúvida, que me parece simples, mas que ainda não não achei solução. 

    Eu criei, no Excel em VBA, um formulário com vários textbox, cada um com uma formatação especifica:

    TextBox1.Value = Format(TextBox1.Value, "#,##0.#0 h")
    TextBox2.Value = Format(TextBox2.Value, "R$ #,##0")

    Eu recupero todos dados imputados nestes textbox para preencher uma tabela no Excel, cada um textbox corresponde a uma célula,  a qual já esta devidamente formatada, conforme a mesma formatação do textbox correspondente.

    Cells(12, 9).Value = TextBox1.Value  'formatação da célula = #.##0,#0 "h"
    Cells(12, 10).Value = TextBox2.Value 'formatação da célula = R$ #.##0

    Entretanto os dados recuperados são enviados com texto (ex. "5,30 h" e "R$ 2.500"), eu necessito que estes dados sejam convertido em valores numéricos, neste mesmo exemple preciso recuperar os valores 5,3 e 2500, os quais serão devidamente formatados nas suas respectivas células.

    Agradeço pela ajuda nesta minha dúvida

    Grato

    Ete.Net


    segunda-feira, 18 de janeiro de 2016 13:40

Respostas

  • Olá, boa tarde.

    Sua proposta somente irá funcionar se o seu número for menor que 1000, pois não haverá o '.'. Nesse caso o que propus também precisa de ajuste, por causa do 'h'. Assim, uma forma mais correta seria (se quiser pode concatenar os 'Replace'; fiz assim apenas para facilitar a compreensão):

    valor = TextBox1.Value
    valor2 = Replace(valor, ".", "")
    valor3 = Replace(valor2, " h", "")
    valor4 = Replace(valor3, ",", ".")
    
    Plan1.Cells(12, 9).Value2 = Val(valor4)

    Sobre a outra dúvida, sobre a aplicação para vários textboxes, a solução ideal vai depender de como seu código está organizado. Você pode, por exemplo, criar uma 'Function' e chamá-la para cada TextBox, ou percorrer todos em um laço e aplicar a correção (também pode conter uma 'Function). Veja um exemplo de laço:

    Dim cCont As Control, cAtual As Control
    
    With Me
        x = 0                                   'Contador
        For Each cCont In .Controls             'Percorre cada controle
    
            Set cAtual = .Controls.Item(x)      'Controle Atual
            Select Case TypeName(cCont)              'Tipo do Controle Atual
                Case "OptionButton"
                    '...
                Case "TextBox"
                    ' Seu Código
                '...
            End Select
            x = x + 1
        Next cCont
    End With

    Qualquer dúvida é só perguntar.

    Abraço.


    Filipe Magno

    segunda-feira, 18 de janeiro de 2016 17:08

Todas as Respostas

  • Olá, bom dia.

    Não sei se tem algo mais eficiente para fazer, mas devido à inabilidade do VBA lhe dar com diferentes estilos de numeração (internacional e o brasileiro) simultaneamente, sugiro a seguinte adaptação (para não dizer gambiarra):

    valor = TextBox1.Value
    valor2 = Replace(valor, ",", "#")
    valor3 = Replace(valor2, ".", ",")
    valor4 = Replace(valor3, "#", ".")
    
    Plan1.Cells(12, 9).Value2 = Val(valor4)
    

    Dessa forma atende?

    Abraço.


    Filipe Magno

    • Sugerido como Resposta André Santo segunda-feira, 18 de janeiro de 2016 16:16
    segunda-feira, 18 de janeiro de 2016 13:58
  • Olá Filipe;

    Muito obrigado, pela sua pronta resposta, nos primeiros teste que fiz a sua solução atende minhas necessidades.

    Entretanto agora tenho outro problema, pois tenho muitos TextBox (cerca de 60), que não estão nomeados sequencialmente (TexBox1, TexBox2, TextBox3,...), que com um loop seria bem facil aplicar sua "gambiarra" (rsrsrs). Mas meus Texbox estão nomeados com um nome especifico com alusão a coluna de minha planilha que será alimentada por cada um deles (TextBox_Porjeto, TexBox_Compras, Texbox_Mecânica).

    Você teria uma sugestão para que eu pudesse otimizar meu código e reduzir a árdua tarefa.

    Novamente obrigado pela ajuda

    Ete.Net

    segunda-feira, 18 de janeiro de 2016 16:03
  • Olá Filipe

    Analisando sua ajuda, consegui reduzir/limpar um pouco o seu código, utilizando somente

    Plan1.Cells(12,9).Value2 = Val(Replace(Me.TextBox1, ",", "."))

    O que me retorna apenas o valor, e na célula aplica a formatação.

    Obrigado pela grande ajuda

    Ete.Net

    segunda-feira, 18 de janeiro de 2016 16:27
  • Olá, boa tarde.

    Sua proposta somente irá funcionar se o seu número for menor que 1000, pois não haverá o '.'. Nesse caso o que propus também precisa de ajuste, por causa do 'h'. Assim, uma forma mais correta seria (se quiser pode concatenar os 'Replace'; fiz assim apenas para facilitar a compreensão):

    valor = TextBox1.Value
    valor2 = Replace(valor, ".", "")
    valor3 = Replace(valor2, " h", "")
    valor4 = Replace(valor3, ",", ".")
    
    Plan1.Cells(12, 9).Value2 = Val(valor4)

    Sobre a outra dúvida, sobre a aplicação para vários textboxes, a solução ideal vai depender de como seu código está organizado. Você pode, por exemplo, criar uma 'Function' e chamá-la para cada TextBox, ou percorrer todos em um laço e aplicar a correção (também pode conter uma 'Function). Veja um exemplo de laço:

    Dim cCont As Control, cAtual As Control
    
    With Me
        x = 0                                   'Contador
        For Each cCont In .Controls             'Percorre cada controle
    
            Set cAtual = .Controls.Item(x)      'Controle Atual
            Select Case TypeName(cCont)              'Tipo do Controle Atual
                Case "OptionButton"
                    '...
                Case "TextBox"
                    ' Seu Código
                '...
            End Select
            x = x + 1
        Next cCont
    End With

    Qualquer dúvida é só perguntar.

    Abraço.


    Filipe Magno

    segunda-feira, 18 de janeiro de 2016 17:08