2009-11-06 27 views
6

मैं कोई पहुँच टेबल एक्सेल से VBA का उपयोग कर ... किसी भी मदद के नाम बदलने का प्रयास?एक्सेल से वीबीए का उपयोग कर एक्सेस टेबल का नाम कैसे बदलें?

+1

आप क्यों चाहते हैं? जब तक यह एक अस्थायी डेटा तालिका नहीं है। –

उत्तर

6

कैसे के बारे में:

Dim appAccess As Object 
''acTable=0 

Set appAccess = CreateObject("Access.Application") 
appAccess.OpenCurrentDatabase "C:\Docs\LTD.mdb" 

appAccess.DoCmd.Rename "NewTableName", 0, "OldTableName" 

appAccess.Quit 
Set appAccess = Nothing 
+1

यह अच्छा होगा अगर आपका कोड स्वयं के बाद साफ हो जाए, तो आपको नहीं लगता? –

+2

@ डेविड डब्ल्यू फेंटन मैं इस धारणा के तहत था कि यह एक मंच था जहां अधिकांश भाग के लिए विचार पर्याप्त होना चाहिए और यहां तक ​​कि एक-पंक्ति के जवाब भी पर्याप्त होंगे। – Fionnuala

+1

@ डेविड डब्ल्यू फेंटन अगर आपको सच में लगता है कि यह महत्वपूर्ण है, तो जवाब संपादित करें और इसे स्वयं ठीक करें –

9

यहाँ मेरी कार्यक्रमों में से एक (जो अभी भी कंपनी में दैनिक उपयोग में है) से एक उदाहरण है। यह एक vb6 प्रोग्राम से लिया गया है, लेकिन vba में भी निष्पादित करता है। मैंने यह सुनिश्चित करने के लिए परीक्षण किया है।

इस उदाहरण में हमारे पास "mytable_tmp" नाम से एक अस्थायी तालिका है, जिसे नए डेटा के साथ अपडेट किया गया है और हम इसे "mytable" तालिका में बदलकर सहेजना चाहते हैं।

अपने एक्सेल VBA संपादक से

आपको निम्न दो प्रकार पुस्तकालयों के लिए एक संदर्भ सेट करना होगा:

  • "Microsoft ActiveX डेटा ऑब्जेक्ट 2.8 लाइब्रेरी"
  • "माइक्रोसॉफ्ट एडीओ Ext DDL के लिए 2.8 और। सुरक्षा "

पहला एडीओडीबी नेमस्पेस और दूसरा एडीओएक्स नेमस्पेस के लिए है। (हो सकता है कि आपके पास 2.5 या उससे पहले की तरह एमडीएसी का पहले संस्करण हो; यह भी काम करना चाहिए)।

Private Sub RenameTable() 
Dim cn   As New ADODB.Connection 
Dim cat  As ADOX.Catalog 
Const sDBFile As String = "c:\et\dbtest.mdb" 

    On Error GoTo ErrH 

    With cn 
     .Provider = "Microsoft.Jet.OLEDB.4.0" 
     .Mode = adModeShareDenyNone 
     .Properties("User ID") = "admin" 
     .Properties("Password") = "" 
     .Open sDBFile 
    End With 

    Set cat = New ADOX.Catalog 
    cat.ActiveConnection = cn 
    cat.Tables("mytable").Name = "mytable_old" 
    cat.Tables("mytable_tmp").Name = "mytable" 
    cat.Tables("mytable_old").Name = "mytable_tmp" 

ExitHere: 
    If Not cn Is Nothing Then 
     If Not cn.State = adStateClosed Then cn.Close 
     Set cn = Nothing 
    End If 
    Set cat = Nothing 
    Exit Sub 

ErrH: 
Dim sMsg As String 
    sMsg = "Massive problem over here man." 
    sMsg = sMsg & vbCrLf & "Description : " & cn.Errors.Item(0).Description 
    MsgBox sMsg, vbExclamation 
    GoTo ExitHere 
End Sub 

सहायक होने की उम्मीद है।

+1

ऐसा लगता है कि रेमो की तीन पंक्तियों के कोड पर इस लंबे समय से कोड का एकमात्र मूल्य तब होता है जब आपके पास एक्सेस इंस्टॉल नहीं होता है । –

+0

यह एक ही कोड के भीतर केवल एक सीधी प्रति से अधिक करने का विकल्प देता है - और कौन जानता है, एक्सेल उपयोगकर्ता को एक्सेस तक पहुंच नहीं हो सकती है। फिर भी, आम तौर पर मुझे रेमो के दिखने को और अधिक उपयोग करने के लिए सहमत होना चाहिए। – mavnn

+0

;) आप कैसे हैंडलिंग और उपयोगकर्ता संदेशों को शामिल करने की हिम्मत कैसे करते हैं। और यह सब प्रारूपण क्या है! (यदि आप स्टीवी की आवाज़ में करते हैं तो बहुत मजेदार)। +1 – JeffO

0

यहाँ ऊपर Remou के कोड में एक मामूली विकल्प नहीं है। मैं अपने गुणों और विधियों तक पहुंचने के लिए मुझे आवश्यक डेटाबेस खोलने के लिए खोल फ़ंक्शन का उपयोग करता हूं और फिर GetObject फ़ंक्शन का उपयोग करता हूं। यह इस तरह से कर रही है के लिए लाभ 1 कर रहे हैं) आप कैसे पहुँच आवेदन के लिए विंडो खुल जाएगा चुन सकते हैं। मेरे उद्देश्यों के लिए, मैं इसे छिपाना चाहता हूं। 2) मैं दोनों पहुँच है 2003 और 2007 स्थापित किया है और Remou की विधि 2003 का कारण बनता है खोलने के लिए, है जो मैं नहीं चाहता। मेरी विधि (मुझे लगता है) फ़ाइल खोलता है जो एक्सेस विंडोज़ के किसी भी संस्करण में खोलने के लिए इस्तेमाल होता था, जिस पर उपयोगकर्ता ने डबल क्लिक किया था।

नकारात्मक पक्ष यह है कि क्या आप वाकई डेटाबेस यह हेरफेर करने के लिए प्रयास करने से पहले खुला है चाहिए। मैं इससे निपटने के लिए एक सरल प्रतीक्षा सबराउटिन का उपयोग करता हूं, लेकिन आप अधिक परिष्कृत चीजें कर सकते हैं जो आप कर सकते हैं।

Sub Rename() 
    Dim ObjAccess As Object, MDB_Address As String, TaskID As Integer 

    MDB_Address = "C:\example.mdb" 

    TaskID = Shell("msaccess.exe " & Chr(34) & MDB_Address & Chr(34), vbHide) 
    Call Wait 
    Set ObjAccess = GetObject(MDB_Address) 
    ObjAccess.DoCmd.Rename "NewTableName", 0, "OldTableName" 
    ObjAccess.Quit 
    Set ObjAccess = Nothing 

End Sub 

Sub Wait() 

    Dim nHour As Date, nMinute As Date, nSecond As Date, waitTime As Date 

    nHour = Hour(Now()) 
    nMinute = Minute(Now()) 
    nSecond = Second(Now()) + 5 
    waitTime = TimeSerial(nHour, nMinute, nSecond) 
    Application.Wait waitTime 

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