2014-07-25 4 views
7

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

Option Explicit 

Type Info 
    source As String 
    destination As String 
End Type 

Sub specialCopy() 
    Dim target As Variant 
    Dim AllTargets() As Info: AllTargets = SetAllTargets() 
    For Each target In AllTargets 
     CopyValues (target) 
    Next 
End Sub 

Function SetAllTargets() As Info() 
    Dim A As Info: A = SetInfo("A1", "B1") 
    Dim B As Info: B = SetInfo("A2", "B2") 
    Dim AllTargets() As Info 
    Set AllTargets = Array(A, B) 
End Function 

Function SetInfo(source As String, target As String) As Info 
    SetInfo.source = source 
    SetInfo.destination = destination 
End Function 

Sub CopyValues(target As Info) 
    Range(target.source).Select 
    Selection.Copy 
    Range(target.destination).Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 
End Sub 

मैं अपने AllTargets सरणी के माध्यम से कैसे पुन: प्रयास कर सकता हूं? चूंकि मैं इसे संकलित करने में असमर्थ हूं क्योंकि यहां एक से अधिक समस्या हो सकती है। मुझे पूरी तरह से यकीन नहीं है कि जिस तरह से मैंने AllTargets सूची सेट की है वह एक वैध वाक्यविन्यास है।


मैं उदाहरण के कोड में समस्याओं को कम करने के लिए फिर से काम:

Option Explicit 

Type Info 
    source As String 
    destination As String 
End Type 

Sub specialCopy() 
    Dim target As Variant 
    Dim AllTargets As Collection: Set AllTargets = SetAllTargets() 
    For Each target In AllTargets 
     CopyValues (target) '2. unkown if this is possible 
    Next 
End Sub 

Function SetAllTargets() As Collection 
    Dim A As Info: A = SetInfo("A1", "B1") 
    Dim B As Info: B = SetInfo("A2", "B2") 
    Set SetAllTargets = New Collection 
    SetAllTargets.Add (A) '1. problem here when assigning user type 
    SetAllTargets.Add (B) '1. problem here when assigning user type 
End Function 

Function SetInfo(source As String, destination As String) As Info 
    SetInfo.source = source 
    SetInfo.destination = destination 
End Function 

Sub CopyValues(target As Info) 
    Range(target.source).Select 
    Selection.Copy 
    Range(target.destination).Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 
End Sub 

कोड संग्रह करने के लिए सरणी से चला गया - कभी भी कम वहाँ अभी भी उस में मुद्दों है कि अब मैं समाधान नहीं कर सकते हैं ।

मुझे लगता है कि मूल कारण वही रहा: उपयोगकर्ता परिभाषित प्रकारों का उपयोग करना। मैंने एक टिप्पणी के रूप में चिह्नित किया जहां मुझे लगता है कि समस्याएं स्थित हैं।

उत्तर

9

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

एक नया वर्ग मॉड्यूल बनाएं (सम्मिलित करें - मॉड्यूल)। गुण पत्र (एफ 4) पर जाएं और नाम संपत्ति को CInfo में बदलें।

क्लास में

Private mSource As String 
Private mDestination As String 

Public Property Get Source() As String 
    Source = mSource 
End Property 

Public Property Let Source(rhs As String) 
    mSource = rhs 
End Property 

Public Property Get Destination() As String 
    Destination = mDestination 
End Property 

Public Property Let Destination(rhs As String) 
    mDestination = rhs 
End Property 

CInfo एक मानक मॉड्यूल

Sub specialCopy() 
    Dim target As Variant 
    Dim AllTargets As Collection: Set AllTargets = SetAllTargets() 
    For Each target In AllTargets 
     CopyValues target '2. unkown if this is possible 
    Next 
End Sub 

Function SetAllTargets() As Collection 
    Dim A As CInfo: Set A = SetInfo("A1", "B1") 
    Dim B As CInfo: Set B = SetInfo("A2", "B2") 
    Set SetAllTargets = New Collection 
    SetAllTargets.Add A 
    SetAllTargets.Add B 
End Function 

Function SetInfo(Source As String, Destination As String) As CInfo 
    Set SetInfo = New CInfo 
    SetInfo.Source = Source 
    SetInfo.Destination = Destination 
End Function 

Sub CopyValues(ByRef target As Variant) 
    Range(target.Source).Select 
    Selection.Copy 
    Range(target.Destination).Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 
End Sub 
+0

देर स्वीकृति के लिए खेद है में, यह मुझे कुछ समय लिया चारों ओर हो और यह परीक्षण करने के लिए। एक आकर्षण की तरह काम करता है हालांकि मुझे एहसास नहीं हुआ कि मुझे संपत्ति संपादक में कक्षा का नाम देना था। – Johannes

+1

अच्छा बिंदु। मैंने कक्षा को सम्मिलित करने और इसे पुनर्नामित करने का तरीका शामिल करने के लिए उत्तर संपादित किया। –

+0

कुछ अन्य भाषाओं में सिंटैक्टिक चीनी कहा जाता है। वीबीए वाक्य रचनात्मक कड़वाहट प्रदान करता है। –

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