2009-01-13 7 views
20

मैं जब इस तरह कुछ करने के लिए कोशिश कर रहा एक प्रकार मेल नहीं खाता त्रुटि दिखाई दे रही हो रहे हैंएक्सेल में एक वीबीए फ़ंक्शन एक सीमा लौटा सकता है?</p> <p>नई कार्यपुस्तिका में:

A1 B1 
5 4 

Function Test1() As Integer 
    Dim rg As Range 
    Set rg = Test2() 
    Test1 = rg.Cells(1, 1).Value 
End Function 
Function Test2() As Range 
    Dim rg As Range 
    Set rg = Range("A1:B1") 
    Test2 = rg 
End Function 

जोड़ना = Test1() 5 लौटना चाहिए लेकिन कोड जब लौटने समाप्त करने के लिए लगता है test2() से एक रेंज। क्या एक सीमा वापस करना संभव है? करने के लिए Test2 में

उत्तर

39

एक सीमा एक वस्तु है। वस्तुओं नियत सेट कीवर्ड के उपयोग की आवश्यकता है, और लगता है कि आप अपने Test2 समारोह में एक भूल:

Function Test1() As Integer 
    Dim rg As Range 
    Set rg = Test2() 
    Test1 = rg.Cells(1, 1).Value 
End Function 

Function Test2() As Range 
    Dim rg As Range 
    Set rg = Range("A1:B1") 
    Set Test2 = rg   '<-- Don't forget the SET here' 
End Function 
+1

क्या इसे यूडीएफ के रूप में इस्तेमाल किया जा सकता है? – ja72

4

बदलें अंतिम पंक्ति:

Set Test2 = rg 
+0

काम करता है तो आप इस पर क्या कर रहा है विस्तृत कर सकते हैं? क्या मुझे हमेशा सेट का उपयोग करना चाहिए? मैं कई उदाहरण देखता हूं जहां इसे छोड़ा गया है। शीघ्र मदद के लिए धन्यवाद। –

7

तुम भी एक Variant() जो मूल्यों की एक सरणी का प्रतिनिधित्व करता लौट सकते हैं। एक उचित संख्या के साथ

Public Function ReverseValues(ByRef r_values As Range) As Variant() 
    Dim i As Integer, j As Integer, N As Integer, M As Integer 
    Dim y() As Variant 
    N = r_values.Rows.Count 
    M = r_values.Columns.Count 
    y = r_values.value 'copy values from sheet into an array 
    'y now is a Variant(1 to N, 1 to M) 
    Dim t as Variant 
    For i = 1 To N/2 
     For j = 1 To M 
      t = y(i, j) 
      y(i, j) = y(N - i + 1, j) 
      y(N - i + 1, j) = t 
     Next j 
    Next i 

    ReverseValues = y 
End Function 

कार्यपत्रक आप (- - ShiftEnterCtrl के साथ) एक सरणी सूत्र के रूप में इस समारोह में आवेदन करना होगा: यहां एक समारोह है कि एक नई रेंज में एक श्रेणी से मानों पराजयों के लिए एक उदाहरण है चयनित कोशिकाओं का। स्वैप() फ़ंक्शन का विवरण यहां महत्वपूर्ण नहीं है।

नोट इतनी पंक्तियों के लिए, यह बहुत ही कुशल है। x = Range.Value और Range.Value = x संचालन करते समय x एक सरणी है और श्रेणी में एकाधिक पंक्तियों कॉलम कई ऑपरेशन करने से पहले कोशिकाओं पर सीधे एक से अधिक तेज़ होते हैं।

2

यह भी

Function Test2(Rng As Range) As Range 
    Set Test2 = Rng 
End Function 
संबंधित मुद्दे