2013-08-14 15 views
7

पर एक वीबीए संग्रह कैसे लिखें I मेरे पास कुछ मौजूदा कोड है जो मैं संशोधित कर रहा हूं। यह कोड पूर्ववर्ती वर्कशीट टेबल से पंक्तियों का संग्रह बनाता है। यह प्रत्येक कॉलम में अलग-अलग जानकारी के साथ एक बड़ा 2-डी संग्रह बनाता है। एक अलग वर्ग मॉड्यूल है जो प्रत्येक कॉलम के लिए डेटा प्रकार घोषित करता है।एक्सेल शीट

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

क्या संपूर्ण संग्रह को 2-डी सरणी में परिवर्तित करने का कोई तरीका है, या फिर मैं एक ही बार में 2-डी सरणी लिख सकता हूं? या क्या पूरे संग्रह को शीट में लिखने का कोई तरीका है, बस 2-डी सरणी के साथ? मैंने इसकी खोज करने की कोशिश की है और अब तक असफल रहा है। किसी भी सामान्य अंक की सराहना की जाएगी!

यहां कुछ उदाहरण कोड है, बोल्ड में टिप्पणियों के साथ, यह वर्णन करने के लिए कि संग्रह का उपयोग कैसे किया जा रहा है।

परिभाषित क्लास मॉड्यूल, TableEntry

Public Item1 As String 
Public Item2 As String 
Public Item3 As String 
Public Item4 As Integer 
Public Item5 As Integer 
के रूप में नामांकित

मुख्य रूटीन - समूह बनाएं, संग्रह भरें, शीट

Sub MainRoutine() 

Dim table As Collection 
Set table = New Collection 

Call FillCollection(File As String, ByRef table As Collection) 

Call WriteCollectionToSheet(ByRef table As Collection) 

को संग्रह लिखें उप दिनचर्या 1 - संग्रह भरें

Dim wb As Workbook 
Set wb = Workbooks.Open(File) 

Dim ws As Worksheet 
For Each ws In ActiveWorkbook.Worksheets 

Dim R As Range 
Set R = ws.Range("A2") 

    Dim e As TableEntry 
    For i = 1 To 20 

    Set e = New TableEntry 

    e.Item1 = R.Offset(i + 1, 0).Offset(0, 0) 
    e.Item2 = R.Offset(i + 1, 0).Offset(0, 1) 
    e.Item3 = R.Offset(i + 1, 0).Offset(0, 2) 
    e.Item4 = R.Offset(i + 1, 0).Offset(0, 3) 
    e.Item5 = R.Offset(i + 1, 0).Offset(0, 4) 

    table.Add e 

    Next i 

Next ws 

उप दिनचर्या 2 - पत्र के संग्रह लिखें

+0

धन्यवाद रैग। मुझे यह स्वयं पाया जाना चाहिए – psychonomics

+0

उपरोक्त लिंक में उत्तर संग्रह के बजाय एक सरणी का उपयोग करता है। क्या यह मुझे करना चाहिए, या एक संग्रह में एक संग्रह को स्थानांतरित करने का तरीका है, या वास्तव में एक पास में संग्रह लिखना है? – psychonomics

+1

असल में, यदि आप स्क्रीन अपडेटिंग और गणना बंद कर देते हैं, तो यह पर्याप्त तेज़ होगा, भले ही आप लूप का उपयोग करें। – martin

उत्तर

5

मुझे लगता है कि सबसे आसान तरीका है एक्सेल स्प्रेडशीट पर एक शब्दकोश मुद्रित करने के लिए WorksheetFunction.Transpose(Variantप्रकारArray)

का उपयोग करना है नीचे कोड

  • कुंजी और आइटम
  • दो सरणियों (चाबियाँ, आइटम) बनाता है के साथ एक नमूना शब्दकोश बनाता है और उन्हें तत्वों शब्दकोश से एक में जाना
  • को WorksheetFunction.Transpose(VariantArray) का उपयोग करता है के साथ भरता है प्रिंट सरणियों एक में जाना

Option Explicit 

>> उपकरण >> संदर्भ >> माइक्रोसॉफ्ट स्क्रिप्टिंग रनटाइम 'माइक्रोसॉफ्ट स्क्रिप्टिंग रनटाइम के लिए संदर्भ जोड़ें'

Sub CollectionToArrayToSpreadSheet() 
    Cells.ClearContents 
    ' think of this collection as 
    ' key  = cell.row 
    ' item = cell.value 
    Dim dict As New Dictionary 
    dict.Add Key:=1, Item:="value1" 
    dict.Add Key:=2, Item:="value2" 
    dict.Add Key:=3, Item:="value3" 

    ' THIS WAY 
    'Range("A1:A" & UBound(dict.Keys) + 1) = WorksheetFunction.Transpose(dict.Keys) 
    'Range("B1:B" & UBound(dict.Items) + 1) = WorksheetFunction.Transpose(dict.Items) 

    ' OR 
    Range("A1").Resize(UBound(dict.Keys) + 1, 1) = WorksheetFunction.Transpose(dict.Keys) 
    Range("B1").Resize(UBound(dict.Items) + 1, 1) = WorksheetFunction.Transpose(dict.Items) 

End Sub 


अद्यतन:

आपके मामले में ...

यदि यह तुम क्या करने की कोशिश कर रहे है

Range("A1:A" & table.Count) = WorksheetFunction.Transpose(table) 

दुर्भाग्य से, जवाब नहीं है (टिप्पणीtableएक संग्रह है)।

आप संग्रह के माध्यम से बिना किसी स्प्रेडशीट पर संग्रह को स्थानांतरित कर सकते हैं।

आप प्रक्रिया में तेजी लाने के लिए क्या कर सकते हैं यह है:

  • बारी संग्रह ओवर में Application.ScreenUpdating
  • दोहराएं और एक सरणी के लिए खत्म हो मूल्यों कॉपी, तो WorksheetFunction.Transpose() उपयोग करने के लिए सब कुछ मुद्रित करने के लिए एक में चादर जाना
( जवाब के पहले हिस्से से तर्क का उपयोग करें) 210

अप का पालन करें:

आपके मामले में आप इस तरह Sub WriteCollectionToSheet(ByRef table As Collection) पुनर्लेखन कर सकते हैं (कोड थोड़ा बदसूरत दिखता है, लेकिन क्षमता ठीक होना चाहिए) VBA संग्रह पुनरावृत्तियों पर

Sub WriteCollectionToSheet(ByRef table As Collection) 

    Dim dict1 As New Dictionary 
    Dim dict2 As New Dictionary 
    Dim dict3 As New Dictionary 
    Dim dict4 As New Dictionary 
    Dim dict5 As New Dictionary 

    Dim i As Long 
    For i = 1 To table.Count 
     dict1.Add i, table.Item(i).Item1 
     dict2.Add i, table.Item(i).Item2 
     dict3.Add i, table.Item(i).Item3 
     dict4.Add i, table.Item(i).Item4 
     dict5.Add i, table.Item(i).Item5 
    Next i 

    Range("A1:A" & UBound(dict1.Items) + 1) = WorksheetFunction.Transpose(dict1.Items) 
    Range("B1:B" & UBound(dict2.Items) + 1) = WorksheetFunction.Transpose(dict2.Items) 
    Range("C1:C" & UBound(dict3.Items) + 1) = WorksheetFunction.Transpose(dict3.Items) 
    Range("D1:D" & UBound(dict4.Items) + 1) = WorksheetFunction.Transpose(dict4.Items) 
    Range("E1:E" & UBound(dict5.Items) + 1) = WorksheetFunction.Transpose(dict5.Items) 

End Sub 

अधिक जानकारी और शीट को प्रिंट करना @vba4all.com

+0

धन्यवाद @ mehow। एक सरणी में कनवर्ट करना और एक बार में प्रिंट करना अच्छा लगता है। क्या संग्रह अभी भी तत्वों के साथ सरणी भर सकता है यदि संग्रह को 'नया शब्दकोश' के बजाय 'नया संग्रह' के रूप में निर्दिष्ट किया गया हो? – psychonomics

+1

@psychonomics देखें, इस मामले में मैं नहीं समझता कि आपके पास 2 डी संग्रह कैसा है।यह कैसे कार्यान्वित किया जाता है और यह कैसे काम करता है क्योंकि संग्रह से प्राप्त होने वाली एकमात्र चीज 'हैम (इंडेक्स) 'है। क्या आप कोड दिखा सकते हैं कि आपका संग्रह कैसे कार्यान्वित किया जाता है और इसका उपयोग किया जाता है? फिर मैं अपने मामले से मेल खाने के लिए अपना उत्तर अपडेट कर सकता हूं 100% –

+0

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

3

यदि मैं एक वर्कशीट में कोड के अंदर पॉप्युलेट किया गया एक 2 डी सरणी लिखना चाहता हूं, तो मैं इस कोड का उपयोग करता हूं। यह बहुत ही कुशल है, क्योंकि यह केवल कार्यपत्रक में 'वार्ता' एक बार

Dim r as Range 
Dim var_out as Variant 
Set r = Range("OutputValues") 
r.clear 
var_out = r.value 

'Then use code to appropriately fill the new 2D array var_out, such as your subroutine 1 above 

r.value = var_out 

आप कार्यपुस्तिका आप सरणी के लिए प्रिंट करना चाहते हैं में सीमा की पहचान करके शुरू करते हैं। इस उदाहरण में, मैंने माना कि मैंने आउटपुट रेंज "आउटपुट वैल्यूज" नाम दिया है।

var_out (मेरे सरणी परिवर्तनीय I populate करने का इरादा) r.value का पहला असाइनमेंट श्रेणी के आकार के आधार पर सरणी चर के आयाम सेट करता है। (यह सीमा में किसी भी मौजूदा मूल्य में भी पढ़ता है, इसलिए यदि आप इसे नहीं चाहते हैं, तो मैंने यहां दिखाए गए रेंज को साफ़ करें।)

श्रेणी में सरणी चर के दूसरे असाइनमेंट मूल्यों को वापस लिखते हैं शीट के लिए।

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