2015-06-08 7 views
8

मुझे अब इस समस्या को लंबे समय से मिला है और मैंने आलस्य से इसे अनदेखा कर दिया है, हालांकि मुझे अब समाधान ढूंढना होगा। मेरे पास एक स्क्रिप्ट है जो बड़ी संख्या में एक्सेल दस्तावेज़ों को रीफ्रेश करने में स्वचालित होती है। यह अच्छी तरह से और बेवकूफ काम करता है, हालांकि, यह विफल रहता है अगर मेरे पास नेटवर्क शेयर पर संग्रहीत कार्यपुस्तिकाओं पर झूठी दृश्यमान संपत्ति सेट है।

दोहराने के लिए, स्थानीय फाइलों पर झूठी कामों के लिए दृश्यमान संपत्ति सेट के साथ रीफ्रेश करना, लेकिन किसी स्थान पर सहेजी गई कोई भी कार्यपुस्तिका त्रुटि के साथ विफल हो जाती है "कॉल कैली द्वारा अस्वीकार कर दिया गया था"। सभी रीफ्रेश दृश्यमान संपत्ति सेट के साथ ठीक काम करते हैं।

  1. एक्सेल वस्तु बनाने और दृश्य संपत्ति
  2. की स्थापना DisplayAlerts से पहले दिखाई स्थापना के बीच प्रारंभ-स्लीप 30 जोड़ना:

    #Create Excel COM object and set it up for use. 
    $excel = new-object -comobject Excel.Application; 
    $excel.DisplayAlerts = $false; 
    #If this is set to false, saving the file on a network share will fail. Reason : Unknown. 
    $excel.Visible = $true; 
    #Open workbook which should be refreshed. 
    $excelworkbook = $excel.workbooks.Open($workbook); 
    #Refresh WB 
    $excelworkbook.RefreshAll(); 
    #Save 
    $excelworkbook.Save(); 
    #Quit Excel 
    $excel.Quit(); 
    #Destroy COM object. (VERY IMPORTANT!!!!!) 
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel); 
    

    मैं निम्नलिखित की कोशिश की है:

    यहाँ मेरी कोड है

  3. काम करने के लिए वास्तव में कड़ी मेहनत करना

कोई विचार?

+0

आप कहते हैं कि यह बड़ी संख्या में फाइलों के लिए करता है, क्या आप प्रत्येक फ़ाइल के लिए एक नया एक्सेल कॉम ऑब्जेक्ट बनाते हैं? या क्या आप एक्सेल को खोलने और कॉम ऑब्जेक्ट को रिलीज़ करने से पहले एक्सेल/रीफ्रेश/बंद फ़ाइल चक्र वाली फाइलों के माध्यम से एक्सेल खोलते हैं? – TheMadTechnician

+0

मैं इसे बनाता हूं, अपना लूप करता हूं, फिर इसे बंद करता हूं। मैंने जो उदाहरण दिया वह लूप के बिना संघनित है। पूरी लिपि बहुत लंबी है। – Ethan

+0

क्या एक्सेल को नेटवर्क स्थान तक पहुंचने के लिए प्रमाण-पत्र की आवश्यकता है? क्या कोई दृश्यमान प्रॉम्प्ट दिखाई देता है जब 'दृश्यमान' सत्य होता है? – acelent

उत्तर

2

ऐसा लगता है कि RefreshAll()Visible = $False सेट के साथ पृष्ठभूमि में वास्तव में सफल होने के लिए ताज़ा करने की प्रतीक्षा नहीं करता है।

$excelworkbook.RefreshAll(); 
Start-Sleep -Seconds 30 
$excelworkbook.Save(); 

वैकल्पिक रूप से, आप अपनी कार्यपुस्तिका में सभी क्वेरी टेबल पर BackgroundQuery = $False की स्थापना करके तुल्यकालिक निष्पादित करने के लिए RefreshAll() मजबूर करने के लिए सक्षम हो सकता है:

, इसलिए जैसे RefreshAll() और Save() के बीच एक कृत्रिम देरी का परिचय as suggested in this answer एक ऐसी ही सवाल का:

foreach ($Sheet in $excelworkbook.Worksheets) { 
    foreach ($QTable in $Sheet.QueryTables) { 
     $QTable.BackgroundQuery = $false 
    } 
} 
1

मैं एकजोड़ना होगाब्लॉक:

[System.Windows.Forms.Application]::DoEvents() 

यह कुछ भी पर जाने के लिए कतार की अनुमति देगा आप Excel बता दिया है & फिर वापस स्क्रिप्ट निष्पादन करने के लिए क्या करना है। एक और बात UserControl = false सेट करना होगा ताकि एक्सेल छुपा न हो, लेकिन घटनाओं का जवाब देने के लिए उपयोगकर्ता की क्षमता से स्पष्ट रूप से बाहर है।

आखिरकार, अन्य गुणों को सेट करने के बाद Visible सेट करने के बारे में कुछ हो सकता है - ऐसा हो सकता है कि एक्सेल कुछ अन्य चीजों को टॉगल करके दृश्यमान घटना का जवाब दे (ऐसा न हो, लेकिन कुछ याद रखें मेरे दिमाग के पीछे यह कहता है कि यह मामला है, या इस्तेमाल किया जाता है)।

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

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