none
Carregar ListBox com RowSource da Erro RRS feed

  • Pergunta

  • Bom dia.

    Tenho uma pasta com varias planilhas que quando ativam acionam eventos que apresentam um ListBox Conforme Fig 1 que e carregado com RowSource conforme Fig 2, porem quando chega na linha com seta vermelha da erro.

    Os dados a serem carregados sao ranges de areas dinamicas nomeadas com nome da planilha concatenado com uma letra adicional conforme mostra a Fig 3.

    Na Fig 4 tem outra area dinamica para ser carregado em outra planilha que nao da problema, gostaria de saber porque o da Fig 3 da erro.

    Desde ja agrdeco a quem possa ajudar

    Tadao

    Fig 1

    Fig 2

    Fig 3

    Fig 4


    quinta-feira, 5 de janeiro de 2017 14:00

Respostas

  • Qual é o valor da variável Carrinho1 no momento que acontece o erro?

    Para saber se a referência gerada por Carrinho1 é válido ou não, copie o valor dela, volte ao Excel, pressione F5, cole o valor e pressione Enter. Se estiver correta, o Excel dá foco ao intervalo. Se não, apresentará erro.


    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    quinta-feira, 5 de janeiro de 2017 21:37
    Moderador
  • Troque:

    Private Sub UserForm_Initialize()
    

    Por:

    Private Sub UserForm_Activate()
    


    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    terça-feira, 10 de janeiro de 2017 12:41
    Moderador
  • Teoricamente, minha solução não é muito boa, tenho birra do evento Activate.

    A melhor prática seria você criar uma rotina à parte que atualizasse seu ListBox e chamasse ela quando necessário. A rotina seria assim:

    Private Sub UpdateListBox1()
        Carrinho1 = Empty
        
        Select Case True
            Case ActiveSheet.name = "カレンダー"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "送迎"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "掲示板"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "_21配置"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "_24配置"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "時刻承認書"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "男子名簿"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "女子名簿"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "退職者"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
              
        End Select
        
        Email.ListBox1.RowSource = Carrinho1
    
    End Sub


    Daí, você colocaria em Initialize:

    Private Sub UserForm_Initialize()
        UpdateListBox1
    End Sub

    Suponha que btnBotao1 chame o formulário "filho" em que você registra mais itens e, após sair, precisa atualizar. Então você faria:

    Private Sub btnBotao1_Click()
        UpdateListBox1
    End Sub

    Entendeu? Assim é bem melhor.


    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    terça-feira, 10 de janeiro de 2017 13:23
    Moderador

Todas as Respostas

  • Qual é o valor da variável Carrinho1 no momento que acontece o erro?

    Para saber se a referência gerada por Carrinho1 é válido ou não, copie o valor dela, volte ao Excel, pressione F5, cole o valor e pressione Enter. Se estiver correta, o Excel dá foco ao intervalo. Se não, apresentará erro.


    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    quinta-feira, 5 de janeiro de 2017 21:37
    Moderador
  • Contribuindo:

    Se o nome de sua planilha contiver espaços é necessário acrescentar ['] ao nome. Além disso é necessário sempre acrescentar [!], como no exemplo a seguir:

    'Nome da Aba'!$A$2:$A$8330

    Sua string está formada desta forma?

    Abraço.


    Filipe Magno

    sexta-feira, 6 de janeiro de 2017 00:21
  • Obrigado mais uma vez Felipe.

    A sugestao de verificar com F5 e muito boa, fiz conforme sua orientacao e o resultado foi Erro como mostra a Fig 5.

    Na Fig 5 mostra o nome da planilha 女子名簿 e no Jump F5 colei o valor que apareceu no carrinho1 depois de stop no codigo com F9, que e o nome da planilha 女子名簿 concatenada de 送先.

    Como mostra a Fig 6, so da erro onde esta demarcada em vermelho e teste com F5 onde as planilhas nao dao problemas e o resultado do F5 deu certinho na area indicada no carrinho1.

    Mas vendo a area nomeada da planilha que da erro da Fig 3 e a que nao da erro da Fig 4, nao consigo detectar onde esta o erro pois so esta mudando o nome e o endereco das celulas.

    Tadao

    Fig 6

    Na Fig 8 exemplo de captacao do carrinho1 da planilha que nao da erro e na Fig 9 esta o resultado do Jump para a area da Range Nomeada.

    Fig 8

    Fig 9




    sexta-feira, 6 de janeiro de 2017 03:04
  • Ola Felipe Magno, obrigado pela  contribuicao e pela atencao de sempre.

    O nome da planilha nao tem espaco, so aproveitei o nome da planilha concatenando com mais uma palavra que significa destinatario para nomear a area da Range que carrega o RowSource. Ex.:Nome da Planilha 女子名簿 concatenada de 送先. que significa destinatario. Sempre que abre uma planilha aciona um evento que carrega o Range destinado dessa planilha no RowSource da ListBox, cuja Range fica numa planilha auxiliar de nome 登録名 conforme mostra a Fig7

    Fig 7

    sexta-feira, 6 de janeiro de 2017 03:33
  • Filipe,

    Também achei interessante o Excel não precisar de caracteres especiais quando o nome da planilha possui caracteres de código estendidos.

    ---

    Para não dar erro de jeito nenhum na sua área (a não ser que o Excel fique doido):

    - Selecione o intervalo na sua planilha que deseja que a macro referencie.

    - No VBE, vá na janela de verificação imediata (Ctrl+G), digite ?Selection.Address(, , , 1) e pressione Enter.

    Você obterá algo como:

    [Pasta1]Plan1!$C$4:$G$14

    -Copie esse intervalo, pressione F5, cole na janela e veja se é válido.

    -Se for válido, deverá ser ele que irá entrar no seu código.

    -Note que ele qualifica o intervalo com o nome da pasta de trabalho e planilha antes. Isso pode ser um dos motivos de você estar dando erro: no seu caso, se no momento da atribuição de RowSource haver outra pasta de trabalho ativa, o Excel tenta atribuir o intervalo da planilha da pasta de trabalho ativa, e não da que possui o código.

    ---

    Por fim, tentei usar o nome de planilha こんにちは e fiz o teste acima. O VBE me informou:

    [Pasta1]?????!$C$4:$G$14

    Não sei se meu Excel coloou ? no lugar de caracteres japonês porque não tenho o pacote de idioma japonês instalado ou não. Tenho o pacote de idiomas de chinês instalado (estudo mandarim) e não obtive sucesso também.


    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    sexta-feira, 6 de janeiro de 2017 09:07
    Moderador
  • Obrigado pelo retorno Felipe C. Gualberto.

    Pelo que entendo uma das maneiras de carregar o ListBox seria atraves de enderecos das areas como:

    .RowSource=[Pasta1]Plan1!$C$4:$G$14  ou

    .RowSource=Sheets("Plan1").Range("$C$4:$G$14").Address.

    Uma outra maneira seria atraves de variaveis, no meu caso carrinho1 que ficaria como:

    .RowSource=carrinho1

    E na variavel carrinho1 coloquei carrinho= ActiveSheet.Name & "送先", ou seja, eu so emprestei o nome da planilha adicionando uma concatenacao para dar nome na area dinamica definida nas figuras 3,4 ou 7 que fica numa planilha auxiliar de nome 登録名.

    Como estou usando a opcao de colocar variavel, penso que nao precisa de caracteres especiais.

    O que mais acho estranho e que os Case envoltos com linha preta da figura 6 nao dao erro e os Case envoltos com linha vermelha dao erro.

    Outra cosa que poderia ser, seria a nomeacao da area dinamica conforme mostra a figura 3 e 4 . Na Figura 3 e a definicao da area que poderia estar dando erro, mas comparando com a figura 4 que nao esta dando erro, nao encontro diferenca a nao ser nos enderecos que seria obvio.

    Tadao

    sexta-feira, 6 de janeiro de 2017 10:30
  • Pensando bem, Felpe......quando testei com F5 conforme a sua primeira sugestao, a planilha que acionava eventos que dava erro de carregamento com F5 tambem dava erro, mas outras planilhas que nao dava erro de carregamento o F5 direcionava na area certinho conforme mostra a fiura 9.

    Achei que tinha errado de nome ( ou que tenha espacos a mais conforme disse o Felipe Magno) e renomeei a area copiando o nome da aba da planilha e colando na definicao da area nomeada, mas continuou dando erro.

    Vou tentar deletar a area que da erro e refazer para ver se resolve, e mando o retorno,Ok?

    Obrigado por enquanto.

    Tadao

    sexta-feira, 6 de janeiro de 2017 10:57
  • Ops Felipe Gualberto........eu de novo...

    Deletei o nome das areas nomeadas que estavam dando problemas e refiz novamente........nao sei porque mas funcionou....????. Acho que quando nao da jeito a solucao e deletar e refazer,nao?

    Agora fica uma duvida, qual das respostas marco como resposta. A sua primeira sugestao foi boa para achar o erro, entao vou marcar como reposta a sua primeira sugestao, ok?

    Agradeco a voce e Felipe Magno por ajudar na solucao, muito obrigado.

    Tadao

    sexta-feira, 6 de janeiro de 2017 11:32
  • Bom Dia Felipe Gualberto.

    Obrigado pela ajuda da solucao do problema de carregamento do ListBox.

    Se puder....gostaria de perguntar mais uma duvida caso este postagem ainda estiver aberta.

    A ListBox em questao e aberta depois de varias Form por exemplo, primeiro tem uma form que tem um botao de Salvar, aparecendo outra form com botoes de PDF e Excel, depois a form de Enviar email ou preview como mostra a Fig 10, porem quando acrescento nome ou altero na tabela da Fig 7 a ListBox nao carrega conforme mostra a Fig 10, mas se eu desativar o ultimo form aberto e abrir novamenete, a ListBox carrega......tem alguma explicaco para isso?

    O codigo Private Sub UserForm_Initialize() da Fig 6 esta na area de codificacao do ultimo form aberto onde tem o ListBox.

    Desde ja agradeco pela ajuda.

    Fig 10

    segunda-feira, 9 de janeiro de 2017 08:20
  • Você tem que atribuir RowSource = "" e depois RowSource ao valor que estava antes (após fechar o formulário filho) para que sua ListBox seja atualizada.

    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    segunda-feira, 9 de janeiro de 2017 13:04
    Moderador
  • Obrigado por atender o socorro Felipe.

    Nao entendi bem o que voce quis dizer,mas......sera que tenho que colocar o RowSource = "" no evento Deactivate dentro da area do formulario como abaixo?

    Mesmo assim nao deu certo, daria por favor para explicar com um pouco mais de detalhes pois nao domino muito ainda.

    Tadao

    Private Sub UserForm_Deactivate()
        Email.ListBox1.RowSource = ""
    
    End Sub
    
    Private Sub UserForm_Initialize()
        Carrinho1 = Empty
        
        Select Case True
            Case ActiveSheet.name = "カレンダー"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "送迎"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "掲示板"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "_21配置"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "_24配置"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "時刻承認書"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "男子名簿"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "女子名簿"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "退職者"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
              
        End Select
        
    Email.ListBox1.RowSource = Carrinho1
    
    End Sub
    

    segunda-feira, 9 de janeiro de 2017 14:05
  • Troque:

    Private Sub UserForm_Initialize()
    

    Por:

    Private Sub UserForm_Activate()
    


    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    terça-feira, 10 de janeiro de 2017 12:41
    Moderador
  • Ohhh...Felipe...Obrigado, agora funciona que e uma beleza.

    Tanto eventos que tem ai,nao? o que e preciso e usar o evento correto,ne. Obrigado.

    Tadao

    terça-feira, 10 de janeiro de 2017 13:07
  • Teoricamente, minha solução não é muito boa, tenho birra do evento Activate.

    A melhor prática seria você criar uma rotina à parte que atualizasse seu ListBox e chamasse ela quando necessário. A rotina seria assim:

    Private Sub UpdateListBox1()
        Carrinho1 = Empty
        
        Select Case True
            Case ActiveSheet.name = "カレンダー"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "送迎"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "掲示板"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "_21配置"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "_24配置"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "時刻承認書"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "男子名簿"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "女子名簿"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
            Case ActiveSheet.name = "退職者"
              Carrinho1 = ActiveSheet.name & "送先"
              Me.Label3 = "ファイル " & ActiveSheet.name
              
        End Select
        
        Email.ListBox1.RowSource = Carrinho1
    
    End Sub


    Daí, você colocaria em Initialize:

    Private Sub UserForm_Initialize()
        UpdateListBox1
    End Sub

    Suponha que btnBotao1 chame o formulário "filho" em que você registra mais itens e, após sair, precisa atualizar. Então você faria:

    Private Sub btnBotao1_Click()
        UpdateListBox1
    End Sub

    Entendeu? Assim é bem melhor.


    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    terça-feira, 10 de janeiro de 2017 13:23
    Moderador
  • O que eu achei que estava acontecendo e que quando coloco o carregamento na inicializacao do formulario, acho que a rotina passa nessa inicializacao so quando ela estiver desligada e volta a ser ligada, nao? O que eu estava ou estou usando e de esconder o formulaio com UserForm.Hide e nao Unload UserForm. Sera que se em vez de usar o Hide tivesse usado o Unload a rotina teria passado na inicializacao?

    Tadao

    terça-feira, 10 de janeiro de 2017 13:47
  • Se você der um Hide, o formulário não roda mais o Initialize. Tem que dar o Unload se quiser rodar o Initialize de novo.

    Em tempo: não consigo me lembrar a última aplicação de Excel em que usei o Hide. Acho que foi somente em uma barra de progresso. Tirando isso, mais nada.


    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    terça-feira, 10 de janeiro de 2017 14:13
    Moderador
  • Obrigado pela explanacao Felipe. Ate eu deixar de usar o Hide como voce.......vai demorar muito.....rs. Nas entrelinhas das conversas vi voce dizer que estuda Mandarin.......... Estudar chines para ir la faze negocio da china, e coisa de antigamente, nao?. Estude Japones que vou te buscar voce la no aeroporto de Narita e levo voce para um passeio em Tokyo,....... logo  logo as Olimpiadas estao ai.

    Tadao

    terça-feira, 10 de janeiro de 2017 14:43
  • Hhahahaha.

    Estudo mandarim apenas por hobby. Não tenho necessidade de uso profissional nem tenho planos para ir até a China.

    Gosto muito de mangá, deveria ter feito japonês mesmo, né? Mas agora não dá mais porque estou gostando muito do mandarim e quem sabe futuramente me ajude em negócios.

    Obrigado pelo convite e disposição, certamente a Olimpíada no Japão será excelente!


    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    terça-feira, 10 de janeiro de 2017 15:25
    Moderador
  • Vixixi ...se voce estuda......ainda mais por hobby o Mandarim que deve ter uns 20000 ideogramas......no Japones so tem uns 2000.., o resto e que nem abecedario, sendo assim voce vai se virar aqui tranquilo,ne. Estudo por necessidade....e ainda sai fumaca....rs.

    Nao posso ficar falando muito sobre esses assunto aqui.......senao vou ser censurado, mas o convite fica ai, vou ficar a sua disposicao na sua estada caso venha,ok.

    Tadao

    quarta-feira, 11 de janeiro de 2017 00:07