खोज…


अनुप्रयोग कार्यपुस्तिकाएँ

कई एक्सेल अनुप्रयोगों में, वीबीए कोड कार्यपुस्तिका पर निर्देशित कार्रवाई करता है जिसमें यह निहित है। आप ".xlsm" एक्सटेंशन के साथ उस कार्यपुस्तिका को सहेजते हैं और VBA मैक्रोज़ केवल वर्कशीट और डेटा पर ध्यान केंद्रित करते हैं। हालांकि, अक्सर ऐसे समय होते हैं जब आपको अन्य कार्यपुस्तिकाओं से डेटा को संयोजित करने या मर्ज करने की आवश्यकता होती है, या अपने कुछ डेटा को एक अलग कार्यपुस्तिका में लिखते हैं। अन्य VBA अनुप्रयोगों के लिए अन्य कार्यपुस्तिकाओं को खोलना, बंद करना, सहेजना, बनाना और हटाना एक सामान्य आवश्यकता है।

VBA संपादक में किसी भी समय, आप किसी भी और सभी कार्यपुस्तिका को देख सकते हैं और वर्तमान में Application ऑब्जेक्ट की Workbooks गुण का उपयोग करके Excel के उस उदाहरण द्वारा खोल सकते हैं। MSDN दस्तावेज़ीकरण इसे संदर्भों के साथ समझाता है।

ActiveWorkbook और ThisWorkbook का उपयोग कब करें

यह VBA बेस्ट प्रैक्टिस हमेशा यह निर्दिष्ट करने के लिए है कि आपका VBA कोड किस वर्कबुक को संदर्भित करता है। यदि इस विनिर्देश को छोड़ दिया जाता है, तो VBA मानता है कि कोड वर्तमान में सक्रिय कार्यपुस्तिका ( ActiveWorkbook ) पर निर्देशित है।

'--- the currently active workbook (and worksheet) is implied
Range("A1").value = 3.1415
Cells(1, 1).value = 3.1415

हालाँकि, जब एक ही समय में कई कार्यपुस्तिकाएँ खुली हों - विशेष रूप से और विशेषकर तब जब VBA कोड Excel ऐड-इन से चल रहा हो - ActiveWorkbook संदर्भ भ्रमित या गलत हो सकते हैं। उदाहरण के लिए, यूडीएफ के साथ एक ऐड-इन जो दिन के समय की जांच करता है और इसकी तुलना एड-इन वर्कशीट में से एक पर संग्रहीत मान से करता है (जो आमतौर पर उपयोगकर्ता को आसानी से दिखाई नहीं देता है) को स्पष्ट रूप से यह पता लगाना होगा कि कौन सी वर्कबुक है संदर्भित किया जा रहा है। हमारे उदाहरण में, हमारी खुली (और सक्रिय) कार्यपुस्तिका का कक्ष A1 =EarlyOrLate() में एक सूत्र है और उस सक्रिय कार्यपुस्तिका के लिए कोई VBA लिखित नहीं है। हमारे ऐड-इन में, हमारे पास निम्नलिखित उपयोगकर्ता परिभाषित फ़ंक्शन (UDF) हैं:

Public Function EarlyOrLate() As String
    If Hour(Now) > ThisWorkbook.Sheets("WatchTime").Range("A1") Then
        EarlyOrLate = "It's Late!"
    Else
        EarlyOrLate = "It's Early!"
    End If
End Function

यूडीएफ के लिए कोड स्थापित एक्सेल ऐड-इन में लिखा और संग्रहीत किया जाता है। यह ऐड-इन नामक "वॉचटाइम" में एक वर्कशीट पर संग्रहीत डेटा का उपयोग करता है। यदि UDF ने ThisWorkbook बजाय ActiveWorkbook का उपयोग किया था, तो यह कभी भी गारंटी नहीं दे पाएगी कि कौन सी कार्यपुस्तिका का उद्देश्य था।

ओपनिंग ए (न्यू) वर्कबुक, इफ इफ इट ऑलरेडी ओपन

यदि आप पहले से खुली हुई किसी कार्यपुस्तिका को एक्सेस करना चाहते हैं, तो Workbooks संग्रह से असाइनमेंट प्राप्त करना सीधा है:

dim myWB as Workbook
Set myWB = Workbooks("UsuallyFullPathnameOfWorkbook.xlsx")

यदि आप एक नई कार्यपुस्तिका बनाना चाहते हैं, तो नई प्रविष्टि Add लिए Workbooks संग्रह ऑब्जेक्ट का उपयोग करें।

Dim myNewWB as Workbook
Set myNewWB = Workbooks.Add

ऐसे समय होते हैं जब आप कार्यपुस्तिका को पहले से ही खोल सकते हैं या नहीं, या संभव नहीं है या संभव नहीं है (या देखभाल)। उदाहरण फ़ंक्शन दिखाता है कि हमेशा एक मान्य कार्यपुस्तिका ऑब्जेक्ट कैसे लौटाएं।

Option Explicit
Function GetWorkbook(ByVal wbFilename As String) As Workbook
    '--- returns a workbook object for the given filename, including checks
    '    for when the workbook is already open, exists but not open, or
    '    does not yet exist (and must be created)
    '    ***  wbFilename must be a fully specified pathname
    Dim folderFile As String
    Dim returnedWB As Workbook
    
    '--- check if the file exists in the directory location
    folderFile = File(wbFilename)
    If folderFile = "" Then
        '--- the workbook doesn't exist, so create it
        Dim pos1 As Integer
        Dim fileExt As String
        Dim fileFormatNum As Long
        '--- in order to save the workbook correctly, we need to infer which workbook
        '    type the user intended from the file extension
        pos1 = InStrRev(sFullName, ".", , vbTextCompare)
        fileExt = Right(sFullName, Len(sFullName) - pos1)
        Select Case fileExt
            Case "xlsx"
                fileFormatNum = 51
            Case "xlsm"
                fileFormatNum = 52
            Case "xls"
                fileFormatNum = 56
            Case "xlsb"
                fileFormatNum = 50
            Case Else
                Err.Raise vbObjectError + 1000, "GetWorkbook function", _
                         "The file type you've requested (file extension) is not recognized. " & _
                         "Please use a known extension: xlsx, xlsm, xls, or xlsb."
        End Select
        Set returnedWB = Workbooks.Add
        Application.DisplayAlerts = False
        returnedWB.SaveAs filename:=wbFilename, FileFormat:=fileFormatNum
        Application.DisplayAlerts = True
        Set GetWorkbook = returnedWB
    Else
        '--- the workbook exists in the directory, so check to see if
        '    it's already open or not
        On Error Resume Next
        Set returnedWB = Workbooks(sFile)
        If returnedWB Is Nothing Then
            Set returnedWB = Workbooks.Open(sFullName)
        End If
    End If
End Function

उपयोगकर्ता से पूछे बिना एक कार्यपुस्तिका सहेजना

VBA का उपयोग करके किसी मौजूदा कार्यपुस्तिका में अक्सर नए डेटा को सहेजने से पॉप-अप प्रश्न पर ध्यान देने का कारण होगा कि फ़ाइल पहले से मौजूद है।

इस पॉप-अप प्रश्न को रोकने के लिए, आपको इस प्रकार के अलर्ट को दबाना होगा।

Application.DisplayAlerts = False        'disable user prompt to overwrite file
myWB.SaveAs FileName:="NewOrExistingFilename.xlsx"
Application.DisplayAlerts = True         're-enable user prompt to overwrite file

नई कार्यपुस्तिका में कार्यपत्रकों की डिफ़ॉल्ट संख्या को बदलना

नई Excel कार्यपुस्तिका में बनाई गई कार्यपत्रकों की "फ़ैक्ट्री डिफ़ॉल्ट" संख्या आम तौर पर तीन पर सेट होती है। आपका VBA कोड स्पष्ट रूप से एक नई कार्यपुस्तिका में वर्कशीट की संख्या निर्धारित कर सकता है।

'--- save the current Excel global setting
With Application
    Dim oldSheetsCount As Integer
    oldSheetsCount = .SheetsInNewWorkbook
    Dim myNewWB As Workbook
    .SheetsInNewWorkbook = 1
    Set myNewWB = .Workbooks.Add
    '--- restore the previous setting
    .SheetsInNewWorkbook = oldsheetcount
End With


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow