PRB: "A operação tem de utilizar uma consulta atualizável" Quando acede ao Excel através do ODBC

Sintomas

Quando edita uma folha de cálculo do Excel através do ADO e do ODBC, poderá receber a seguinte mensagem de erro se utilizar um objeto ADO DataControl:

[Microsoft][ODBC Excel Driver] Operation must use an updateable query.

Se utilizar um objeto Conjunto de registos gerado com código ADO, poderá receber a seguinte mensagem de erro ao editar uma folha de cálculo do Excel através do ADO e ODBC:

Run-time error '-2147467259(80004005)': [Microsoft][ODBC Excel Driver] Operation must use an updateable query.

Causa

Este problema ocorre se tentar editar uma folha de cálculo guardada ou aberta como ReadOnly.

Nota

ReadOnly é a predefinição para uma ligação ODBC ao Excel, com ou sem um nome de origem de dados (DSN). Por conseguinte, o utilizador tem de alterar sempre essa definição para editar dados.

Resolução

Para resolver este problema, utilize os seguintes métodos:

  • Certifique-se de que a propriedade LockType do objeto ConjuntodeRegistos não está definida como ReadOnly.

  • Certifique-se de que o ficheiro que está a tentar abrir não está guardado como ReadOnly.

  • Se estiver a ligar através de um DSN, siga estes passos:

    1. Abra Painel de Controlo e, em seguida, clique em Administrador de Origem de Dados ODBC.
    2. Faça duplo clique no DSN.
    3. Na caixa de diálogo Configuração do Microsoft Excel ODBC, clique em Opções.
    4. Certifique-se de que a caixa de verificação Só de Leitura não está selecionada.
  • Se estiver a utilizar uma ligação sem DSN, certifique-se de que inclui a opção "ReadOnly=0" no cadeia de ligação. Por exemplo:

    cn.Open "Driver={Microsoft Excel Driver (*.xls)};DBQ=C:\MyDoc.xls;ReadOnly=0;"
    

Estado

Este comportamento é por concepção.

Mais Informações

Passos para Reproduzir o Comportamento

  1. Crie um novo projeto EXE Standard no Visual Basic.

  2. No menu Projeto, clique em Referências e, em seguida, adicione uma referência à Biblioteca de Objetos de Dados do Microsoft ActiveX.

  3. Adicionar um botão comando ao Form1.

  4. Adicione o seguinte código ao Form1:

    Dim rs As ADODB.Recordset
    Dim cn As ADODB.Connection
    
    Private Sub Form_Load()
      Command1.Caption = "Edit"
    End Sub
    
    Private Sub Command1_Click()
      Dim DocPath As String
    
      DocPath = App.Path & "\Test.xls"
    
      Set cn = New Connection
      Set rs = New Recordset
    
      cn.Open "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & DocPath & ";ReadOnly=1"
      rs.LockType = adLockOptimistic
      rs.Open "TB1", cn
      rs.AddNew
      rs.Fields(1).Value = "New Value"
      rs.Update
    
      rs.Close
      cn.Close
      Set rs = Nothing
      Set cn = Nothing
    End Sub  
    
  5. Guarde a aplicação.

  6. Crie uma nova folha de cálculo do Excel e, em seguida, guarde a folha de cálculo como Test.xls.

  7. No menu Inserir, aponte para Nome e, em seguida, clique em Definir.

  8. Crie uma nova tabela dentro da folha de cálculo do Excel e, em seguida, atribua o nome TB1 à tabela.

  9. Guarde a folha de cálculo na mesma pasta que a aplicação Visual Basic.

  10. Prima F5 para executar a aplicação.

Referências

Para obter informações adicionais, consulte o seguinte artigo:

Espaço do Office: Sugestões e Truques para Scripting de Aplicações do Microsoft Office