locked
COPIAR DADOS DE UM RECORDSET PARA OUTRA WORKBOOK [URGENTE] + VBA RRS feed

  • Pergunta

  • Pessoal boa tarde,

    Meu caso é o seguinte, tenho duas workbooks pesquisa.xlsm e database.xlsx onde no arquivo pesquisa.xlsm executo uma pesquisa a um servidor via ODBC, que esta pesquisa feita em SQL está armazenada em um recordset, até aqui está tudo ok.

    Meu problema é... preciso copiar os dados que estão neste recordset rst para o arquivo database.xlsx.

    Como posso fazer isto? Alguém pode me ajudar quanto a isso, desde já agradeço.


    Carlos Carvalho Citrangulo Junior MCP - MCDST - MCTS Microsoft Windows Vista Configuration - MCITP Enterprise Support Technician
    segunda-feira, 24 de janeiro de 2011 18:09

Respostas

  • Carlos faça o seguinte..

    No inicio do seu código coloque o seguinte

     

    dim Wb1 as workbook, wb2 as workbook

    Quando for abrir o pesquisa utilize

    set wb1=workbooks.open("c:\pesquisa.xlsm")

    para o database use

    set wb2=workbooks.open("c:\database.xlsx")

    Depois quando tiver seu recordset , use

    wb2.sheets(1).range("A1").copyfromrecordset nomedoseurecordset

    Teste ai e qqer coisa fale.

    Att

     


    Bruno Silva Leite
    officevb.com
    segunda-feira, 24 de janeiro de 2011 19:15

Todas as Respostas

  • Carlos faça o seguinte..

    No inicio do seu código coloque o seguinte

     

    dim Wb1 as workbook, wb2 as workbook

    Quando for abrir o pesquisa utilize

    set wb1=workbooks.open("c:\pesquisa.xlsm")

    para o database use

    set wb2=workbooks.open("c:\database.xlsx")

    Depois quando tiver seu recordset , use

    wb2.sheets(1).range("A1").copyfromrecordset nomedoseurecordset

    Teste ai e qqer coisa fale.

    Att

     


    Bruno Silva Leite
    officevb.com
    segunda-feira, 24 de janeiro de 2011 19:15
  • Veja duas formas de se ler os cabeçalhos e os dados de um recordset (por looping ou colar todos de uma vez):

      'Copia os campos para o cabeçalho
      For n = 0 To rs.Fields.Count - 1
        Cells(1, n + 1) = rs.Fields(n).Name
      Next n
      
      'Este método copia todo o RecordSet para a Planilha:
      Cells(2, 1).CopyFromRecordset rs
      
      'Retorna o RecordSet para a posição inicial
      rs.MoveFirst
      
      'Para efeito de conhecimento, poderia-se também
      'utilizar a rotina abaixo para mostrar os resultados:
      'Loop em todos resultados até que se chegue ao último
      Do While Not rs.EOF
        Debug.Print rs.Fields(0), rs.Fields(1)
        'Poderia ser também:
        'Debug.Print rs.Fields("NOME"), rs.Fields("Descrição")
        rs.MoveNext 'Vai para próximo resultado
      Loop


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br
    segunda-feira, 24 de janeiro de 2011 22:57
  • Só tome cuidado com o exemplo acima para ter certeza que o cells a que se refere é o da pasta de trabalho que vc deseja, por isto a criação e atribuição das variáveis no primeiro exemplo.
    Bruno Silva Leite
    officevb.com
    segunda-feira, 24 de janeiro de 2011 23:31
  • Exato!

    Qualifique cada um dos intervalos com seus pais completos, como em:

    Workbooks("Pasta1").Sheets("Plan1").Cells(2,1) = ...


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br
    segunda-feira, 24 de janeiro de 2011 23:47
  • Prezado Bruno bom dia,

    Desde já muito obrigado pela ajuda, só acrescentando uma informação que tinha esquecido de citar, preciso copiar os dados do recordset de um arquivo para a outra workbook sem que seja necessário abrir a outra workbook, sabe me dizer como, ou tem uma solução paleativa, porque o que ocorre é o seguinte, quando copio os dados para a outra workbook, ela abre o arquivo, depois executo novamente e ele diz "o arquivo ja está aberto, funcionará como somente leitura, na verdade se estiver já aberto, quero que ele execute a copia dos dados normalmente e monte meus gráficos, e se nao estiver aberto que copie normalmente também e quando eu for abrir que os dados estejam atualizados.

    Muito obrigado e fico no aguardo de uma nova ajuda, de qualquer forma ja estou qualificando sua resposta.


    Carlos Carvalho Citrangulo Junior MCP - MCDST - MCTS Microsoft Windows Vista Configuration - MCITP Enterprise Support Technician
    terça-feira, 25 de janeiro de 2011 11:57
  • Amigo bom dia,

    Desculpe minha ignorância, mas então ficaria desta forma?

     'Copia os campos para o cabeçalho
      For n = 0 To rs.Fields.Count - 1
        Workbooks("database.xlsx").Sheets("dados").Cells(1, n + 1) = rs.Fields(n).Name
      Next n
     
      'Este método copia todo o RecordSet para a Planilha:
      Workbooks("database.xlsx").Sheets("dados").Cells(2, 1).CopyFromRecordset rs
     
      'Retorna o RecordSet para a posição inicial
      rs.MoveFirst
     
      'Para efeito de conhecimento, poderia-se também
      'utilizar a rotina abaixo para mostrar os resultados:
      'Loop em todos resultados até que se chegue ao último
      Do While Not rs.EOF
        Debug.Print rs.Fields(0), rs.Fields(1)
        'Poderia ser também:
        'Debug.Print rs.Fields("NOME"), rs.Fields("Descrição")
        rs.MoveNext 'Vai para próximo resultado
      Loop

    Desta forma eu consigo copiar os dados sem abrir a database?


    Carlos Carvalho Citrangulo Junior MCP - MCDST - MCTS Microsoft Windows Vista Configuration - MCITP Enterprise Support Technician
    terça-feira, 25 de janeiro de 2011 12:17
  • Você deve primeiramente criar e estabelecer uma conexão à uma base de dados. Você está fazendo isso? Poste seu código completo.
    Felipe Costa Gualberto - http://www.ambienteoffice.com.br
    terça-feira, 25 de janeiro de 2011 20:44