2016-09-28 3 views
0

Ich habe ein VBS-Skript, das ein VBA-Makro in Excel ausführt. Das Makro funktioniert, wenn ich es manuell in der Excel-Datei ausführe, aber wenn es vom VBS aufgerufen wird, löscht es die vorhandenen Daten nicht, bevor die Abfragen ausgeführt werden.So löschen Sie Excel-Zellen beim Ausführen eines Makros aus VBs Skript

Hier mein VBS-Skript mit Excel zu tun:

Dim xlApp, xlBook 
Set xlApp = CreateObject("Excel.Application") 
xlApp.DisplayAlerts = False 
Set xlBook = xlApp.Workbooks.Open("Y:\Public\Eoin\Complaints Report\Complaints Report.xlsm", False) 

msgbox("3") 

xlApp.Run "Complaints_Report.Complaints_Report()" 

WScript.Sleep 100000 
xlbook.Save 
xlBook.Close False 
set xlBook = Nothing 

xlApp.Quit 
Set xlApp = Nothing 

Hier mein Excel VBA-Makro in einem Modul gespeichert ist:

Sub Complaints_Report() 
    Sheets("Complaints Report").Activate 
    'Clear out old detail 
    Range("A2:Z10000").Clear 

    'Declare variables' 
    Set objMyConn = New ADODB.Connection 
    Set objMyRecordset = New ADODB.Recordset 
    Dim strSQL As String 

    'Open Connection' 
    objMyConn.ConnectionString = "Driver={Microsoft ODBC for Oracle}; " & _ 
      "CONNECTSTRING=(DESCRIPTION=" & _ 
      "(ADDRESS=(PROTOCOL=***)" & _ 
      "(HOST=*****)(PORT=****))" & _ 
      "(CONNECT_DATA=(SERVICE_NAME =*****))); uid=******; pwd=*****;" 
    objMyConn.Open 

    'Set and Excecute SQL Command' 
    strSQL = "Select distinct * From Temp_Final_Complaints_Report" 

    'Open Recordset' 
    Set objMyRecordset.ActiveConnection = objMyConn 
    objMyRecordset.Open strSQL 

    'Copy Data to Excel' 
    Sheets("Complaints Report").Range("A2").CopyFromRecordset (objMyRecordset) 
End Sub 

Das Makro gibt die Ergebnisse zurück, aber löscht nicht aus alles in das Blatt vorher.

Antwort

1

Zwei Dinge:

  1. Die Run Methode den Namen des Sub muss laufen, so sollte es nicht sein Klammern:

    Wechsel:

    xlApp.Run "Complaints_Report.Complaints_Report()" 
    

    An:

    xlApp.Run "Complaints_Report.Complaints_Report" 
    
  2. Stellen Sie sicher, das Blatt explizit angeben, wenn Range verwenden, da die Aktivierung des Blattes nicht

    ändern zuverlässig sein kann:

    Range("A2:Z10000").Clear 
    

    An:

    Sheets("Complaints Report").Range("A2:Z10000").Clear 
    

Sie kann dann sogar die Anweisung entfernen, um das Blatt zu aktivieren, da der Code seine Arbeit ohne diese erledigt.

+0

Das geht immer noch nicht. Derzeit habe ich in meiner Excel-Datei Daten in Zeilen 2:13 und ich habe einige Dummy-Daten in Zellen in A21 und A33 eingegeben, um sicherzustellen, dass das Makro jedes Mal fängt, wenn eine leere Zeile vorhanden ist. Momentan führt das Makro die SQL-Abfragen aus und gibt sie aus, während die Dummy-Daten erhalten bleiben. –

+0

Sogar auskommentieren alles bar Sheets ("Beschwerden Bericht") Aktivieren 'löschen alte Detail Sheets ("Beschwerden Bericht". Bereich ("A2: Z10000"). Klare tut nichts –

+1

Nur ein anderes Problem beim Versuch zu erkennen Imitieren Sie Ihr Setup: Die Klammern im VBScript sollten weggelassen werden. Siehe meine aktualisierte Antwort. – trincot

Verwandte Themen