मैं मुसीबत 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 डी-सरणी
प्रकार के समस्याग्रस्त सरणी
एक दृष्टिकोण एक VBA दिनचर्या जो कि आपके सभी अन्य कोड वास्तव में जानता है क्या प्रारूप उम्मीद करना तो एक विशेष प्रारूप (या तो एक 2d सरणी या सरणियों की एक सरणी) के उत्पादन मानकीकरण में अपने COM वस्तु कॉल रैप करने के लिए हो सकता है। –
आप एक संस्करण 'v' (रेंज, सरणी, 1 डी-एरे की सरणी) को 2 डी-सरणी (1-आधारित) में परिवर्तित करने के लिए 'application.choose (सरणी (1), v)' का उपयोग भी कर सकते हैं। इसका उपयोग शब्दकोश में जोड़ने से पहले प्रारूपों को मानकीकृत करने के लिए किया जा सकता है। –
@lori_m यह पीपीटी में काम करता है? (मैं अभी परीक्षण करने की स्थिति में नहीं हूं .. ..) मैंने पहले '.choose' विधि नहीं देखी है। ऐसा लगता है कि मुझे क्या चाहिए। –