none
TextBox nio Excell RRS feed

  • Pergunta

  • Boas. Observem o procedimento abaixo:

    Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)


    'A linha abaixo copia todos os valores contidos na textbox1 para todas
    'as células do intervalo.


    Sheets("plan1").Range("A1:A90").Value = TextBox1.Value
    End Sub

    Numa TextBox eu carrego todos os valores selacinados de uma planilha, mas ao corrigir uma determinada linha, ocorre exatamente o descrito acima.

    Como posso resolver este problema? Gostaria de corrigir apenas o valor que estiver errado, alterando-o ao clicar duas vezes. Ou seja cada valor na textbox deveria ter uma correspondência direta com cada célula da planilha para não haver erro.

    Poderíam me ajudar?

    José Edison Sudani

    domingo, 14 de novembro de 2010 19:37

Respostas

  • Para executar o código abaixo, crie um formulário com uma ListBox chamada ListBox1:

    Veja como quando usamos as ferramentas adequadas o código fica mais simples:

    Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
      
      ListBox1.List(ListBox1.ListIndex) = InputBox( _
       Prompt:="Insira o novo valor:", _
       Title:="Alterar valor", _
       Default:=ListBox1)
      
      Cells(ListBox1.ListIndex + 1, "A") = ListBox1
      
    End Sub
    
    Private Sub UserForm_Initialize()
    
      Dim rLast As Long
      Dim r As Long
      
      rLast = Cells(Rows.Count, "A").End(xlUp).Row
      
      For r = 1 To rLast
        ListBox1.AddItem Cells(r, "A")
      Next r
    
    End Sub


    http://www.ambienteoffice.com.br
    domingo, 28 de novembro de 2010 23:30

Todas as Respostas

  • "Ou seja cada valor na textbox deveria ter uma correspondência direta com cada célula da planilha para não haver erro."

    Não entendi. Poderia explicar melhor?


    http://www.ambienteoffice.com.br
    segunda-feira, 15 de novembro de 2010 01:40
  • Não entendi. Poderia explicar melhor?


    Boa tarde Felipe.

    Numa textBox com a propriedade multiline habilitada, carrego os dados gravados num determinado intervalo A:A de uma planilha.

    Cada valor (ou linha da textbox) corresponde ao valor de uma célula. Se um desses valores, individualmente, estiver incorreto, gostaria de alterá-lo. Clicar nele apenas uma vez, para digitar o novo valor e depois com dois cliques repassar apenas este para a célula que retém o valor incorreto.

    Espero ter me expressado melhor desta vez, grato pela atenção.

    Edison

    segunda-feira, 15 de novembro de 2010 14:36
  • Eu não recomendo você usar uma Caixa de Texto para controlar Células da sua Planilha.

    Veja se o que eu fiz é o que você precisa:

    1 - Criei um formulário com uma Caixa de Texto TextBox1 (com propriedade Multiline = True);

    2 - Código do módulo:

    Option Explicit
    
    Dim blIniciado As Boolean
    
    Private Sub TextBox1_Change()
      
      If Not blIniciado Then Exit Sub
      
      Dim n As Long
      Dim lngCounter As Long
      Dim lngPróximoCounter As Long
      Dim lngAnteriorCounter As Long
      
      lngAnteriorCounter = 1
      lngCounter = 1
      For n = 1 To TextBox1.SelStart
        If Mid(TextBox1, n, 2) = vbCrLf Then
          lngAnteriorCounter = n + 2
          lngCounter = lngCounter + 1
        End If
      Next n
      lngPróximoCounter = Len(TextBox1)
      Do
        If Mid(TextBox1, n, 2) = vbCrLf Then
          lngPróximoCounter = n
          Exit Do
        End If
        n = n + 1
      Loop While n < Len(TextBox1)
      If n = Len(TextBox1) Then
        lngPróximoCounter = lngPróximoCounter + 1
      End If
      
      With Sheets("Plan1")
        .Cells(lngCounter, "A") = Mid(TextBox1, lngAnteriorCounter, (lngPróximoCounter - lngAnteriorCounter))
      End With
      
    End Sub
    
    Private Sub UserForm_Initialize()
      
      Dim rLast As Long
      
      With Sheets("Plan1")
        'Ler última linha
        rLast = .Cells(.Rows.Count, "A").End(xlUp).Row
        'Povoa a TextBox1 com valores da Coluna A
        TextBox1 = Join(WorksheetFunction.Transpose(.Range("A1:A" & rLast)), vbCrLf)
      End With
      
      blIniciado = True
      
    End Sub


    http://www.ambienteoffice.com.br
    segunda-feira, 15 de novembro de 2010 22:38
  • Boa noite Felipe.

    Farei uma experiência conforme sua sugestão e em seguida posto o resultado.

    Grato

    Edison

    sábado, 20 de novembro de 2010 22:08
  • Boa noite, Felipe. Experimentei seu código com pequeníssimas alterações, funciona, mas agora tenho que descobrir como proceder a alteração da célula usando a caixa de texto.

    Segue o código adaptado para sua avaliação: Tudo compilado num módulo.

    Option Explicit

    Dim bliniciado As Boolean

     

    Private Sub TextBox1_Change()


    If bliniciado = False Then Exit Sub
     
      Dim n As Long
      Dim lngCounter As Long
      Dim lngPróximoCounter As Long
      Dim lngAnteriorCounter As Long
     
      lngAnteriorCounter = 1
      lngCounter = 1
      For n = 1 To FrmRecibos.TextBox1.SelStart
        If Mid(FrmRecibos.TextBox1, n, 2) = vbCrLf Then
          lngAnteriorCounter = n + 2
          lngCounter = lngCounter + 1
        End If
      Next n
      lngPróximoCounter = Len(FrmRecibos.TextBox1) 'conta o nº de caracteres na caixa de texto. 'Retorna o nº de caracteres.
      Do
        If Mid(FrmRecibos.TextBox1, n, 2) = Chr(13) Then
          lngPróximoCounter = n
          Exit Do
        End If
     n = n + 1
      Loop While n < Len(FrmRecibos.TextBox1)
     
      If n = Len(FrmRecibos.TextBox1) Then
        lngPróximoCounter = lngPróximoCounter + 1
      End If
     
      With Sheets("Plan1").Cells(lngCounter, "A") = Mid(FrmRecibos.TextBox1, lngAnteriorCounter, (lngPróximoCounter - lngAnteriorCounter))
      End With
     
    FrmRecibos.Show

    End Sub


    Private Sub FrmRecibos_Initialize()
     
      Dim rLast As Integer
      bliniciado = True
    FrmRecibos.TextBox1 = vbNullString
      With Sheets("Plan1")
        'Ler última linha
        rLast = .Cells(.Rows.Count, "A").End(xlUp).Row
        'Povoa a TextBox1 com valores da Coluna A
       FrmRecibos.TextBox1 = Join(WorksheetFunction.Transpose(.Range("A1:A" & rLast)), Chr(13))
     
      End With
     
     
     
     
      TextBox1_Change
    End Sub

    Grato pela ajuda.

    Edison

     

    domingo, 21 de novembro de 2010 22:49
  • Não entendi sua pergunta: "mas agora tenho que descobrir como proceder a alteração da célula usando a caixa de texto."

    Esse código faz exatamente isso!


    http://www.ambienteoffice.com.br
    domingo, 21 de novembro de 2010 23:07
  • Desculpe-me pela minha expressão Felipe, mas não consegui meu objetivo apesar do código funcionar.

    Clico uma vez no valor da textbox, altero o valor, mas não consigo gravá-lo na célula.

    Grato pelo retorno.

    Edison

    domingo, 21 de novembro de 2010 23:30
  • Aqui funciona, as células da Planilha se alteram em sincronia com o que se digita no TextBox. Verifique se o seu TextBox se chama TextBox1 e tente preencher, por exemplo, dez linha na coluna A da Planilha Plan1. Observe também a propriedade MultiLine = True para o TextBox1.
    http://www.ambienteoffice.com.br
    domingo, 21 de novembro de 2010 23:34
  • OK Felipe, está assim, propriedade multiline = true; textbox1 na planilha plan1. Já inseri por código 12 valores um para cada célula.

    Só um detalhe. altero o valor na textbox e clico duas vezes nesse valor e nada acontece. O que está errado?

    Edison

    segunda-feira, 22 de novembro de 2010 00:07
  • O valor não altera com dois cliques, e sim na medida em que você digita. Não é necessário dar dois cliques, e sim simplesmente alterar os valores.
    http://www.ambienteoffice.com.br
    segunda-feira, 22 de novembro de 2010 00:08
  • OK. voltarei a trabalhar nela.

    Citação de Felipe:

    "Eu não recomendo você usar uma Caixa de Texto para controlar Células da sua Planilha."

    O que você recomendaria nesse caso?

    Grato

    Edison

    segunda-feira, 22 de novembro de 2010 00:12
  • Não sei bem qual é o seu objetivo, mas tudo indica que nesse caso seria melhor usar uma Caixa de Listagem (ListBox1), por exemplo.


    http://www.ambienteoffice.com.br
    segunda-feira, 22 de novembro de 2010 00:15
  • Após o preenchimento da planilha, vou checar o resultado da soma de todas as células. Se houver erro, vou comparar um por um todos os valores à procura de um possível erro. Encontrando-o altero seu valor na textbox e por código carrego-o na célula correspondente.

    A propósito cada coluna conterá no máximo 91 células.

    Grato pela atenção.

    Edison

    segunda-feira, 22 de novembro de 2010 00:24
  • "Se houver erro, vou comparar um por um todos os valores à procura de um possível erro. Encontrando-o altero seu valor na textbox e por código carrego-o na célula correspondente."

    Por que você não altera os valores incorretos na própria Planilha? O Excel é para isso!

    Há realmente a necessidade dessa operação ser feita em um formulário?


    http://www.ambienteoffice.com.br
    segunda-feira, 22 de novembro de 2010 14:00
  • Boa tarde Felipe.

    "Há realmente a necessidade dessa operação ser feita em um formulário?"


    A planilha foi construída para facilitar meu trabalho de auditoria, porém, outros gostaram, mas não sabem como lidar com ela. Daí a idéia de construir os formulários.

    Os formulários facilitam a entrada dos dados e apresentam os resultados que devem coincidir com registros em papel. E para aqueles que são mais leigos do que eu, vai facilitar um bocado.

    É algo pequeno, apenas uma planilha, mas dá muito trabalho.

    Grato; Edison

    sábado, 27 de novembro de 2010 16:41
  • Você precisa de um sistema. Pelo que deseja fazer, seria mais recomendável usar o Access.

    Se quiser em Excel, descarte todo código presente até agora e refaça utilizando ListBox ou ComboBox.

     


    http://www.ambienteoffice.com.br
    sábado, 27 de novembro de 2010 19:21
  • Valeu Felipe, vou estudar melhor sua sugestão.

    Grato; Edison

    domingo, 28 de novembro de 2010 22:53
  • Me diga mais em como ajudar. O fórum é para tirar dúvidas.

    Por exemplo: você sabe adicionar as células para o ListBox? Sabe como fazer aparecer uma janela quando se dá duplo clique num elemento da ListBox?


    http://www.ambienteoffice.com.br
    domingo, 28 de novembro de 2010 23:22
  • Para executar o código abaixo, crie um formulário com uma ListBox chamada ListBox1:

    Veja como quando usamos as ferramentas adequadas o código fica mais simples:

    Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
      
      ListBox1.List(ListBox1.ListIndex) = InputBox( _
       Prompt:="Insira o novo valor:", _
       Title:="Alterar valor", _
       Default:=ListBox1)
      
      Cells(ListBox1.ListIndex + 1, "A") = ListBox1
      
    End Sub
    
    Private Sub UserForm_Initialize()
    
      Dim rLast As Long
      Dim r As Long
      
      rLast = Cells(Rows.Count, "A").End(xlUp).Row
      
      For r = 1 To rLast
        ListBox1.AddItem Cells(r, "A")
      Next r
    
    End Sub


    http://www.ambienteoffice.com.br
    domingo, 28 de novembro de 2010 23:30