2014-07-14 7 views
8

मेरे पास एक वीबीए कोड है जिसका उपयोग मैं चित्रों की प्रतिलिपि बनाने के लिए कर रहा हूं और उन्हें चार्ट में पेस्ट कर रहा हूं। ऐसा करता है इसलिए मैं इसे एक तस्वीर में सहेज सकता हूं। इस कोड को 70% सफलता दर पसंद है, और जब यह काम नहीं करता है, तो यह त्रुटि देता है "श्रेणी श्रेणी की प्रतिलिपि विधि विफल"। मुझे समझ में नहीं आता कि यह कभी-कभी क्यों काम कर सकता है और कभी-कभी यह नहीं दिया जाता है कि यह वही इनपुट ले रहा है।कॉपी श्रेणी की प्रतिलिपि विधि विफल - कभी-कभी

क्या कोई मदद कर सकता है?

Public Sub ExportRange(workbookPath As String, sheetName As String, rangeString As String, savepath As String) 

    Set tempWorkBook = Workbooks.Open(workbookPath) 

    Dim selectRange As range 
    Set selectRange = Worksheets(sheetName).range(rangeString) 
    Dim numRows As Long 
    numRows = selectRange.Rows.Count 
    Dim numCols As Long 
    numCols = selectRange.Columns.Count 

    ' Transfer selection to a new sheet and autofit the columns 
    selectRange.Copy 
    Dim tempSheet As Worksheet 
    Set tempSheet = Sheets.Add 
    tempSheet.range("A1").PasteSpecial xlPasteAll 

    ActiveSheet.UsedRange.Columns.AutoFit 
    Set selectRange = ActiveSheet.UsedRange 
    selectRange.Select 
    selectRange.CopyPicture xlScreen, xlPicture 

    Dim tempSheet2 As Worksheet 
    Set tempSheet2 = Sheets.Add 
    Dim oChtobj As Excel.ChartObject 
    Set oChtobj = tempSheet2.ChartObjects.Add(_ 
     selectRange.Left, selectRange.Top, selectRange.Width, selectRange.Height) 

    Dim oCht As Excel.Chart 
    Set oCht = oChtobj.Chart 
    oCht.Paste 
    oCht.Export filename:=savepath 
    oChtobj.Delete 

    Application.DisplayAlerts = False 
    tempSheet.Delete 
    tempSheet2.Delete 
    tempWorkBook.Close 
    Application.DisplayAlerts = True 

End Sub 
+0

क्या यह एक ही छवि/वर्कशीट, आदि के लिए असफल हो जाता है? या विभिन्न मामलों में? यदि आप इस 100 बार निष्पादित लूप चलाते हैं, तो क्या यह कुछ मामलों के लिए 0 बार चलाता है और दूसरों के लिए 100 गुणा या क्या यह कुछ संख्याओं को बीच में चलाता है और फिर त्रुटि के साथ रोकता है? – hnk

+0

यह एक ही छवि और वर्कशीट के लिए विफल रहता है। मैं इस सब को 6 छवियों के साथ एक लूप में चलाता हूं, और जब यह विफल हो जाता है, तो यह किसी भी छवि पर असफल हो सकता है, जरूरी नहीं कि हमेशा एक ही हो। – user3759627

+0

अपने मुख्य कोड तर्क को 'Application.EnableEvents = False' और 'Application.EnableEvents = True' – hnk

उत्तर

0

मेरे लिए मैं इसी तरह की समस्या थी और मैं selectRange.CopyPicture

में xlScreen और xlPrinter के बीच बदलकर इसे हल कर सकता है मुझे आशा है कि इस मदद करता है

0

मैं तुम और मैं से बहुत ही मुद्दे के साथ संघर्ष कर रहा था सोचें कि हमारे वीबीए कोड या प्रोग्रामिंग कौशल की कमी के साथ कुछ लेना देना नहीं है। त्रुटि यह बहुत यादृच्छिक है।

इसके अलावा, अगर त्रुटि संदेश प्राप्त करने के बाद मैंने DEBUG पर क्लिक किया और F8 दबाया ताकि चरण-दर-चरण कोड निष्पादित करना जारी रखा जा सके, तो मैं त्रुटि को छोड़ने में सक्षम था। समस्याग्रस्त रेखा के बाद मैंने सामान्य निष्पादन मोड में जारी रखने के लिए F5 दबाया।

बेशक, उपरोक्त समाधान नहीं है लेकिन मेरे कोडिंग के साथ कुछ भी गलत नहीं बताता है।

खैर, मैं इस किया था और यह मेरे लिए काम किया:

इस वाक्य से पहले

,

rgToPic.CopyPicture Appearance:=xlScreen, Format:=xlBitmap 

मैं इस एक कहा:

rgToPic.Copy 'just for nothing 

और मैं में त्रुटि कभी नहीं पड़ा है CopyPicture विधि फिर से।


अन्य स्थानों में इस मुद्दे के लिए खोज रहे मुझे पता चला कि कुछ उपयोगकर्ताओं CopyPicture विधि से पहले इस वाक्य शुरू करने से त्रुटि को छोड़ नहीं कर पाए:

application.CutCopyMode=false 
+0

यह मेरे लिए समाधान था। बस कोड डीबगिंग काम किया। मुझे सभी तरह से F8 मारा था! –

-1

हालांकि यह एक पुरानी पोस्ट है, हो सकता है यह किसी की मदद करेगा। मैं लंबे समय तक इसी तरह की समस्या से जूझ रहा था। CopyPicture असफल (कुछ कंप्यूटरों पर अधिकतर अक्सर दूसरों की तुलना में, लेकिन मेरे लैपटॉप पर दोहराना मुश्किल होता है) जब मैं उस श्रेणी की प्रतिलिपि बना रहा था जो में एक एम्बेडेड पीएनजी चित्र था। यह केवल Application.Visible=0 मोड में विफल रहा, Application.Visible=1 ठीक काम किया (मेरे आवेदन के लिए एक्सेल को अदृश्य मोड में चलाने के लिए अनिवार्य है)। आखिर में मैंने पाया कि 1 सीपीयू के साथ वीएम पर चलने पर मैं 100% बार समस्या का पुनरुत्पादन कर सकता हूं। निम्नलिखित समाधान अजीब है, लेकिन लगता है कि मेरी समस्या पूरी तरह हल हो रही है।

एंबेडेड पीएनजी एक्सेल एपीआई शर्तों में Shape है। मैं सिर्फ आकार (यहां तक ​​कि कुछ भी करने से नहीं) के माध्यम से चक्र करने के लिए आवश्यक CopyPicture कॉल करने से पहले:

# 'rng' is a range that I want CopyPicture on 
for shape in rng.Shapes: pass 
rng.CopyPicture(xlScreen, xlBitmap) 

मेरे निष्कर्ष कुछ हद तक this solution के समान है, जहां CopyPicture चार्ट के साथ एक श्रृंखला पर विफल रहा था।उनके मामले में, कार्यपुस्तिका को सक्रिय करने और श्रेणी स्वयं ही मदद मिली।

हाइपोथिसिंग, यह प्रतीत होता है कि धीमी या भारी लोड कंप्यूटर पर एक्सेल पृष्ठ पर जटिल वस्तुओं की "आलसी प्रसंस्करण" करता है, यानी ऑब्जेक्ट को किसी भी तरीके से एक्सेस नहीं होने तक उन्हें प्रतिपादित नहीं किया जाता है। प्रतिपादन को मजबूर करने का एक तरीका Visible=1 मोड में चल रहा है। एक और तरीका वस्तुओं के माध्यम से चक्र है। यदि यह मामला है, तो यह Excel के CopyPicture कार्यान्वयन का एक बग है जहां यह जटिल वस्तुओं को प्रतिलिपि बनाने से पहले प्रस्तुत करने के लिए मजबूर नहीं करता है। जब कॉपी विधि लक्ष्य सीमा के लिए प्रतिपादन को पाता है, तो तैयार नहीं होता है, यह रेंज को रेंडर करने के बजाय बस एक त्रुटि फेंकता है। खैर, कम से कम यह मेरा सिद्धांत है।

1

आमतौर पर लोग आदत के रूप में हर जगह application.screenupdating=false जोड़ते हैं (और यह आमतौर पर अच्छा होता है)।

लेकिन इस मामले में, एक्सेल रेंज (ठीक से) नहीं देख सकता है और इस प्रकार इसे कॉपी नहीं कर सकता है। मुझे लगता है कि यह इंटर्नली काम करने के लिए कुछ करता है लेकिन खराब कोडिंग या अंतराल के कारण, यह हर बार काम नहीं करता है।

तो, मैंने जांच की है कि यदि आप को copypicture से ठीक पहले हटाते हैं, तो यह काम करता है, (स्पष्ट क्लिपबोर्ड/Rg.copy/appearence = xlPrinter/समाधान से भी बेहतर और बेहतर)।

यहाँ कोड मैं का उपयोग का एक उदाहरण है (अधिक सुरक्षा के खिलाफ बुरा प्रतियों के साथ):

If Button = 2 And Eventz Then 
    Eventz = False 
    Cache_Souris 
    XX = X: YY = Y 
    sound "scroll1_short.wav" 
    Dim iPic2 As Object, Samerde As Boolean 
    With Lbl_CadreGothique.Parent 
     'With .Controls.add("Forms.Image.1", "Temp", False) 
     With .Controls("Temp") 
       .Top = Lbl_CadreGothique.Top + Y - 20 ': .Left = Lbl_CadreGothique.Left + X + 20 
       .BorderColor = 0: .BackColor = Lbl_TypeSkillTxt.ForeColor 
       .PictureAlignment = fmPictureAlignmentTopLeft 
       Err.Clear: On Error Resume Next 
       .AutoSize = True 
       Clear_Clipboard 
       'Rg.Copy 
       Rg.CopyPicture xlScreen, xlPicture 'xlBitmap 
       If Err = 0 Then 
        Set iPic2 = PastePicture '(xlBitmap) 
        If Not iPic2 Is Nothing Then 
          .Picture = iPic2 
        Else 
          Rg.CopyPicture xlScreen, xlBitmap: 
          Set iPic2 = PastePicture(xlBitmap) 
          If Not iPic2 Is Nothing Then 
           .Picture = iPic2 
          Else: Rg.CopyPicture xlPrinter, xlBitmap: .Picture = PastePicture(xlBitmap) 
          End If 
        End If 
        Set iPic2 = Nothing 
       Else 
        Rg.CopyPicture xlScreen, xlBitmap: .Picture = PastePicture(xlBitmap) 
       End If 
       Err.Clear: On Error GoTo 0 
       .AutoSize = False 

       If .Width > Rg.Width Then .Width = Rg.Width: Samerde = True 

       If Lbl_CadreGothique.Left + Lbl_CadreGothique.Width + X + 100 < .Parent.InsideWidth Then 
        .Left = Lbl_CadreGothique.Left + X + 20 
       Else: .Left = Lbl_CadreGothique.Left + X - 10 - .Width 
       End If 


       If .Height > Rg.Height Then .Height = Rg.Height: Samerde = True 
       'si marche pas mettre picture ? 
       If Samerde Then 
        .PictureSizeMode = fmPictureSizeModeStretch 
       Else: .PictureSizeMode = fmPictureSizeModeClip 
       End If 
       .Top = Min2(.Top, .Parent.InsideHeight - .Height) 
       .ZOrder 0 
       Application.ScreenUpdating = False 
       .Visible = True 
       DoEvents 
       'Debug.Print Rg.Width, .Width 
     End With 
    End With 
    aff_souris 
    Calc_ON 
    Eventz = True 
End If 

आप (भागों आप की जरूरत नहीं है को छोड़ सकते हैं इस एक एक नियंत्रण है, जब बटन ठीक है, प्रतियां उपयोगकर्ताफॉर्म पर एक लेबल की तस्वीर में रेंज होती हैं।

+0

धन्यवाद! मेरे मामले में "applicaiton.displayalert = false" समस्या थी! – Elloco

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