2015-01-12 17 views
6

Obecnie używam tej funkcji w VBA, aby uzyskać wartość komórki w zamkniętym skoroszycie. Chcę użyć podobnego procesu, aby ustawić wartość komórki na dowolny, bez otwierania pliku. Czy to jest możliwe?Użyj programu Excel VBA, aby zmienić wartość komórki w zamkniętym skoroszycie?

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

Rozważ użycie ** ** http ADO : //support.microsoft.com/kb/278973 –

Odpowiedz

4

Tak można to zrobić przy użyciu ADO jako Gary skomentował ale tylko wtedy, gdy Excel Arkusz jest umieszczony w bazie danych, takich jak struktury.
To znaczy, że masz prawidłowe pola ułożone w kolumnach (z lub bez nagłówków).
Na przykład:

enter image description here

Teraz widać, że numer identyfikacyjny mieć nazwę John John i chcesz zaktualizować go do Jana Rycerz.
Korzystanie z ADO można spróbować:

Edit1: Rzeczywiście można to zrobić bez użycia Recordset. Zobacz poniżej aktualizację.

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 

Wynik:

enter image description here

Nie jestem do końca pewien, czy to jest to, co chcesz, ale HTH.

Uwagi:

  1. Trzeba dodać odniesienie do Microsoft ActiveX Data Objects x.x Biblioteka (początek wiązania).
  2. Ale można to również zrobić za pomocą późnego wiązania (bez odniesienia).
  3. Ciąg połączenia używany jest dla programu Excel 2007 i nowszych.
  4. Arkusz1 to nazwa docelowego arkusza, do którego chcesz zaktualizować wartość.

Edit1: To jak to zrobić, jeśli plik nie ma nagłówka

najpierw zmienić ciąg połączenia HDR argument NO.

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

Następnie dostosuj swój ciąg SQL:

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

więc jest F1 dla pole 1, F2 dla pole 2 itp