2013-08-05 3 views
12

नाम से संदर्भित करता है मैं वीबीए के साथ एक एमएस एक्सेल 2013 टूल विकसित कर रहा हूं जिसमें क्वेरीटेबल्स का उपयोग शामिल है। मुझे लगता है कि एक असुविधा मौजूदा एक्सेल वर्कशीट के भीतर क्वेरीबेल एक्सेस कर रही है। वर्तमान में, एक क्वेरी तालिका तक पहुंचने के लिए मुझे एकमात्र विधि मिल सकती है पूर्णांक अनुक्रमण द्वारा। मैं अवधारणाएक्सेल वीबीए QueryTable ऑब्जेक्ट्स को

Sub RefreshDataQuery() 

Dim querySheet As Worksheet 
Dim interface As Worksheet 

Set querySheet = Worksheets("QTable") 
Set interface = Worksheets("Interface") 

Dim sh As Worksheet 
Dim QT As QueryTable 

Dim startTime As Double 
Dim endTime As Double 

Set QT = querySheet.ListObjects.item(1).QueryTable 

startTime = Timer 
QT.Refresh 
endTime = Timer - startTime 

interface.Cells(1, 1).Value = "Elapsed time to run query" 
interface.Cells(1, 2).Value = endTime 
interface.Cells(1, 3).Value = "Seconds" 

End Sub 

यह काम करता है लेकिन मैं वास्तव में ऐसा नहीं करना चाहता हूं। अंतिम उत्पाद उपकरण में पांच अलग-अलग क्वेरीबटेबल होंगे। मैं जो चाहता हूं वह एक प्रश्नोत्तरी को इसके नाम से संदर्भित करना है।

क्या अच्छा होगा अगर मैं लाइनों

Set QT = querySheet.ListObjects.items.QueryTable("My Query Table") 

कोई सुझाव बहुत सराहना की जाएगी साथ कुछ करने के लिए नीचे दिए गए

Set QT = querySheet.ListObjects.item(1).QueryTable 

कोड का अनुवाद कर सकता है।

उत्तर

6

this MSDN link for ListObject के अनुसार QueryTables का कोई संग्रह ListObjects की संपत्ति नहीं है। सही कोड है:

Set QT = querySheet.ListObjects.items(1).QueryTable 

क्या आप संभवतः की जरूरत ListObject item (सिर्फ उदाहरण कोड) की तरह उचित उल्लेख करने के लिए है:

Dim LS as ListObject 
Set LS = querySheet.ListObjects("My LO 1") 
Set QT = LS.QueryTable 

अन्य वैकल्पिक इस तरह से WorkSheet property के माध्यम से क्यूटी का उल्लेख करने के लिए है:

Set QT = Worksheet("QTable").QueryTables("My Query Table") 
+0

सेट QT = querySheet.ListObjects.items.QueryTable संकलित नहीं करता है। मुझे ListObjects के लिए एक आइटम प्रॉपर्टी नहीं दिखाई दे रही है। अपने दूसरे सुझाव के लिए, क्यूटी = वर्कशीट ("क्यूटेबल") सेट करें। क्वेरीटेबल्स ("मेरी क्वेरी टेबल"), यह मेरे लिए काम नहीं करता क्योंकि क्यूटेबल पहले से मौजूद था। –

+0

मैंने इसे बदल दिया: 'QT = querySheet.ListObjects.items (1) .QueryTable' जो आपके कोड के समान है। –

+0

आपका क्या मतलब है कि 'वर्कशीट पूर्व-मौजूदा थी?' ... जो स्पष्ट है- क्यूटी का नाम बदलकर जो आपके पास है। आप इस तरह से शीट में क्यूटी की संख्या हमेशा जांच सकते हैं: 'डीबग.प्रिंट वर्कशीट्स ("क्यूटेबल")। QueryTables.Count' और प्रत्येक QT का नाम इस तरह से:' ly है। आप इस तरह से शीट में क्यूटी की संख्या हमेशा जांच सकते हैं: 'डीबग। प्रिंट वर्कशीट्स ("क्यूटेबल")। क्वेरीबटेबल्स (1)। पहले के लिए। –

8

एक्सेल 2003 और इससे पहले, एक बाहरी डेटा कनेक्शन एक क्वेरीरीबल ऑब्जेक्ट बनाएगा जिसका माता-पिता वर्कशीट था। आप QueryTables संग्रह ऑब्जेक्ट के माध्यम से, एक के लिए QueryTable ऑब्जेक्ट तक पहुंच सकते हैं। अधिकांश संग्रह ऑब्जेक्ट्स की तरह, आप इसे प्राप्त करने के लिए एक इंडेक्स नंबर या नाम (डिफ़ॉल्ट) आइटम विधि को पास कर सकते हैं।

Sheet1.QueryTables("MyQtName") 

जब आप एक नए संस्करण में एक 2003 कार्यपुस्तिका खोलते हैं, तो यह अभी भी एक QueryTable वस्तु है और उसी तरह से पहुँचा जा सकता है। यहां तक ​​कि यदि आप फ़ाइल प्रारूप को परिवर्तित करते हैं, तो QueryTable बनी रहती है।

2007 और बाद के संस्करणों में, वहाँ एक QueryTable कि Worksheet.QueryTables के एक सदस्य हो जाएगा बनाने के लिए केवल तीन तरीके हैं: - पाठ

  • डाटा से -

    1. कोड के माध्यम से
    2. डाटा से वेब

    इन नए संस्करणों में अन्य सभी यूआई बाहरी डेटा कनेक्शन परिणामस्वरूप QueryTables सदस्य नहीं होंगे, बल्कि ListObject में होंगे। उस ListObject में एक और केवल एक QueryTable ऑब्जेक्ट होगा जिसे ListObject.QueryTable प्रॉपर्टी के माध्यम से एक्सेस किया जा सकता है।

    यहां बुरी खबर है। QueryTable जिसका अभिभावक सूची सूची में नाम संपत्ति नहीं है। खैर, यह वहां है, लेकिन यदि आप इसे एक्सेस करने का प्रयास करते हैं तो आपको रनटाइम त्रुटि 1004 मिल जाएगी। मुझे लगता है कि एमएस ने फैसला किया है क्योंकि प्रति सूची केवल एक प्रश्नोत्तरी योग्य है, यह समझ में नहीं आया कि इसका नाम होना चाहिए।

    यदि आप वर्कशीट को परिवर्तित करने का प्रयास करते हैं .QueryTables.QueryTable एक सूची ऑब्जेक्ट में, बाहरी डेटा कनेक्शन दूर हो जाता है और नई ListObject में QueryTable नहीं है।

    आपकी क्वेरीटेबल्स के बाद से। काउंटर शून्य लौटा रहा है, आपके सभी क्वेरीटेबल्स ListObjects के अंदर हैं और उनके पास नाम नहीं हैं। ListObjects के नाम हैं। आप उपयोग कर सकते हैं

    Sheet1.ListObjects("MyListName").QueryTable 
    

    यहाँ एक समारोह है कि एक नाम और एक वर्कशीट लेता है और एक QueryTable देता है कि या तो यह है कि नाम है या एक ListObject कि नाम है जो का एक बच्चा है है।

    Public Function QueryTableByName(ByVal sName As String, ByRef sh As Worksheet) As QueryTable 
    
        Dim qt As QueryTable 
        Dim lo As ListObject 
    
        On Error Resume Next 
         Set qt = sh.QueryTables(sName) 
        On Error GoTo 0 
    
        If qt Is Nothing Then 
         On Error Resume Next 
          Set lo = sh.ListObjects(sName) 
         On Error GoTo 0 
    
         If Not lo Is Nothing Then 
          On Error Resume Next 
           Set qt = lo.QueryTable 
          On Error GoTo 0 
         End If 
        End If 
    
        Set QueryTableByName = qt 
    
    End Function 
    
  • +1

    मदद के लिए धन्यवाद महान सारांश और समारोह! –

    +0

    यह बहुत उपयोगी और वर्णनात्मक था। धन्यवाद! –

    +0

    @ डिक कुस्लेका दुख की बात यह प्रतीत होती है कि सूची ऑब्जेक्ट्स में अब 2013 में नाम संपत्ति नहीं है या एक क्वेरीटेबल संपत्ति है। –