Como programar spinbutton para alterar entre planilhas com uma característica comum?

Respondido Como programar spinbutton para alterar entre planilhas com uma característica comum?

  • sábado, 4 de agosto de 2012 21:46
     
      Contém Código

       Olá,

       Possuo algumas planilhas que possuem em seus nomes uma palavra em comum. Por exemplo, em "Médicos (Sorocaba)", "Médicos (Manaus)", "Dentistas (Sorocaba)", a cidade de "Sorocaba" aparece duas vezes.

      Assim, a partir de um formulário em que o usuário digitasse "Sorocaba", as planilhas referentes a essas cidades seriam abertas, sendo que haveria um spinbutton para alterar entre elas.

      Abrir uma planilha com um determinado nome é relativamente simples

    digitado = textbox1.text
    For i = 1 To Sheets.count        
         If Sheets(i).name = digitado Then
         sheets(i).select
         End If
    Next i

       Como as planilhas possuem nomes maiores que simplesmente a cidade digitada, acredito que eu deva usar a função InStr(1, digitado, sheets(i).name, 1) para verificar se "digitado" pertence ao nome da planilha, assim:

    digitado = textbox1.text
    For i = 1 To Sheets.count
       If InStr(1, digitado, sheets(i).name, 1) <> 0 and InStr(1, digitado, sheets(i).name, 1) <> Null Then
    planilhas_encontradas(j) = i
    j = j+1
    End If
    Next i
    sheets(planilhas_encontradas(0)).select


    Minha pergunta fica em relação ao uso de spinbutton para alterar entre cada "planilhas_encontradas(j)"

Todas as Respostas

  • terça-feira, 7 de agosto de 2012 00:27
     
      Contém Código

    Eu reescreveria sua primeira rotina como mostrado abaixo:

    Sub Exemplo()
        digitado = textbox1.Text
        For i = 1 To Sheets.Count
            If Sheets(i).Name = digitado Then
                On Error Resume Next
                Sheets(i).Select
                Sheets(i).Activate
                On Error GoTo 0
                'É uma boa prática sair de um laço após termos satisfeito a condição:
                Exit Sub
            End If
        Next i
    End Sub
    Não entendi muito bem sua pergunta final, mas tente isso:
    Sub Exemplo2()
        digitado = textbox1.Text
        For i = 1 To Sheets.Count
            If InStr(1, digitado, Sheets(i).Name) > 0 Then
                On Error Resume Next
                Sheets(i).Select
                Sheets(i).Activate
                On Error GoTo 0
                Exit For
            End If
        Next i
    End Sub



    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

  • terça-feira, 7 de agosto de 2012 23:17
     
      Contém Código

    Obrigado, acho que dei menos atenção à pergunta e mais à parte anterior.

    Tentarei descrever melhor o problema:

       Primeiramente encontramos a lista de planilhas contendo em seu nome um termo digitado em uma textbox (para isto, uso o InStr() na verificação, da forma como apresentou e salvo em um vetor, por exemplo, o número das planilhas que contém o que foi digitado).

    planilhas_encontradas(j) = i

     

      A princípio, bastava abrir a primeira planilha encontrada (aliás, neste caso, tem diferença entre .Select e .Activate?).

    Sheets(i).Select

      No entanto, pode haver mais de uma planiha contendo em seu nome o valor digitado na textbox. Por isso, o que pretendo fazer é abrir um novo userform que reunirá as respostas da busca acima. Isto é, haverá um label e um spinbutton que, conforme é rolado (Up e down), vão se abrindo as planilhas contendo em seu nome o que havia sido digitado lá no userform anterior.

       Como não tenho experiência com SpinButton, pensei em criar dois botões. Porém travei novamente, pois não sei como faço para enviar variáveis de um formulário para outro (no caso,o vetor planilhas_encontradas(j)).

  • terça-feira, 7 de agosto de 2012 23:37
     
     Resposta Proposta Contém Código

    Seja Lista_de_Plan() o vetor que guarda os números das planilhas que contêm uma palavra digitada em um textbox.

    Bem, no form seguinte, há um spinbutton, no qual inseri a seguinte função:

    Private Sub SpinButton1_SpinUp()
        Sheets(Lista_de_Plan(SpinButton1.Value)).Select
    End Sub

    Deveria estar funcionando, porém alerta para o seguinte erro: "Erro de compilação, sub ou function não definida". Ou seja, o novo formulário parece não estar reconhecendo Lista_de_Plan().

    Para resolver isso, declarei "Lista_de_Plan()" em Módulo 1, mesmo assim não está funcionando.

    ==========================================

    Uma outra solução seria, ao invés de exportar Lista_de_Plan() para o novo userform, exportar apenas o que foi digitado na textbox e refazer a busca no novo userform, mas também não consegui "exportar" textbox1.caption para outro form.

    • Editado marlon2s terça-feira, 7 de agosto de 2012 23:56 adicionar dúvida sobre uma outra solução
    • Sugerido como Resposta Hezequias VasconcelosModerator terça-feira, 11 de setembro de 2012 15:40
    •  
  • quarta-feira, 8 de agosto de 2012 01:34
     
     Respondido Contém Código

    Crie um formulário com:

    1 TextBox (Caixa de Texto)

    1 SpinButton (Botão de Rotação)

    1 Label (Rótulo)

    Cole o código abaixo:

    Dim vlLista() As Long
    
    Private Sub SpinButton1_Change()
        AtualizarLabel
    End Sub
    
    Private Sub TextBox1_Change()
        AtualizarPlanilhas
    End Sub
    
    Private Sub UserForm_Initialize()
        Erase vlLista
        AtualizarPlanilhas
    End Sub
    
    Private Sub AtualizarPlanilhas()
        Dim lCont As Long
        Dim lPlan As Long
        
        With ActiveWorkbook
            For lPlan = 1 To .Sheets.Count
                If .Sheets(lPlan).Name Like "*" & TextBox1 & "*" Then
                    lCont = lCont + 1
                    ReDim Preserve vlLista(1 To lCont)
                    vlLista(lCont) = lPlan
                End If
            Next lPlan
        End With
    
        If lCont > 0 Then
            SpinButton1.Enabled = True
            SpinButton1.Min = 1
            SpinButton1.Max = lCont
            SpinButton1 = 1
            AtualizarLabel
        Else
            SpinButton1.Enabled = False
            Label1 = ""
        End If
    End Sub
    
    Private Sub AtualizarLabel()
        Label1 = Sheets(vlLista(SpinButton1)).Name
    End Sub


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

  • quarta-feira, 8 de agosto de 2012 01:35
     
     
    O código acima diferencia maiúsculas de minúsculas, é isso o que quer?

    Felipe Costa Gualberto - http://www.ambienteoffice.com.br