Como criar o banco de dados Microsoft Access do Microsoft Excel usando DAO

Traduções deste artigo Traduções deste artigo
ID do artigo: 151566 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Em alguns casos, você talvez queira criar um banco de dados Microsoft Access de um Microsoft Excel para pasta de trabalho do Windows 95 versão 7.0, mas não conseguem usar links de acesso. Enquanto o método preferencial de mover uma pasta de trabalho do Microsoft Excel para o Microsoft Access é usar links de acesso, você também pode usar o objeto de acesso de dados (DAO).

Causa

Os motivos para não poder usar os links de acesso incluem (mas não limitados a) o seguinte:
  • Microsoft Access para Windows 95 versão 7.0 não está instalado no computador.
  • Não há recursos suficientes no sistema para que o Microsoft Excel e Microsoft Access carregados ao mesmo tempo.

Como Contornar

Você pode usar objetos de acesso a dados (DAO) para criar qualquer versão de um banco de dados do Microsoft Access. Embora este método não seja como concluído como links de acesso, você pode usá-lo para criar um banco de dados Microsoft Access a partir de uma pasta de trabalho do Microsoft Excel. Esse método deve ser usado somente se você estiver familiarizado com Visual Basic for Applications e bastante familiarizado com bancos de dados para poder editar as tabelas que são criadas por esse código.

Algumas coisas que talvez você precise alterar são os tipos de dados de cada campo e se deseja ou não a indexação.

Mais Informações

Microsoft fornece exemplos de programação apenas para ilustração, sem garantia expressa ou implícita. Isso inclui, mas não está limitado a, garantias implícitas de comercialização ou adequação para uma finalidade específica. Este artigo presume que você está familiarizados com a linguagem de programação que está sendo demonstrada e com as ferramentas que são usadas para criar e depurar procedimentos. Engenheiros de suporte podem ajudar a explicar a funcionalidade de um determinado procedimento, mas eles não modificarão esses exemplos para fornecer funcionalidades adicionais ou construir procedimentos para atender às suas necessidades. O código neste artigo irá passar por cada planilha em uma pasta de trabalho Microsoft Excel versão 7.0 e criar uma tabela do Microsoft Access como especificado no código. Há vários requisitos para este código funcionar corretamente.

Observação: Esses requisitos são semelhantes às que seriam necessário se você estava transferindo dados usando links de acesso.

Por favor, verifique se a pasta de trabalho usada tem uma lista em cada planilha consiste em pelo menos duas colunas.

Os requisitos são da seguinte maneira:

  • Os dados devem estar no formulário de coluna com os nomes de campo na primeira linha. Enquanto os dados podem iniciar em qualquer linha, essa sub-rotina pressupõe que linha 1 contém os nomes de campo e tudo sob linha 1 é dados para a tabela.
  • Os dados devem ser contíguos. Dados ausentes em um registro não afetarão negativamente essa sub-rotina. No entanto, após uma linha em branco é encontrada, a sub-rotina assumirá que ele tenha recuperado todos os dados na planilha atual. Da mesma forma, uma vez que uma coluna em branco é encontrada, a sub-rotina assumirá que existem mais campos para a direita.
  • Cada coluna será ser considerada como um campo e cada linha será ser considerada como um registro. Por exemplo, os dados devem ser configurados da seguinte maneira:
          Lname              Fname       EmpNum     SpouseName
          Ebbeson            Frida          12         Dave
          Edelstein          Alex           15
          Edmonds            Cora           18         Paul
          Eliasen            Deborah        22         Tom
          Erickson           Gregory J      25         Lisa
          Fallon             Scott          23
          Feig               Wayne A.       35         Laurie
          Fetty              Ellen M.       54         James
    						
    Observe que são permitidos registros incompletos.
A sub-rotina descrito a seguir fará o seguinte:
  • Declare variáveis. Embora isso não seja necessário, é útil para verificação e reduzindo a quantidade de memória que você usar a sintaxe.
  • Desative a atualização da tela. Isso fará com que a sub-rotina execução mais rápida, além de você não verá a tela piscar.
  • Crie o banco de dados. O primeiro argumento especifica onde o banco de dados será e qual será o nome. A sub-rotina cria o novo banco de dados na mesma pasta como a pasta de trabalho e com o mesmo nome que a pasta de trabalho (com uma extensão .mdb). Se já houver um banco de dados com esse nome na pasta, uma caixa de mensagem será exibido perguntando se você deseja excluir o banco de dados existente. Isso é feito por ajuste de registro "Erro 3294 banco de dados já existe."
  • Configure um loop para percorrer todas as planilhas na pasta de trabalho.

    Observação: Como módulos, folhas de gráfico e folhas de caixa de diálogo não fazem parte da coleção planilha, elas não afetarão a sub-rotina.
  • Dentro do loop de planilha, crie uma tabela baseada no nome da planilha.
  • Insira um loop que passa por cada coluna no intervalo de dados e cria um campo na tabela com o mesmo nome como títulos de coluna. Na seção Criar campo da sub-rotina, você precisa saber que tipo de dados para atribuir o novo campo. Para fazer isso, a sub-rotina examina a célula diretamente abaixo dela e determina a propriedade NumberFormat da célula.

    Uma instrução Select Case é inserida parecida à esquerda a maioria dos letra da propriedade NumberFormat. O tipo de dados é criado, com base nessa letra. Se um "m", "d" ou "y" é retornado, o tipo de dados é definido como "dbDate." Se "G" for retornado, a célula abaixo dela estiver formatada para "Geral". Se for esse o caso, você precisará determinar se a célula contiver um número ou texto.

    Para testar para ver se a célula contiver um número ou texto, a sub-rotina tenta dividir o conteúdo da célula por 2. Se a divisão falhar, a rotina cai para um manipulador de erro, que determina se o "Tipo incompatível" é o erro. Se for esse o caso, o campo é definido como dbText. Se a divisão for bem sucedida, a sub-rotina cai para a próxima célula para baixo para determinar se essa divisão ser bem-sucedida. Isso é necessário porque você precisa determinar que todos os registros contêm um número para esse campo antes de atribuir o tipo de dados em um formato de número. Se todas as divisões são bem-sucedidas, um tipo de dados de dbDouble é atribuído.

    Porque a verificação de que cada célula em uma coluna é um processo demorado. A sub-rotina verifica a presença de "CEP" ou "Postal" no cabeçalho da coluna. O motivo para isso é que os códigos de zip e códigos postal devem ser formatados como dbText. Mesmo se você tiver todos os códigos de zip de 5 dígitos na planilha, talvez queira adicionar um CEP 9 dígitos algum dia. Se você tiver o campo formatado como "dbDouble", você receberá uma mensagem de erro ao tentar inserir o ZIP mais valor quatro. Procurar por "CEP" ou "Postal" reduz o tempo do processador para criar o campo.

    Se todas as instruções Select Case falharem, o campo é definido como dbText.
  • Após a criação de todos os campos em uma planilha, todos os dados é adicionada à tabela.
  • Depois que todos os dados é adicionado à tabela, a próxima planilha está selecionada e o processo inicia novamente até que todas as planilhas foram selecionadas e salvas como uma tabela.
          Sub DataToAccess()
         ' Declare variables.
         Dim Db As database
         Dim Rs As Recordset
         Dim Td As TableDef
         Dim Fd As Field
         Dim x As Integer
         Dim i As Integer
         Dim f As Integer
         Dim r As Integer
         Dim c As Integer
         Dim Message As String
         Dim Title As String
         Dim LastColumn As Integer
         Dim NumberTest As Double
         Dim StartCell As Object
         Dim LastCell As Object
         Dim Response
         Dim CreateFieldFlag As Integer
         Dim Flag As Integer
    
         CreateFieldFlag = 0
         Flag = 0
    
         ' Turn off Screen Updating.
         Application.ScreenUpdating = False
         On Error GoTo ErrorHandler
    
    
         ' Create the database.
         ' This line will create an Microsoft Access 2.0 database. To vary the
         ' version of the database, change the "dbVersion" constant.
         ' See "CreateDatabase" in online Help for more information.
         ' The database will be created in the same folder as the
         ' activeworkbook.
    
         Set Db = workspaces(0).CreateDatabase(ActiveWorkbook.Path & "\" & _
            Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 4) _
            & ".mdb", dbLangGeneral, dbVersion20)
    
         ' Loop through all the worksheets in the workbook.
         For i = 1 To Worksheets.Count
    
            ' Select the "i th" worksheet and Cell "A1."
            ' In this example, you need column headers in the first row.
            ' These headers will become field names.
            Worksheets(i).Select
            Range("A1").Select
    
            ' If the ActiveCell is blank, open a message box.
            If ActiveCell.Value = "" Then
                Message = "There is no data in the active cell: " & _
                    ActiveSheet.Name & "!" & ActiveCell.Address & Chr(10) & _
                    "Please ensure that all your worksheets have data on " & _
                    "them " & Chr(10) & _
                    "and the column headers start in cell A1" & Chr(10) & _
                    Chr(10) & "This process will now end."
    
                Title = "Data Not Found"
    
                MsgBox Message, , Title
                Exit Sub
            End If
    
            ' Create a new Table, and use the Worksheet Name as the
            ' Table Name.
            Set Td = Db.CreateTableDef(Worksheets(i).Name)
    
            ' Find the number of fields on the sheet and store the number
            ' of the last column in a variable.
            Selection.End(xlToRight).Select
            LastColumn = Selection.Column
    
            ' Select the current region. Then find what the address
            ' of the last cell is.
            Selection.CurrentRegion.Select
            Set LastCell = Range(Right(Selection.Address, _
                Len(Selection.Address) - _
                Application.Search(":", Selection.Address)))
    
            ' Go back to cell "A1."
            Range("A1").Select
    
            ' Enter a loop that will go through the columns and
            ' create fields based on the column header.
            For f = 1 To LastColumn
                Flag = 0
    
                ' Enter a select case statement to determine
                ' the cell format.
                Select Case Left(ActiveCell.Offset(1, 0).NumberFormat, 1)
                    Case "G"    'General format
                        ' The "General" format presents a special problem.
                        ' See above discussion for explanation
                        If ActiveCell.Value Like "*Zip*" Then
                            Set Fd = Td.CreateField(ActiveCell.Value, _
                                dbText)
                            Fd.AllowZeroLength = True
                            r = LastCell.Row - 1
                            Flag = 1
                        Else
                            If ActiveCell.Value Like "*Postal*" Then
                                Set Fd = Td.CreateField(ActiveCell.Value, _
                                    dbText)
                                Fd.AllowZeroLength = True
                                r = LastCell.Row - 1
                                Flag = 1
                            End If
                        End If
    
                        ' Set up a text to determine if the field contains
                        ' "Text" or "Numbers."
                        For r = 1 To LastCell.Row - 1
                            If Flag = 1 Then r = LastCell.Row
                            CreateFieldFlag = 1
                            NumberTest = ActiveCell.Offset(r, 0).Value / 2
                        Next r
    
                        ' If we get all the way through the loop without
                        ' encountering an error, then all the values are
                        ' numeric, and we assign the data type to be "dbDouble"
                        If Flag = 0 Then
    
                            Set Fd = Td.CreateField(ActiveCell.Value, dbDouble)
                        End If
    
                    ' Check to see if the cell below is formatted as a date.
                    Case "m", "d", "y"
                        Set Fd = Td.CreateField(ActiveCell.Value, dbDate)
    
                    ' Check to see if the cell below is formatted as currency.
                    Case "$", "_"
                        Set Fd = Td.CreateField(ActiveCell.Value, dbCurrency)
    
                    ' All purpose trap to set field to text.
                    Case Else
                        Set Fd = Td.CreateField(ActiveCell.Value, dbText)
                    End Select
    
                ' Append the new field to the fields collection.
                Td.Fields.Append Fd
    
                ' Move to the right one column.
                ActiveCell.Offset(0, 1).Range("A1").Select
    
            ' Repeat the procedure with the next field (column).
            Next f
    
            ' Append the new Table to the TableDef collection.
            Db.tabledefs.Append Td
    
            ' Select Cell "A2" to start the setup for moving the data from
            ' the worksheet to the database.
            Range("A2").Select
    
            ' Define the StartCell as the Activecell. All record addition
            ' will be made relative to this cell.
            Set StartCell = Range(ActiveCell.Address)
    
            ' Open a recordset based on the name of the activesheet.
            Set Rs = Db.OpenRecordset(Worksheets(i).Name)
    
            ' Loop through all the data on the sheet and add it to the
            ' recordset in the database.
            For x = 0 To LastCell.Row - 2
                Rs.AddNew
                For c = 0 To LastColumn - 1
                    Rs.Fields(c) = StartCell.Offset(x, c).Value
    
                Next c
                Rs.Update
            Next x
    
         ' Repeat the process for the next worksheet in the workbook.
         Next i
         Application.ScreenUpdating = True
         Exit Sub
    
    ErrorHandler:
         Select Case Err
            Case 3204   ' Database already exists.
               Message = "There has been an error creating the database." & _
                    Chr(10) & _
                    Chr(10) & "Error Number: " & Err & _
                    Chr(10) & "Error Description: " & Error() & _
                    Chr(10) & _
                    Chr(10) & "Would you like to delete the existing" & _
                    "database:" & Chr(10) & _
                    Chr(10) & ActiveWorkbook.Path & "\" & _
                    Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 4) & _
                    ".mdb"
                Title = "Error in Database Creation"
                Response = MsgBox(Message, vbYesNo, Title)
                If Response = vbYes Then
                    Kill ActiveWorkbook.Path & "\" & _
                      Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) -4) _
                      & ".mdb"
                    Message = ""
                    Title = ""
                    Resume
                Else
                    Message = "In order to run this procedure you need" & _
                        Chr(10) & "to do ONE of the following:" & _
                        Chr(10) & _
                        Chr(10) & "1.  Move the existing database to a " & _
                        "different directory, or " & _
                        Chr(10) & "2.  Rename the existing database, or" & _
                        Chr(10) & "3.  Move the workbook to a different " & _
                        "directory, or" & _
                        Chr(10) & "4.  Rename the workbook"
                    Title = "Perform ONE of the following:"
                    MsgBox Message, , Title
                    Message = ""
                    Title = ""
                    Exit Sub
                End If
    
            ' Check to see if the error was Type Mismatch. If so, set the
            ' file to dbText.
            Case 13 ' Type mismatch.
                If CreateFieldFlag = 1 Then
                    Set Fd = Td.CreateField(ActiveCell.Value, dbText)
                    Fd.AllowZeroLength = True
                    Flag = 1
                    r = LastCell.Row - 1
                    CreateFieldFlag = 0
                    Resume Next
                Else
                    Message = "You have a ""Type Mismatch"" in the code" _
                        & Chr(10) _
                        & Chr(10) & "Error Number: " & Err _
                        & Chr(10) & "Error Description: " & Error() _
                        & Chr(10) _
                        & Chr(10) & "This procedure will close."
    
                    Title = "Type Mismatch"
                    MsgBox Message, , Title
                    Message = ""
                    Title = ""
                End If
    
            ' For any other error, display the error.
            Case Else
               Message = "An error has occured in the procedure." _
                    & Chr(10) _
                    & Chr(10) & "Error Number: " & Err _
                    & Chr(10) & "Error Description: " & Error()
    
                Title = "An error has occured"
                MsgBox Message, , Title
                Message = ""
                Title = ""
         End Select
         End Sub

Referências

Microsoft Access 97

Para obter mais informações sobre a criação de índices, clique na guia Índice na Ajuda do Microsoft Access, digite o seguinte texto:
índices, criando
e, em seguida, clique duas vezes no texto selecionado para ir para o "um índice para localizar e classificar registros mais rápido de criar".

Microsoft Access 7.0

Para obter mais informações sobre a indexação, clique em Assistente de resposta, no menu Ajuda no Microsoft Access 7.0, digite o índice na caixa Pesquisar e clique em "decidir se e quando usar um índice."

Microsoft Access 2.0

Para obter mais informações sobre a indexação, clique em Pesquisar no menu Ajuda no Microsoft Access versão 2.0, digite índice na caixa Pesquisar, clique em "Índice (Consulte também índices)" e clique em "Criando um índice" em tópicos.

Propriedades

ID do artigo: 151566 - Última revisão: quarta-feira, 11 de outubro de 2006 - Revisão: 2.3
A informação contida neste artigo aplica-se a:
  • Microsoft Excel 97 Standard Edition
  • Microsoft Excel 95 Standard Edition
Palavras-chave: 
kbmt kbdtacode kbhowto kbprogramming KB151566 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 151566
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com