2010-12-16 16 views
9

उम्मीद है कि यह एक आसान है। मेरे पास एमएस एक्सेल में चार्ट की एक श्रृंखला है जो एक ही वर्कशीट पर डेटा इंगित करती है। वर्कशीट पर डेटा को वीबीए फ़ंक्शन का उपयोग करके गणना की जाती है। जब वीबीए फ़ंक्शन द्वारा डेटा अपडेट किया जाता है तो नए नंबर उन चार्टों में दिखाई नहीं देते हैं जो उन्हें इंगित कर रहे हैं। मैंने एप्लिकेशन को कॉल करने का प्रयास किया। गणना करें, लेकिन उसने चाल नहीं की। कोई विचार?चार्ट स्वचालित रूप से अपडेट नहीं होते हैं जब डेटा बदलता है


अपडेट करें:

मैं एक बहुत छोटे पैमाने पर इस मुद्दे को नकल करने में सक्षम था।

  • "सारांश"
  • का नाम बदलें शीट 2 "डेटा" के लिए
  • ओपन सारांश शीट VBA संपादक में करने के लिए एक नई कार्यपुस्तिका

  • का नाम बदलें शीट 1 बनाएँ और निम्नलिखित कोड पेस्ट यहां तरीका देखें: :

    Private Sub Worksheet_Change(ByVal Target As Range) 
        If Target.Parent.Range("worksheetDate") = Target Then 
         Application.CalculateFull 
        End If 
    End Sub 
    
  • एक नया VBA मीटर बनाएं odule

  • नया VBA मॉड्यूल में निम्न कोड पेस्ट करें (मैं माफी माँगता हूँ - मैं स्टैक ओवरफ़्लो मुझे के जीवन के लिए सही ढंग से इस फ़ॉर्मेट करने के लिए नहीं मिल सकता है - यह सबसे अच्छा मैं यह करने के मिल सकता है):

    Function getWeekValue (weekNumber As Integer, valuesRange As Range) As Integer 
    
    Dim aCell As Range 
    Dim currentDate As Date 
    Dim arrayIndex As Integer 
    Dim weekValues(1 To 6) As Integer 
    
    currentDate = ThisWorkbook.Names("worksheetDate").RefersToRange.Value 
    arrayIndex = 1 
    For Each aCell In valuesRange 
        If month(currentDate) = month(ThisWorkbook.Sheets("Data").Cells(_ 
                aCell.Row - 1, aCell.Column)) Then 
         weekValues(arrayIndex) = aCell.Value 
         arrayIndex = arrayIndex + 1 
        End If 
    Next 
    
    getWeekValue = weekValues(weekNumber) 
    End Function 
    

  • संशोधित डाटा कार्यपत्रक निम्न छवि मैच के लिए: निम्नलिखित में से 3

alt text

  • चुनें सेल B1 और सीमा "worksheetDate"
  • डुप्लिकेट पंक्तियों 1 नाम छवि:

alt text

  • पंक्ति 4 में, "सप्ताह एक्स" शीर्षकों के अंतर्गत, निम्न सूत्र

दर्ज करें।

= getWeekValue(1, Data!$A$2:$M$2) 

प्रत्येक सप्ताह के लिए एक के बाद getWeekValue कार्य करने के लिए पहला तर्क incrementing (जैसे, सप्ताह 2, 3 के लिए सप्ताह 1, 2 के लिए पारित 1, सप्ताह 3 के लिए, आदि

  • बनाएँ डेटा
  • के रूप में कक्ष A3 से E4 का उपयोग करके बार ग्राफ़ 10/1/2010 और 12/31/2010 के बीच की तारीख को सेल बी 2 में दिनांक बदलें, वर्तमान में सेल में मौजूद माह के अलावा एक महीने का चयन करें। उदाहरण, यदि तिथि 12/11/2010 है, तो इसे 11/11/2010 या 10/11/2010 जैसी किसी चीज़ में बदलें। ध्यान दें कि डेटा और चार्ट दोनों सही तरीके से अपडेट होते हैं।
  • सेल बी 2 लाभ में दिनांक संशोधित करें। ध्यान दें कि डेटा अपडेट, लेकिन चार्ट नहीं करता है।

विचित्र रूप से, कुछ समय बाद (कई मिनट) समाप्त हो गया है, चार्ट अंत में अपडेट हो जाता है। मुझे यकीन नहीं है कि ऐसा इसलिए है क्योंकि मैं अन्य गतिविधियों को निष्पादित कर रहा हूं जो अद्यतन को ट्रिगर करते हैं या क्योंकि एक्सेल कई मिनटों के बाद अद्यतन को ट्रिगर कर रहा है।

+0

आपके चार्ट सरल डेटा श्रेणियों के आधार पर हैं या वे पिवोटचर्ट्स हैं जो (ए) पिवोटटेबल (जो) आपके वीबीए गणना मूल्यों पर आधारित हो सकते हैं) पर आधारित हैं। दो चार्ट प्रकार अलग-अलग व्यवहार करते हैं - बाद में अपडेट करने के लिए आपको रीवॉल्यूलेट करने के बजाए पिवट को रीफ्रेश करना होगा - और पिवोट चार्ट स्वचालित रूप से – MikeD

+0

@MikeD का पालन करेंगे जानकारी के लिए धन्यवाद - मैं इसे भविष्य में ध्यान में रखूंगा। इस मामले में मैं एक डेटा को इंगित करने वाले एक बार ग्राफ के साथ काम कर रहा हूं जो एक साधारण डेटा रेंज है जो पिवोट टेबल से बंधी नहीं है। – Adam

+0

तो क्या आप इसे हल करने में सक्षम थे? मैंने देखा है कि वर्कशीट में पहली पंक्ति डालने से चार्ट –

उत्तर

0

उदाहरण के लिए:

Sub a() 
    Dim w As Worksheet 
    Dim a 
    Set w = Worksheets(1) 

    For Each a In w.Range("a1:a5") 
    a.Value = a.Value + 1 
    Next 

    w.ChartObjects(1).Chart.Refresh 

End Sub 

alt text

+0

आप जानते हैं, मैं काम करने की उम्मीद करता हूं, लेकिन ऐसा नहीं करता है। न तो डेटा -> सभी – Adam

+0

@Adam रीफ्रेश करें –

+0

@Adam पोस्ट करने से पहले मैंने अपनी मशीन पर इसका परीक्षण किया .. –

-2

बस एक विचार:

Application.EnableEvents = False 

क्रम में स्वयं फायरिंग की घटनाओं से बचने के लिए: अपने Worksheet_Change उप में, पहली पंक्ति के रूप डालें। ...
बेशक इसे सब के अंत में सत्य पर वापस सेट करें।

0

यह समाधान मेरे लिए काम किया। अपमानजनक वर्कशीट के लिए:

Private Sub Worksheet_Activate() 
    Dim rngSelection   As Range 
    Dim objChartObject  As ChartObject 
    Dim objChart    As Chart 
    Dim objSeriesCollection As SeriesCollection 
    Dim objSeries    As Series 
    Dim strFormula   As String 

    Set rngSelection = Selection 

    For Each objChartObject In Me.ChartObjects 
    Set objChart = objChartObject.Chart 
    Set objSeriesCollection = objChart.SeriesCollection 
    For Each objSeries In objSeriesCollection 
     strFormula = objSeries.Formula 

     objSeries.Delete 

     Set objSeries = objSeriesCollection.NewSeries 

     objSeries.Formula = strFormula 
    Next objSeries 
    Next objChartObject 

    rngSelection.Select 
End Sub 
+0

कॉपी पोस्ट करते समय सावधान रहें और बॉयलरप्लेट/वर्बैटिम कई प्रश्नों के उत्तर पेस्ट करें, इन्हें समुदाय द्वारा "स्पैमी" के रूप में फ़्लैग किया जाना चाहिए।यदि आप ऐसा कर रहे हैं तो आमतौर पर इसका मतलब है कि प्रश्न डुप्लीकेट हैं इसलिए उन्हें इस तरह ध्वजांकित करें: http://stackoverflow.com/a/12322420/419 – Kev

+0

धन्यवाद। मैं अपनी दूसरी प्रतिक्रिया हटा दूंगा। – SLeepdepD

0

मेरे परिवर्तनों के अंत में मैं कार्यपुस्तिका बंद करता हूं और इसे फिर से खोलता हूं। यह मेरे लिए सबकुछ अपडेट करने का सबसे आसान और सबसे विश्वसनीय तरीका प्रतीत होता है।

0

यह संभव है कि समस्या getWeekValue की तर्क सूची है, जिसमें केवल सप्ताह संख्या और डेटा स्ट्रीम शामिल है।

यदि आप तीसरे तर्क को जोड़ते हैं, वर्कशीटडेट, तो एक्सेल के पुनर्मूल्यांकन इंजन को सिर के किनारे मारा जाएगा तथ्य यह है कि GetWeekValue वर्कशीटडेट में रखे गए मान का उपयोग करता है। आपके वर्तमान कार्यान्वयन में, यह तथ्य केवल वीबीए कोड में आयोजित किया जाता है, जहां यह संभवतः पुनर्मूल्यांकन इंजन के लिए अदृश्य है।

मैं इसे इतनी हेजिंग से लिखता हूं क्योंकि मैं पुनर्मूल्यांकन इंजन के आंतरिक कार्यों के लिए गुप्त नहीं हूं। (शायद कोई भी जो इस बारे में जानता है उससे बेहतर है, मैं अपनी अटकलों पर टिप्पणी कर सकता हूं) लेकिन मैंने एक परीक्षण किया, जिसमें GetWeekValue का तीसरा तर्क होता है, और चार्ट ठीक से पुन: गणना करता है। इस दृष्टिकोण का अच्छा जोड़ा लाभ: आप अन्य सभी वीबीए घटना प्रबंधन को हटा सकते हैं। -एचटीएच

1

बस इस मुद्दे का समाधान पता चला क्योंकि मैं इससे पीड़ित था।

मैंने अभी प्रिंटिंग या निर्यात से पहले "DoEvents()" जोड़ा है और चार्ट को ताज़ा किया गया है।

उदाहरण

Sub a() 
    Dim w As Worksheet 
    Dim a 
    Set w = Worksheets(1) 

    For Each a In w.Range("a1:a5") 
    a.Value = a.Value + 1 
    Next 

    DoEvents 

End Sub 
0

मैं पाया है कि फोन करने के लिए इस उप काम करता है ...

Sub DoAllEvents() 
    DoEvents 
    DoEvents 
End Sub 

लेकिन माइक्रोसॉफ्ट अगले DoEvents निष्पादित करने से पहले पहले DoEvents पूरा करता है के साथ पकड़े जाने के बारे में चेतावनी देते हैं , जो कि कॉल के बीच देरी के बिना कितनी बार बुलाया जाता है इस पर निर्भर करता है। इस प्रकार DoEvents गैर मास्क करने योग्य इंटरप्ट के प्रकार के रूप में कार्यरत प्रतीत होता है, और घोंसले गैर मास्केबल इंटरप्ट्स मशीन को रिबूट के अलावा किसी अन्य पुनर्प्राप्ति के बिना कई कारणों से जमा करने का कारण बनता है।

(नोट:। एक के ऊपर नियमित बुला नहीं है, तो अक्सर और जल्दी से, घोंसले नहीं एक मुद्दा हो सकता)

नीचे निम्नलिखित उप है, जो मैं से संशोधित का प्रयोग उनके सुझाव, यह होने से रोकता है।

Sub DoAllEvents() 
    On Error GoTo ErrorCheck 
    Dim i 
    For i = 1 To 4000 ' Start loop. Can be higher, MS sample shows 150000 
     'I've found twice is enough, but only increased it to four or 4000. 
     If i Mod 1000 = 0 Then  ' If loop has repeated 1000 times. 
      DoEvents ' Yield to operating system. 
     End If 
    Next i 
    Exit Sub 
ErrorCheck: 
    Debug.Print "Error: "; Error, Err 
    Resume Next 
End Sub 

मुझे लगता है कि जरूरत DoEvents की संख्या आपकी मशीन पर चल रहा है पृष्ठभूमि कार्य की संख्या पर आधारित है, और ग्राफ को अद्यतन करने के आवेदन के लिए एक पृष्ठभूमि कार्य प्रतीत होता है प्रकट होता है। मुझे केवल दो DoEvents की आवश्यकता है क्योंकि मैं नियमित रूप से नियमित रूप से कॉल करता हूं; हालांकि, यदि आवश्यक हो तो मैं इसे बाद में उठा सकता हूं। मैं मॉड को 1000 पर भी रखता हूं ताकि प्रत्येक DoEvents के बीच अंतराल को न बदलें, क्योंकि माइक्रोसॉफ्ट सुझाव देता है, घोंसले को रोकता है। एक संभावित कारण है कि आप 2000 से उच्च संख्या तक संख्या में वृद्धि करना चाहते हैं, यदि आप ग्राफ को अद्यतन नहीं करते हैं। इस संख्या को बढ़ाने से मशीन को बड़ी संख्या में पृष्ठभूमि घटनाओं को संभालने की अनुमति मिलती है जो डूवेन्ट्स को कई कॉलों के माध्यम से सामना करना पड़ सकता है क्योंकि वे शायद ढेर पर हैं, और DoEvents ईवेंट को केवल स्टैक में अपनी जगह को चिह्नित करने से पहले विशिष्ट संख्या में चक्र चलाने की अनुमति है अनचाहे घटनाओं और लौटने की अनुमति दें, उन्हें अगली कॉल पर संभालने के लिए छोड़ दें। इस प्रकार कई कॉल की आवश्यकता है। 150000 के उनके उदाहरण में इसे बदलने से मशीन को बहुत धीमा नहीं लगता है, इसे सुरक्षित रखने के लिए आप इसे 150000 बनाना चाहते हैं।

नोट: पहला उदाहरण दो DoEvents के साथ उप संभवतः कितनी बार सुरक्षित है आप सब को कॉल करते हैं, हालांकि, अगर अक्सर कॉल किया जाता है, तो आपकी मशीन स्थिर हो सकती है। तुम्हारा कॉल। ;-)

पीएस: यदि आप बहुत से नेस्टेड लूप बनाते हैं और प्रोग्राम अपेक्षित व्यवहार नहीं करता है तो DoEvents आपकी सबसे अच्छी कॉल में से एक बन जाएगा। सौभाग्य से, यह उन सभी ऐप्स में उपलब्ध है जो वीबीए का उपयोग करते हैं!

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