Kapanmayan Excel

Katılım
6 Eylül 2018
Mesajlar
11
Excel Vers. ve Dili
2013 turkce
Merhaba

SAP'den Excel raporu indiren bir makro çalışmam var. Sorun şu ki, Makro bittiğinde, SAP'den indirilen excel otomatik olarak açılıyor. Excel arka planda çalışıyor gibi. Görev yöneticinde de export sonrasında görüntüledim 2 tane alt alta excel uygulaması var. Makro bittiğinde excel görünüyor (SAP yapılandırması nedeniyle) , bir Elektronik Tablo indirdiğinizde excel otomatik olarak açılır.( SAP yapılandırmasını değiştirmeyi denedim ama olmadı) Application.Wait, Workbook.Close koymayı denedim, çalışma kitabını sonlandırdım (bu bir sorun veriyor çünkü wb'nin var olmadığını söyleyen bir açılır pencere gösteriyor). Özellikle sap den export ettiğim excel dosyalarını workbook .close gibi vba kodları ile kapatamıyorum ve dosya üzerinde hiçbir kodlama yapılamıyor. Dosyayı manuel olarak birkez kapatıp tekrar açınca istediğim kodlama ile özet bir raporlama oluşturabiliyorum. başlattan veya dizinden açtığım excel dosyalarını close kodu ile kapatabiliyorum veya vba ile veri girişi sağlayabiliyorum.

Kısacası asıl amacım sap den export edilen dosyanın manuel yöntemler uygulanmadan makro sonunda export edilecek dosyaları kapatan bir prosedür uygulamak istiyorum.
 

uzmanamele

Uzman
Uzman
Katılım
26 Eylül 2007
Mesajlar
9,421
Excel Vers. ve Dili
excel 2010
Merhaba
SAP'dan export ettiğiniz verileri yeni bir Application ile dosyaya alıp işlem bittiğinde Application.Quit ile sonlandırmayı deneyin.
 
Katılım
20 Şubat 2012
Mesajlar
242
Excel Vers. ve Dili
office2007 Türkçe
Kod:
'https://stackoverflow.com/questions/70458926/vba-is-sometimes-not-recognizing-excel-file-that-has-been-opened-through-sap-gui'

#If VBA7 Then
  Private Declare PtrSafe Function AccessibleObjectFromWindow Lib "oleacc" ( _
    ByVal hwnd As LongPtr, ByVal dwId As Long, riid As Any, ppvObject As Object) As Long

  Private Declare PtrSafe Function FindWindowExA Lib "user32" ( _
    ByVal hwndParent As LongPtr, ByVal hwndChildAfter As LongPtr, _
    ByVal lpszClass As String, ByVal lpszWindow As String) As LongPtr
#Else
  Private Declare Function AccessibleObjectFromWindow Lib "oleacc" ( _
    ByVal hwnd As Long, ByVal dwId As Long, riid As Any, ppvObject As Object) As Long

  Private Declare Function FindWindowExA Lib "user32" ( _
    ByVal hwndParent As Long, ByVal hwndChildAfter As Long, _
    ByVal lpszClass As String, ByVal lpszWindow As String) As Long
#End If

Sub Close_SAP_Excel(ParamArray FileNames())
    'Procedure to close files downloaded from SAP and at the same time close the Excel application instance that will be open with them.

    Dim ExcelAppSAP As Variant
    Dim ExcelFile As Variant
    Dim FinishedLoop As Boolean, TimeoutReached As Boolean, FileClosed As Boolean
    Dim ReTry As Long
    Dim i As Long, x As Long
   
    Set ExcelAppSAP = Nothing
    ReTry = 100000 'Used as Timeout 100000 = ~10 seconds
    i = 1
   
    'The following loop is executed until excel file is closed.
    'Inside of this, there is a For Loop for each Excel Instance and inside of that is another loop
    'for each excel inside the instance. If name matches, it is closed.
    Do While Not FinishedLoop
        If i > ReTry Then
            TimeoutReached = True
            Exit Do
        End If
       
        For Each ExcelFile In GetExcelInstances() 'Function to Get Excel Open Instances
            For Each xls In ExcelFile.Workbooks
                For x = LBound(FileNames()) To UBound(FileNames())
                    If xls.Name = FileNames(x) Then
                   
                        Set ExcelAppSAP = ExcelFile 'Set Instance opened by SAP to variable
                        'Here add actions if needed. Reference to workbook as xls e.g.: xls.Sheets(1).Range("A1").Copy
                        xls.Close SaveChanges:=False
                        FileClosed = True
                   
                    End If
                Next x
            Next
        Next
       
        If FileClosed Then
            FinishedLoop = True
        End If
        i = i + 1
    Loop
   
    ThisWorkbook.Activate

    If Not TimeoutReached Then
        If FileClosed Then
            On Error Resume Next
            If ExcelAppSAP.Workbooks.Count = 0 Then
                ExcelAppSAP.Quit
            End If
        Else
            MsgBox "Excel application instance from SAP was not closed correctly. Please close it manually or try again.", , "Error"
        End If
    Else
        MsgBox "Max timeout reached", , "Error"
    End If

End Sub
   
Public Function GetExcelInstances() As Collection
  Dim guid&(0 To 3), acc As Object, hwnd, hwnd2, hwnd3
  guid(0) = &H20400
  guid(1) = &H0
  guid(2) = &HC0
  guid(3) = &H46000000

  Set GetExcelInstances = New Collection
  Do
    hwnd = FindWindowExA(0, hwnd, "XLMAIN", vbNullString)
    If hwnd = 0 Then Exit Do
    hwnd2 = FindWindowExA(hwnd, 0, "XLDESK", vbNullString)
    hwnd3 = FindWindowExA(hwnd2, 0, "EXCEL7", vbNullString)
    If AccessibleObjectFromWindow(hwnd3, &HFFFFFFF0, guid(0), acc) = 0 Then
      GetExcelInstances.Add acc.Application
    End If
  Loop
End Function

Sub Test()

    Call Close_SAP_Excel("export.xlsx")

End Sub
 

uzmanamele

Uzman
Uzman
Katılım
26 Eylül 2007
Mesajlar
9,421
Excel Vers. ve Dili
excel 2010
Application ile tüm excel dosyası kapanır. Benim kapatacagim excel export.xlsx
Benim önerim, yeni bir Application açıp işiniz bittiğinde bu Applicationdan çıkmak.
Sizin açık olan başka excel dosyalarınız bundan etkilenmez.
 
Üst