2013-06-10 7 views
6

मेरे पास कुछ कॉम्बो बॉक्स हैं जो मैं कार्यपुस्तिका खोलने पर पॉप्युलेट करता हूं - डेटा का स्रोत डेटाबेस से आता है।एक्सेल को अपठनीय सामग्री मिली - डेटा सत्यापन

मैं निम्नलिखित कोड के साथ डेटा सत्यापन का उपयोग कर मेरी कॉम्बो बॉक्स पॉप्युलेट: -

With Selection.Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=list 
    .IgnoreBlank = False 
    .InCellDropdown = True 
    .ShowInput = True 
    .ShowError = True 
    End With 

जहां सूची एक अल्पविराम से अलग स्ट्रिंग है कि मैं डेटाबेस recordset से बनाया है है।

यह सब ठीक काम करता है। समस्या तब उत्पन्न होती है जब मैं बाद में कार्यपुस्तिका को फिर से खोलता हूं। मैं

कोई त्रुटि मिलती है "एक्सेल अपठनीय सामग्री नहीं मिली। आप इस फ़ाइल की सामग्री को ठीक करना चाहते हैं"

आप हाँ कहते हैं और एक्सेल तो आप देता है

"एक्सेल फ़ाइल की मरम्मत करने में सक्षम था को हटाने सुविधाओं "

और कॉम्बो बक्से में से कुछ से डेटा मान्यता

मैं कुछ खोज स्ट्रिंग मेरी डेटा मान्यता के लिए मैं उपयोग कर रहा हूँ बहुत लंबा है इंटरनेट से संदेह चला गया है?

मेरे लिए एक छिपी हुई शीट में रिकॉर्डसेट मान जोड़ने और छिपी हुई शीट पर डेटा सत्यापन कोड सेट करने का विकल्प नहीं है क्योंकि कॉम्बो बॉक्स गतिशील हैं और उपयोगकर्ता चयन के आधार पर काटते हैं और बदलते हैं। मुझे वास्तव में केवल मेरी स्ट्रिंग में डेटा सत्यापन सेट करने में सक्षम होना चाहिए जिसे मैंने उपयोगकर्ता इंटरैक्शन में विभिन्न बिंदुओं पर बनाया है।

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

+2

का उपयोग कर रहा हूं स्ट्रिंग 255 वर्णों तक सीमित है। कोई अपवाद या चाल नहीं है- यदि आपको – JosieP

+1

धन्यवाद जोसी का उपयोग करने के लिए आपको _have_ की आवश्यकता है। दिलचस्प है कि यह Valiation सेट करने के समय में त्रुटि नहीं है। केवल तभी जब आप अगली बार इसे खोलने के लिए जाते हैं। विचित्र व्यवहार – David

+0

@ जोसीपीपी इसके लिए सही उत्तर है, धन्यवाद –

उत्तर

1

ऐसा लगता है कि आप Validation formula1 parameter की स्ट्रिंग लंबाई के साथ सही हैं। आप के लिए मेरे सुझाव (अतिरिक्त जानकारी के कोड के भीतर टिप्पणी के रूप में रखा जाता है) इस प्रकार है:

'Split your list into array, or if data are Array before you _ 
create List variable you could combine some of earlier steps _ 
of your code 

    List = Split(List, ",") 
'paste your list into hidden sheet as of A1 direction bottom, _ 
we need to transpose our Array to do so 
    Sheets("hidden").Range("a1").Resize(UBound(List) + 1, 1) = Application.Transpose(List) 

With Selection.Validation 
    .Delete 
    'here we need to change definition of formula 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, _ 
    Formula1:="=Hidden!A1:A" & UBound(List) + 1 
    .IgnoreBlank = False 
    .InCellDropdown = True 
    .ShowInput = True 
    .ShowError = True 
    End With 
+0

आपके सुझाव के लिए धन्यवाद। मुझे गतिशील रेंज असाइनमेंट का उपयोग पसंद है। हालांकि मेरे पास combos हैं जो पिछले कॉम्बो विकल्पों के आधार पर उनके सभी संभावित मान का सबसेट प्रदर्शित करते हैं। इसका मतलब है कि मुझे मूल कॉम्बो के आधार पर डेटा के प्रत्येक उप-समूह के लिए श्रेणियां परिभाषित करने की आवश्यकता होगी। मुझे संभावित रूप से सक्रिय एक्स कोम्बो को वैकल्पिक रूप से देखना पड़ सकता है – David

5

मैं अपने एक्सेल परियोजनाओं में से कुछ में पहले मान्यता सूचियों चालाकी से किया है। जब आप अनुमति देने के लिए सत्यापन सेट करते हैं: सूची, आप अपना डेटा स्रोत कार्यपुस्तिका-स्तर नामित श्रेणी के रूप में सेट कर सकते हैं।

With Selection.Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
     xlBetween, Formula1:="=listrange" 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .ShowInput = True 
    .ShowError = True 
End With 

आपको लगता है कि सूत्र स्ट्रिंग बहुत लंबी होने के लिए एक त्रुटि कभी नहीं मिलेगा: इस उदाहरण में, मैं नामांकित श्रेणी "listrange" परिभाषित किया है।

मैंने अपने सभी सत्यापन-संदर्भित नामों को एक वर्कशीट में रखा है, और इसे छुपाया है। फिर मेरा कोड उन नामित श्रेणियों में हेरफेर करता है, जो बदले में सत्यापन ड्रॉप-डाउन मेनू से उपलब्ध मान अपडेट करते हैं।

नामित श्रेणियों के आकार को अद्यतन करने के दौरान गतिशील रूप से अपडेट करना मुश्किल हो सकता है, लेकिन यह वीबीए के साथ बहुत कठिन नहीं है, खासकर यदि आप डेटाबेस से सेट वापस नहीं कर रहे हैं, जहां आप एक रिकॉर्ड गिनती प्राप्त कर सकते हैं । विकल्प ActiveX नियंत्रण मार्ग पर जाना है, लेकिन मुझे डेटा सत्यापन ड्रॉप-डाउन के स्वच्छ, मूल रूप और अनुभव पसंद हैं।

1

बस इस मुद्दे में भाग गया (कार्यपुस्तिका खोलने पर डेटा सत्यापन फॉर्मूला लंबाई पर सीमा), और ओपी जैसे सहायक श्रेणियों के साथ जाना नहीं चाहेंगे।

मेरा कामकाज Workbook_BeforeSave हैंडलर में सत्यापन को हटाना है।

मेरा उपयोग केस बाहरी स्रोतों से डेटा को हमेशा रीफ्रेश करना है, इसलिए कार्यपुस्तिका को सहेजने से पहले सभी आयातित डेटा और सत्यापन हमेशा हटाने के लिए एक व्यवहार्य विकल्प है।

0

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

समस्या हल एक समारोह कर का कारण बनता है और यह एक इलाज :)

काम करता है
2

मैंने वर्कबुकबेयरसेव घटना में अपना सत्यापन हटाकर इस समस्या को हल किया है। हालांकि, मैं सी #

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