2017-08-16 1 views
0

Ich habe eine Access-DB, bearbeiten zu öffnen und ein Excel-Dokument speichern, die fein das erste Mal laufen funktioniert, aber wenn ich versuche, mehr als eine Datei (oder die gleiche Datei zweimal zu ändern) Es scheitert mit "Laufzeitfehler '1004': Methode 'Zellen' des Objekts '_Global' fehlgeschlagen"Access VBA zu öffnen, bearbeiten und speichert Excel doc

Wenn ich die DB schließe, dann öffne sie wieder, es funktioniert wieder für die erste geänderte Datei.

Obwohl ich nicht bin neu in VBA würde ich sagen, dass ich ein Neuling bin. Hier ist ein Snippit des Codes, den ich verwende:

Code: 
     'Open spreadsheet and make it visible 
     Set xl = CreateObject("Excel.Application") 
     strInputFile = varItem 
     xl.Workbooks.Open strInputFile 
     xl.Visible = True 

     'Trying to get row count here but not working yet 
     'Set myRange = xl.Sheets("Sheet1").Range("C:C") 
     'lRowCount = Excel.Application.WorksheetFunction.CountA("Sheet1").Range("C:C") 
     'lRowCount = xl.WorksheetFunction.CountA(Worksheets("Sheet1").Cells(C, C)) 
     'Debug.Print lRowCount 
     'strMyRange = "C:C" 
     'lRowCount = xl.WorksheetFunction.CountA(strMyRange) 
     'Debug.Print lRowCount 
     'lRowCount = Excel.Application.WorksheetFunction.CountA(Workbooks(strInputFile).Sheets("Sheet1").Range("C:C")) 
     'Debug.Print lRowCount 

     'Make the changes 
     j = 0 
     If Left(strFile, 4) = "xxxx" Then 
      myPath = "\\a\path\for\xxxx" 
      If InStr(1, strFile, "IQ") Then 
       For i = 1 To 500 'Row count not working yet 
        If InStr(1, Cells(i, "C").Value, myVariable) > 0 Then 
         Cells(i, "B") = "New Value" 
         j = j + 1 
        End If 
       Next 
      End If 
     End If 

'Clean up 
xl.Quit 
Set xl = Nothing 
Set objInputFile = Nothing 
+0

In dem hinzuzufügen Linie die Ausführung fehlschlägt? –

+0

Wenn InStr (1, Zellen (i, "C"). Value, myVariable)> 0 Then – JDH

+1

Ehrlich gesagt weiß ich nicht, warum es überhaupt funktioniert. Sieht so aus, als wäre dieser Code aus Excel kopiert worden. In Access sollten direkte Anrufe wie Cell nicht funktionieren. Verwenden Sie Variablen wie 'xl.Sheets (" Sheet1 "). Zellen (i," C ")' –

Antwort

1

Der Excel-VBA-Code für die Verwendung in Access sollte geändert werden. Sie können direkte Aufrufe von Excel-Bibliotheksmethoden wie Cell nicht verwenden. Deklarieren Sie Variablen für Excel.Application, Arbeitsmappe und Arbeitsblatt, und verwenden Sie sie zum Verweisen auf Arbeitsblattzellen. Vermeiden Sie Activate-Methoden. Also, in Ihrem Fall wird der Code wie folgt sein:

Dim xl As Excel.Application 
Dim wb As Excel.Workbook 
Dim ws As Excel.Worksheet 
Dim lRowCount As Long 

Dim myRange As Excel.Range 

Set xl = CreateObject("Excel.Application") 
strInputFile = varItem 
Set wb = xl.Workbooks.Open(strInputFile) 
Set ws = wb.Sheets("Sheet1") 

lRowCount = ws.UsedRange.Rows.Count 
'Make the changes 
j = 0 
If Left(strFile, 4) = "xxxx" Then 
    myPath = "\\a\path\for\xxxx" 
    If InStr(1, strFile, "IQ") Then 
     For i = 1 To lRowCount 
      If InStr(1, ws.Cells(i, "C").Value, myVariable) > 0 Then 
       ws.Cells(i, "B") = "New Value" 
       j = j + 1 
      End If 
     Next 
    End If 
End If 

wb.Save 
'Clean up 
xl.Quit 
Set xl = Nothing 

Vergessen Sie nicht, einen Verweis auf Microsoft Excel-Bibliothek

+0

Danke nochmal Sergey !! Dies funktioniert perfekt mit nur einer kleinen Änderung. Ich musste die Variable in Set wb = xl.Workbooks.Open (strInputFile) um die Variable setzen. Keine große Sache, aber wollte es für mögliche zukünftige Zuschauer dieses Beitrags erwähnen. Ich klickte auch auf den Pfeil nach oben dieser Antwort, aber da ich auf dieser Seite brandneu bin, zählen meine Stimmen anscheinend noch nicht. :-) – JDH

+0

Ja, natürlich() benötigt hier, habe ich die Antwort bearbeitet. Wenn die Antwort für Sie funktioniert, akzeptieren Sie sie, ein grünes Häkchen erscheint unter dem Abstimmungszähler –