Açık olan excel hariç farklı Application excellerini kapatabilirmiyiz.

ASMET67

Altın Üye
Katılım
8 Haziran 2007
Mesajlar
410
Excel Vers. ve Dili
Excel 2016
Altın Üyelik Bitiş Tarihi
30-11-2027
merhaba

Başka bir programdan Excel ile programın script komutlarını kullanarak excel dosyası olarak export ediyorum. Oluşan excel dosyası farklı bir Aplication üzerinde oluştuğu için kodun çalıştığı excelden bu exellere ulaşıp kapatabileceğim bir kod varmıdır.

Yani kodun çalıştığı exceller hariç farklı bir Application üzerinde de olsa bu excelleri kapatabilirmiyiz. Oluşan excellerin isimleri sabit be bu isimlerin olduğu bir listemde var. Liste içinde dönerek açıkmı kontrol edip kapattırabilirmiyiz.
 

muygun

Özel Üye
Katılım
6 Temmuz 2004
Mesajlar
9,104
Excel Vers. ve Dili
Excel-2003 Türkçe
Merhaba;

Arşivimden bulduğum kodlar:
Kendisi hariç tüm excelleri kapatır.
Not: 2003 versiyonunda test ettim çalışıyor. (diğer versiyonları bilemem.)

Boş bir modüle;

Sub bu_dosya_hariç_excelleri_kapat()
On Error Resume Next
Dim açık As Workbook
For Each açık In Workbooks
If açık.Name <> ThisWorkbook.Name Then
açık.Close SaveChanges:=True 'değişiklikleri kaydetmeden kapatmak için TRUE yerine FALSE yazın.
say = say + 1
End If
Next açık
If say > 0 Then MsgBox (say & " adet Açık dosya Kapatıldı.")
If say = 0 Then MsgBox (" Kapatılacak dosya YOK.")
End Sub

Ekleyerek deneyin.
İyi çalışmalar.
 

ASMET67

Altın Üye
Katılım
8 Haziran 2007
Mesajlar
410
Excel Vers. ve Dili
Excel 2016
Altın Üyelik Bitiş Tarihi
30-11-2027
Öncelikle cevabının için teşekkür ederim.
Bu kod excel Application içinde acık olan dosyaları kapatıyor. Export edilen excel kendini açarken farklı bir Application oluşturarak açabiliyor. ozaman maalesef kapatamıyor. Bunu yapmanın başka bir yolu varmıdır.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,291
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Özel kişi
Bahsettiğiniz diğer dosya eğer farklı bir Excel uygulamasında (oturumunda) açılıyorsa, bu iş için mevcut Excel'in "ProcessID" değerini bulduktan sonra diğer Excel uygulamalarının "ProcessID" değerleriyle karşılaştırıp, eğer farklı bir tane bulursa o değere ait Process'i (uygulamayı) sonlandırmak gerekir.

Aşağıdaki kod API ile bu işi yapar;

C#:
Declare PtrSafe Function GetCurrentProcessId Lib "kernel32" () As Long
'
Sub Test()
   Dim objWMIService As Object, objProcess As Object, colProcess As Variant
   Dim strComputer As String
   
   strComputer = "."
   
   Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
   Set colProcess = objWMIService.ExecQuery("Select * from Win32_Process Where Name = 'excel.exe' And ProcessID <> " & GetCurrentProcessId)
   
   If colProcess.Count > 0 Then
      For Each objProcess In colProcess
         objProcess.Terminate
      Next
   End If
End Sub


.
 
Son düzenleme:

veyselemre

Özel Üye
Katılım
9 Mart 2005
Mesajlar
3,582
Excel Vers. ve Dili
Pro Plus 2021
Haluk bey cevaplamış ama, 32 bit excel için aşağıdaki gibi de kullanabilirsiniz.
64 bit için ptrSafe eklenmesi gerekir.

Kod:
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Sub Test()
    For Each process In GetObject("winmgmts:\\.\root\CIMV2").ExecQuery _
        ("SELECT * FROM Win32_Process where name='excel.exe' and processID<>" & GetCurrentProcessId, , 48)
        'Debug.Print process.processid, process.Name
        process.Terminate
    Next
End Sub
 

ASMET67

Altın Üye
Katılım
8 Haziran 2007
Mesajlar
410
Excel Vers. ve Dili
Excel 2016
Altın Üyelik Bitiş Tarihi
30-11-2027
Bahsettiğiniz diğer dosya eğer farklı bir Excel uygulamasında (oturumunda) açılıyorsa, bu iş için mevcut Excel'in "ProcessID" değerini bulduktan sonra diğer Excel uygulamalarının "ProcessID" değerleriyle karşılaştırıp, eğer farklı bir tane bulursa o değere ait Process'i (uygulamayı) sonlandırmak gerekir.

Aşağıdaki kod API ile bu işi yapar;

C#:
Declare PtrSafe Function GetCurrentProcessId Lib "kernel32" () As Long
'
Sub Test()
   Dim objWMIService As Object, objProcess As Object, colProcess As Variant
   Dim strComputer As String
  
   strComputer = "."
  
   Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
   Set colProcess = objWMIService.ExecQuery("Select * from Win32_Process Where Name = 'excel.exe' And ProcessID <> " & GetCurrentProcessId)
  
   If colProcess.Count > 0 Then
      For Each objProcess In colProcess
         objProcess.Terminate
      Next
   End If
End Sub


.
Kod işime yaradı Çok Teşekkürler
 
Üst