excel-vba
कार्यपुस्तिकाएं
खोज…
अनुप्रयोग कार्यपुस्तिकाएँ
कई एक्सेल अनुप्रयोगों में, वीबीए कोड कार्यपुस्तिका पर निर्देशित कार्रवाई करता है जिसमें यह निहित है। आप ".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