2013-09-27 7 views
6

मैं मुसीबत VBA में कुछ सरणियों से निपटने, या अधिक विशेष रूप मैं मुसीबत बदलती के एरे पर काम करने के कुछ मौजूदा सबरूटीन्स/तरीकों के कुशल उपयोग करने की कोशिश कर रही हो रही है आकार/आयाम।संशोधित मौजूदा समारोह के एरे को संभालने के लिए अलग-अलग आयाम/संरचना

एआर को एक COM ऑब्जेक्ट से पुनर्प्राप्त किया जाता है और जब वे एक अनुमानित, सुसंगत संरचना में आते हैं, जो नियमित रूप से सरणी (0), we have had trouble getting all of the functions to return the data in the same structure देता है।

तो, मैं अलग संरचनाओं, कभी कभी एक 2 डी सरणी, लेकिन कभी कभी एक 1 डी सरणी जहां प्रत्येक सरणी आइटम एक प्रकार/सरणी है के साथ काम कर रहा हूँ।

उदाहरण के लिए, अगर मैं एक मौजूदा समारोह जो arr(0,0) की तरह एक 2 डी संरचना की उम्मीद है, मैं इस संशोधित करने के लिए यह भी एक 1 डी सरणी है, जहां प्रत्येक आइटम टाइप संस्करण है स्वीकार करने की जरूरत (arr(0)(0) तरह संरचित)।

क्या मैं वर्तमान में

कर रहा हूँ मैं त्रुटियों को अक्षम है, और दूसरा आयाम की Ubound परीक्षण, जानते हुए भी कि अगर यह एक 1 डी सरणी है एक त्रुटि बढ़ा देंगे। मैं फिर सरणी की संरचना के आधार पर थोड़ा अलग पुनरावृत्ति कर सकता हूं।

  • मैं On Error Resume Next का उपयोग कर अगर मैं इसे से बचने कर सकते नफरत है, लेकिन यह कि तरह लगता है इस मामले में सबसे कारगर हो सकता है।

  • मुझे Excel.Application.Transpose पर भरोसा करना पसंद नहीं है, लेकिन पर कोई भी तरीका नहीं है जो PowerPoint में यह मूल रूप से कर सकता है।

उदाहरण:

Function GetSmallFromBar(counts As Variant, banner As Variant, categories As Variant) As Variant 
Dim small As Object 
Dim arrSizeErr As Variant 
Dim i As Long 
Set small = CreateObject("Scripting.Dictionary") 

On Error Resume Next 
arrSizeErr = UBound(counts, 2) 
arrSizeErr = (Err.Number <> 0) 
Err.Clear 
On Error GoTo 0 

'Array is structured like arr(0)(0) instead of arr(0,1) 
If arrSizeErr Then 
    counts = Excel.Application.Transpose(counts) 
    ReDim Preserve counts(0 To UBound(counts) - 1) 
    'Modify for unique array structure 
    For i = LBound(categories) To UBound(categories) 
     If counts(i) < 100 Then 
      small(i) = categories(i) 
     End If 
    Next 
    GoTo EarlyExit 
End If 

'This works for the expected array structure, arr(0,0) 
For i = LBound(categories) To UBound(categories) 
    If counts(i, 0) < 100 Then 
     small(i) = categories(i) 
    End If 
Next 
EarlyExit: 
GetSmallFromBar = small.Items() 

Set small = Nothing 
End Function 

नोट: मैं सरणी ReDim क्योंकि मैं 0 आधार सरणियों के साथ काम करने की जरूरत।

शायद मैं कहाँ कुछ इस तरह करने के लिए चलाने मेरी कोड में एक आधा दर्जन स्थानों रहे हैं, और हर एक के लिए एक समान है, लेकिन शायद नहीं समान विधि पर निर्भर करता है।

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

अतिरिक्त जानकारी और स्क्रीनशॉट

मैं 1- और 2-डी सरणियों के साथ विशेष रूप से काम कर रहा हूँ। लेकिन कभी-कभी मुझे एक 1 डी सरणी मिलती है जिसमें प्रत्येक आइटम Variant प्रकार भी होता है। यह मैं फिट बैठता है क्योंकि मैं आशा करती हूं कि मैं कार्य करता है और तरीकों कि मैं एक 2d सरणी पर उपयोग संरचना "सरणी के सरणी" पर काम करने के कुछ संशोधित कर सकते हैं देता है।

अपेक्षित 2 डी-सरणी

enter image description here

प्रकार के समस्याग्रस्त सरणी

enter image description here

+0

एक दृष्टिकोण एक VBA दिनचर्या जो कि आपके सभी अन्य कोड वास्तव में जानता है क्या प्रारूप उम्मीद करना तो एक विशेष प्रारूप (या तो एक 2d सरणी या सरणियों की एक सरणी) के उत्पादन मानकीकरण में अपने COM वस्तु कॉल रैप करने के लिए हो सकता है। –

+1

आप एक संस्करण 'v' (रेंज, सरणी, 1 डी-एरे की सरणी) को 2 डी-सरणी (1-आधारित) में परिवर्तित करने के लिए 'application.choose (सरणी (1), v)' का उपयोग भी कर सकते हैं। इसका उपयोग शब्दकोश में जोड़ने से पहले प्रारूपों को मानकीकृत करने के लिए किया जा सकता है। –

+0

@lori_m यह पीपीटी में काम करता है? (मैं अभी परीक्षण करने की स्थिति में नहीं हूं .. ..) मैंने पहले '.choose' विधि नहीं देखी है। ऐसा लगता है कि मुझे क्या चाहिए। –

उत्तर

1

जब तक आपके कोड वर्तमान में काम करता है मुझे लगता है कि यह ठीक है। यदि कुछ भी हो सकता है तो आप अपने उपरोक्त के भीतर कुछ कार्यों को अपने कार्यों में लपेटना चाहें ताकि यह पुन: प्रयोज्य हो।

चिप पियर्सन अपने सरणी साइट पर एक उपलब्ध समारोह है कि आप सरणी, जिसे फिर आप उपयोग कर सकते हैं के आयामों की संख्या का निर्धारण करने के लिए आप क्या करने की जरूरत है दे देंगे:

Public Function NumberOfArrayDimensions(Arr As Variant) As Integer 
Dim Ndx As Integer 
Dim Res As Integer 
On Error Resume Next 
    Do 
     Ndx = Ndx + 1 
     Res = UBound(Arr, Ndx) 
    Loop Until Err.Number <> 0 
NumberOfArrayDimensions = Ndx - 1 
End Function 

स्रोत: Chip Pearson, VBA Arrays

+0

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

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