2013-03-21 5 views
7

का उपयोग करके इसे खोल दिया है, मैं कैसे बता सकता हूं कि एक्सेल 2007 स्प्रेडशीट खुली है और डब्ल्यूएचओ ने वीबीस्क्रिप्ट का उपयोग करके इसे खोल दिया है या नहीं?यह बताएं कि एक्सेल 2007 स्प्रेडशीट कब खुला है और डब्ल्यूएचओ ने वीबीस्क्रिप्ट

मैं यह पता लगाने की कोशिश कर रहा हूं कि एक्सेल कार्यपुस्तिका वर्तमान में किसी अन्य उपयोगकर्ता द्वारा खुली है या नहीं और यह जांच कर रहा है कि वह उपयोगकर्ता मेरी स्क्रिप्ट में कौन है।

मुझे पहले ही पता चला है कि यह निर्धारित करने के लिए कि कार्यपुस्तिका वर्तमान में खुली है या नहीं। यह एक कामकाज है, लेकिन मैं मूल रूप से कार्यपुस्तिका खोलता हूं और जांचता हूं कि यह केवल पढ़ने के लिए है या नहीं। यह पूरी तरह से काम करता है; मैंने इसका परीक्षण किया है।

मुझे पता है कि यह संभव है क्योंकि एक्सेल आपको उस उपयोगकर्ता को देता है जिसकी फ़ाइल आपको ब्राउज़र के माध्यम से खोलती है।

Set objExcelTestWorkbook = CreateObject("Excel.Application") 
objExcelTestWorkbook.DisplayAlerts = False 'doesn't display overwrite alert 
testWorkbookFile = "I:\test_workbook.xlsx" 
Set objBook = objExcelTestWorkbook.Workbooks.open(testWorkbookFile) 

If objBook.ReadOnly Then 
    Wscript.echo "The file is read only" 
    Call EndScript 
Else 
    Wscript.echo "The file is available" 
    Call EndScript 
End If 

Function EndScript 
    objExcelTestWorkbook.Workbooks.close 
    objExcelTestWorkbook.Quit 
    WScript.Echo "Closed " & testWorkbookFile 
    WScript.Quit 
End Function 

इसके अलावा, मैं कमांड लाइन से इस चलाएँ::

cscript isWorkbookOpen.vbs 
+1

@AnsgarWiechers यह एक डुप्लिकेट नहीं है। वह पोस्ट यह पूछने के लिए कह रही है कि एक्सेल स्प्रैडशीट पहले से ही खुली है या नहीं, जो मेरे कोड के साथ मैंने पहले से ही प्रदर्शित किया है। मैं डब्ल्यूएचओ को खोलने के लिए देख रहा हूं। मुझे पहले से ही पता है कि अगर यह खुला है तो कैसे प्राप्त करें। मैं जो भी खोज रहा हूं उसके लिए मैं गलत कर रहा हूं। – Steven

उत्तर

11

मेरे जिनियस सह कार्यकर्ता मुझे Excel के "ताला" फाइल के बारे में याद दिलाया। एक्सेल खोलते समय, आप एक छिपी हुई सिस्टम फ़ाइल बनाते हैं जिसमें व्यक्तियों का नाम होता है जिनके पास फ़ाइल खुलती है। एक लॉक फ़ाइल स्प्रेडशीट नाम से पहले "~ $" से शुरू होती है। उदाहरण:

यदि आपके पास testWorkbook.xlsx नामक स्प्रेडशीट है तो यह लॉक फ़ाइल ~$testWorkbook.xlsx उसी निर्देशिका में स्थित होगी।

यह फ़ाइल को खोलने की जांच करने के लिए यह एक तेज़ और आसान तरीका भी है क्योंकि आप वास्तव में फ़ाइल को खोल नहीं रहे जैसे कि मैं पहले कर रहा था। अब मैं सिर्फ यह जांच रहा हूं कि लॉक फ़ाइल मौजूद है और यदि ऐसा होता है, तो मैं जांचता हूं कि लॉक फ़ाइल का "मालिक" कौन है और वह वह व्यक्ति होगा जिसकी वर्तमान में स्प्रेडशीट खुली है। उम्मीद है कि इससे भविष्य में किसी की मदद मिलेगी!

testWorkbookLockFile = "I:\~$test_workbook.xlsx" 
Set objFSO = CreateObject("Scripting.FileSystemObject") 

If objFSO.FileExists(testWorkbookLockFile) Then 
    WScript.Echo "The file is locked by " & GetFileOwner(testWorkbookLockFile) 
Else 
    WScript.Echo "The file is available" 
End If 

Function GetFileOwner(strFileName) 
    'http://www.vbsedit.com/scripts/security/ownership/scr_1386.asp 
    Set objWMIService = GetObject("winmgmts:") 
    Set objFileSecuritySettings = _ 
    objWMIService.Get("Win32_LogicalFileSecuritySetting='" & strFileName & "'") 
    intRetVal = objFileSecuritySettings.GetSecurityDescriptor(objSD) 

    If intRetVal = 0 Then 
     GetFileOwner = objSD.Owner.Name 
    Else 
     GetFileOwner = "Unknown" 
    End If 
End Function 

मैं कहना है कि मैं GetFileOwner समारोह हिम्मत नहीं लिखा था चाहते हैं:

यह मेरा कोड है कि दोषरहित काम करता है। मैंने वेबसाइट से लिंक किया जहां मुझे फ़ंक्शन में वह कोड मिला।

इसके अलावा, यदि आपके पास स्प्रेडशीट में मैप किए गए स्थान नहीं हैं और यह नेटवर्क पर है, तो यूएनसी पथ काम नहीं करेगा, आपको ड्राइव को मैप करना होगा। यह कोड की निम्नलिखित 2 पंक्तियों का उपयोग करके किया जा सकता है:

Set objNetwork = WScript.CreateObject("WScript.Network") 
objNetwork.MapNetworkDrive "Z:", "\\Server1\Share1" 

उम्मीद है कि किसी से इसका लाभ होगा। मुझे पता है कि वेब पर ऐसा करने के बारे में ज्यादा जानकारी नहीं है क्योंकि मैं इसके लिए हमेशा के लिए खोज कर रहा हूं!

+0

यह विधि इतनी प्रतिभाशाली है! इससे मुझे बड़ी समस्या हल हुई। इसे साझा करने के लिए धन्यवाद! – lovechillcool

+0

बीटीडब्ल्यू, यह विधि केवल एक्सेल 2007 और संस्करण संस्करणों के लिए काम करती है; यह .xls – lovechillcool

+0

@Steven के लिए काम नहीं करता है मैंने इसे VBA में उपयोग करने का प्रयास किया है और यह मेरे स्थानीय सी: \ ड्राइव पर ठीक काम करता है लेकिन हमारे सर्वर पर यह कोड चलाते समय आपके फ़ंक्शन से वापस लौटाया जाता है। और हाँ, मैंने उस फ़ाइल पर एक ड्राइव मैप किया था जिसे मैं सर्वर पर पूछताछ कर रहा हूं। कोई विचार? – Josh

1

आप Workbook.UserStatus संपत्ति की कोशिश की है

यहाँ मेरी कोड (isWorkbookOpen.vbs) क्या है? यहाँ एक्सेल VBA मदद से एक कोड स्निपेट उद्धरण है:

users = ActiveWorkbook.UserStatus 
With Workbooks.Add.Sheets(1) 
    For row = 1 To UBound(users, 1) 
    .users = ActiveWorkbook.UserStatus 
With Workbooks.Add.Sheets(1) 
    For row = 1 To UBound(users, 1) 
    .Cells(row, 1) = users(row, 1) 
    .Cells(row, 2) = users(row, 2) 
    Select Case users(row, 3) 
     Case 1 
      .Cells(row, 3).Value = "Exclusive" 
     Case 2 
      .Cells(row, 3).Value = "Shared" 
    End Select 
Next 
End With 
+0

यह मुझे वह देता है जो मैं देख रहा हूं अगर स्प्रेडशीट वर्तमान में खुला नहीं है। मेरी वर्तमान स्क्रिप्ट फ़ाइल को केवल-पढ़ने में खोलती है और आप वर्कबुक से कुछ भी पुनर्प्राप्त नहीं कर सकते हैं। यूज़रस्टैटस प्रॉपर्टी बिना किसी त्रुटि के प्राप्त कर रही है कि आप केवल पढ़ने-योग्य फ़ाइल तक नहीं पहुंच सकते ... सुनिश्चित नहीं है कि यहां से कहां जाना है। – Steven

+0

कोई बात नहीं कि मुझे सहकर्मियों से मदद मिली और इसे समझ लिया। – Steven

संबंधित मुद्दे