2015-01-12 8 views
6

Attualmente utilizzo questa funzione in VBA per ottenere il valore di una cella in una cartella di lavoro chiusa. Voglio utilizzare un processo simile per impostare il valore della cella su qualsiasi cosa desideri, senza aprire il file. È possibile?Usa VBA di Excel per modificare il valore di una cella in una cartella di lavoro chiusa?

Private Function GetValue(path, file, sheet, ref) 

    Dim arg As String 
    If Right(path, 1) <> "\" Then path = path & "\" 
    If Dir(path & file) = "" Then 
     GetValue = "File Not Found" 
     Exit Function 
    End If 
    arg = "'" & path & "[" & file & "]" & sheet & "'!" & _ 
     Range(ref).Range("A1").Address(, , xlR1C1) 
    GetValue = ExecuteExcel4Macro(arg) 
End Function 
+3

considerare l'utilizzo di ADO ** ** http : //support.microsoft.com/kb/278973 –

risposta

4

Sì, è possibile farlo utilizzando ADO come Gary ha commentato, ma solo se il foglio di lavoro Excel è organizzato in una struttura di tipo Database.
Significato di campi validi disposti in colonne (con o senza intestazioni).
Per esempio:

enter image description here

Ora, si vede che il numero ID hanno un nome John John e si desidera aggiornarlo a John Knight.
Utilizzo di ADO si può provare:

Edit1: si può effettivamente fare questo senza usare Recordset. Vedi sotto aggiornamento.

Sub conscious() 
    Dim con As ADODB.Connection 
    Dim sqlstr As String, datasource As String 

    Set con = New ADODB.Connection 
    datasource = "C:\Users\UserName\Desktop\TestDataBase.xlsx" 'change to suit 

    Dim sconnect As String 
    sconnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
       "Data Source=" & datasource & ";" & _ 
       "Extended Properties=""Excel 12.0;HDR=YES"";" 

    With con 
     .Open sconnect 
     sqlstr = "UPDATE [Sheet1$] SET [Name] = ""John Knight"" WHERE [ID Number] = 12345" 
     .Execute sqlstr 
     .Close 
    End With 

    Set con = Nothing 
End Sub 

Risultato:

enter image description here

Non sono del tutto sicuro se questo è ciò che si vuole, ma HTH.

Note:

  1. è necessario aggiungere riferimento a Microsoft ActiveX Data Objects x.x Biblioteca (bind precoce).
  2. Ma è possibile farlo anche utilizzando il binding ritardato (nessun riferimento).
  3. La stringa di connessione utilizzata è per Excel 2007 e versioni successive.
  4. Foglio1 è il nome del foglio di destinazione a cui si desidera aggiornare il valore.

Edit1: Questo è come farlo se il file non ha intestazione

prima cambiare la stringa di connessione HDR argomento per NO:.

sconnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
      "Data Source=" & datasource & ";" & _ 
      "Extended Properties=""Excel 12.0;HDR=NO"";" 

Poi regolare la stringa SQL per:

sqlstr = "UPDATE [Sheet1$] SET F2 = ""John Knight"" WHERE F1 = 12345" 

in modo che sia F1 per campo 1, F2 per campo 2 ecc