excel-vba
एक्सेल VBA टिप्स एंड ट्रिक्स
खोज…
टिप्पणियों
इस विषय में कोडिंग में अपने अनुभव के माध्यम से एसओ उपयोगकर्ताओं द्वारा खोजी गई उपयोगी टिप्स और ट्रिक्स की एक विस्तृत विविधता शामिल है। ये अक्सर आम कुंठाओं को कम करने के तरीकों के उदाहरण हैं या एक्सेल का अधिक "चतुर" तरीके से उपयोग करने के तरीके।
XlVeryHidden शीट्स का उपयोग करना
एक्सेल में वर्कशीट में Visible
प्रॉपर्टी के तीन विकल्प हैं। इन विकल्पों को xlSheetVisibility
गणन में स्थिरांक द्वारा दर्शाया जाता है और निम्नानुसार हैं:
-
xlVisible
याxlSheetVisible
मान:-1
(नई शीट के लिए डिफ़ॉल्ट) -
xlHidden
याxlSheetHidden
मान:0
-
xlVeryHidden
xlSheetVeryHidden
मान:2
दृश्यमान चादरें चादरों के लिए डिफ़ॉल्ट दृश्यता का प्रतिनिधित्व करती हैं। वे शीट टैब बार में दिखाई देते हैं और स्वतंत्र रूप से चयनित और देखे जा सकते हैं। छिपी हुई चादरें शीट टैब बार से छिपी होती हैं और इस प्रकार चयन करने योग्य नहीं होती हैं। हालाँकि, शीट टैब्स पर राइट क्लिक करके और "अनहाइड" का चयन करके एक्सेल विंडो से छिपी हुई शीट को अनहेल्दी किया जा सकता है।
दूसरी ओर, बहुत ही छिपी हुई चादरें, केवल विज़ुअल बेसिक एडिटर के माध्यम से सुलभ हैं। यह उन्हें एक्सेल के उदाहरणों के साथ-साथ डेटा संग्रहीत करने के लिए एक अविश्वसनीय रूप से उपयोगी उपकरण बनाता है और साथ ही उन डेटा को संग्रहीत करता है जिन्हें अंत उपयोगकर्ताओं से छिपाया जाना चाहिए। शीट्स को VBA कोड के भीतर नामांकित संदर्भ द्वारा एक्सेस किया जा सकता है, जिससे संग्रहीत डेटा का आसानी से उपयोग किया जा सकता है।
किसी वर्कशीट की मैन्युअल रूप से बदलने के लिए। VlSheetVeryHidden के लिए अदृश्य संपत्ति, VBE के गुण विंडो ( F4 ) खोलें, उस वर्कशीट का चयन करें जिसे आप बदलना चाहते हैं और अपना चयन करने के लिए तेरहवीं पंक्ति में ड्रॉप-डाउन का उपयोग करें।
किसी वर्कशीट की .V property को xlSheetVeryHidden¹ में कोड में बदलने के लिए, इसी तरह से .Virect प्रॉपर्टी को एक्सेस करें और एक नया मान असाइन करें।
with Sheet3
.Visible = xlSheetVeryHidden
end with
S दोनों xlVeryHidden और xlSheetVeryHidden ने 2 का संख्यात्मक मान लौटाया (वे परस्पर विनिमय योग्य हैं)।
वर्कशीट .Name, .Index या orCodeName
हम जानते हैं कि 'सर्वोत्तम अभ्यास' यह निर्धारित करता है कि एक रेंज ऑब्जेक्ट में इसकी मूल कार्यपत्रक स्पष्ट रूप से संदर्भित होनी चाहिए। वर्कशीट को इसके द्वारा निर्दिष्ट किया जा सकता है। नाम संपत्ति, संख्यात्मक .भारत संपत्ति या इसकी। कोड नाम संपत्ति लेकिन एक उपयोगकर्ता केवल एक नाम टैब खींचकर वर्कशीट कतार को फिर से चालू कर सकता है या उसी टैब पर डबल क्लिक के साथ वर्कशीट का नाम बदल सकता है और कुछ एक असुरक्षित कार्यपुस्तिका में टाइपिंग।
मानक तीन कार्यपत्रक पर विचार करें। आपने उस क्रम में सोमवार, मंगलवार और बुधवार को तीन कार्यपत्रकों का नाम बदला है और इनका संदर्भ देने वाली VBA उप प्रक्रियाओं को कोडित किया है। अब विचार करें कि एक उपयोगकर्ता साथ आता है और फैसला करता है कि सोमवार कार्यपत्रक कतार के अंत में आता है तो दूसरा साथ आता है और फैसला करता है कि फ्रांसीसी में कार्यपत्रक के नाम बेहतर दिखते हैं। अब आपके पास एक वर्कशीट है जिसमें एक वर्कशीट नाम टैब क्यू है जो निम्न की तरह दिखता है।
यदि आपने निम्नलिखित कार्यपत्रक संदर्भ विधियों में से किसी एक का उपयोग किया है, तो आपका कोड अब टूट जाएगा।
'reference worksheet by .Name
with worksheets("Monday")
'operation code here; for example:
.Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp)) = 1
end with
'reference worksheet by ordinal .Index
with worksheets(1)
'operation code here; for example:
.Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp)) = 1
end with
मूल आदेश और मूल कार्यपत्रक नाम दोनों में समझौता किया गया है। हालाँकि, यदि आपने वर्कशीट की .CodeName संपत्ति का उपयोग किया है, तो आपकी उप प्रक्रिया अभी भी चालू होगी
with Sheet1
'operation code here; for example:
.Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp)) = 1
end with
निम्न छवि VBA प्रोजेक्ट विंडो ([Ctrl] + R) को दिखाती है जो कि वर्कशीट को .CodeName और उसके बाद .Name (कोष्ठक में) सूचीबद्ध करती है। उनके द्वारा दिखाए जाने वाले क्रम में परिवर्तन नहीं होता है; ordinal .Index को उस क्रम से लिया जाता है, जिसे वे वर्कशीट विंडो में नाम टैब कतार में प्रदर्शित करते हैं।
हालांकि एक .CodeName का नाम बदलना असामान्य है, लेकिन यह असंभव नहीं है। बस VBE के गुण विंडो ([F4]) खोलें।
वर्कशीट .CodeName पहली पंक्ति में है। वर्कशीट की .Name दसवीं में है। दोनों ही संपादन योग्य हैं।
डायनामिक के साथ स्ट्रिंग्स का उपयोग डायनेमिक एरर्स के स्थान पर करें
VBA में डायनामिक एरे का उपयोग करना बहुत बड़े डेटा सेटों पर काफी क्लूनी और समय गहन हो सकता है। जब डायनेमिक ऐरे (स्ट्रिंग्स, नंबर, बुलियन आदि) में सरल डेटा प्रकारों को संग्रहीत करते हैं, तो कोई कुछ चतुर स्ट्रिंग प्रक्रियाओं के साथ Split()
फ़ंक्शन का उपयोग करके VBA में डायनेमिक सरणियों के लिए आवश्यक ReDim Preserve
बयानों से बच सकता है। उदाहरण के लिए, हम एक लूप को देखेंगे जो कुछ स्थितियों के आधार पर रेंज से स्ट्रिंग तक मानों की एक श्रृंखला जोड़ता है, फिर एक लिस्टबॉक्स के मान को पॉप्युलेट करने के लिए उस स्ट्रिंग का उपयोग करता है।
Private Sub UserForm_Initialize()
Dim Count As Long, DataString As String, Delimiter As String
For Count = 1 To ActiveSheet.UsedRows.Count
If ActiveSheet.Range("A" & Count).Value <> "Your Condition" Then
RowString = RowString & Delimiter & ActiveSheet.Range("A" & Count).Value
Delimiter = "><" 'By setting the delimiter here in the loop, you prevent an extra occurance of the delimiter within the string
End If
Next Count
ListBox1.List = Split(DataString, Delimiter)
End Sub
Delimiter
स्ट्रिंग को ही किसी भी मूल्य पर सेट किया जा सकता है, लेकिन मूल्य का चयन करना समझदारी है जो स्वाभाविक रूप से सेट के भीतर नहीं होगा। उदाहरण के लिए, आप तारीखों के एक कॉलम को संसाधित कर रहे थे। उस मामले में, का उपयोग कर .
, -
, या /
रूप में, सीमांकक के रूप में नासमझी होगी, क्योंकि इनमें से किसी भी एक का उपयोग करने के लिए तिथियों को स्वरूपित किया जा सकता है, जिससे आप अनुमान से अधिक डेटा अंक उत्पन्न कर सकते हैं।
नोट: इस विधि का उपयोग करने की सीमाएँ हैं (अर्थात् स्ट्रिंग्स की अधिकतम लंबाई), इसलिए इसका उपयोग बहुत बड़े डेटासेट के मामलों में सावधानी के साथ किया जाना चाहिए। यह VBA में गतिशील सरणियों को बनाने के लिए सबसे तेज़ या सबसे प्रभावी तरीका नहीं है, लेकिन यह एक व्यवहार्य विकल्प है।
एक्सेल आकार के लिए डबल क्लिक करें घटना
डिफ़ॉल्ट रूप से, एक्सेल में आकृतियों के पास एकल बनाम दोहरे क्लिक को संभालने का एक विशिष्ट तरीका नहीं है, जिसमें केवल "ओनएक्शन" संपत्ति होती है, जिससे आपको क्लिकों को संभालने की अनुमति मिलती है। हालाँकि, ऐसे उदाहरण भी हो सकते हैं, जहाँ आपके कोड को आपको एक डबल क्लिक पर अलग तरह से (या विशेष रूप से) कार्य करने की आवश्यकता होती है। निम्नलिखित सबरूटीन को आपके VBA प्रोजेक्ट में जोड़ा जा सकता है और, जब आपके आकार के लिए OnAction
दिनचर्या के रूप में सेट किया जाता है, तो आप डबल क्लिक पर कार्य कर सकते हैं।
Public Const DOUBLECLICK_WAIT as Double = 0.25 'Modify to adjust click delay
Public LastClickObj As String, LastClickTime As Date
Sub ShapeDoubleClick()
If LastClickObj = "" Then
LastClickObj = Application.Caller
LastClickTime = CDbl(Timer)
Else
If CDbl(Timer) - LastClickTime > DOUBLECLICK_WAIT Then
LastClickObj = Application.Caller
LastClickTime = CDbl(Timer)
Else
If LastClickObj = Application.Caller Then
'Your desired Double Click code here
LastClickObj = ""
Else
LastClickObj = Application.Caller
LastClickTime = CDbl(Timer)
End If
End If
End If
End Sub
यह नियमित रूप से आकार को पहले क्लिक को कार्यात्मक रूप से अनदेखा करने का कारण होगा, केवल निर्दिष्ट समय अवधि के भीतर दूसरे क्लिक पर अपना वांछित कोड चला रहा है।
ओपन फाइल डायलॉग - मल्टीपल फाइल्स
यह सबरूटीन एक त्वरित उदाहरण है कि कैसे एक उपयोगकर्ता को कई फ़ाइलों का चयन करने की अनुमति दी जाती है और फिर उन फ़ाइल पथों के साथ कुछ किया जाता है, जैसे फ़ाइल नाम प्राप्त करें और इसे डीबग.प्रिंट के माध्यम से कंसोल पर भेजें।
Option Explicit
Sub OpenMultipleFiles()
Dim fd As FileDialog
Dim fileChosen As Integer
Dim i As Integer
Dim basename As String
Dim fso As Variant
Set fso = CreateObject("Scripting.FileSystemObject")
Set fd = Application.FileDialog(msoFileDialogFilePicker)
basename = fso.getBaseName(ActiveWorkbook.Name)
fd.InitialFileName = ActiveWorkbook.Path ' Set Default Location to the Active Workbook Path
fd.InitialView = msoFileDialogViewList
fd.AllowMultiSelect = True
fileChosen = fd.Show
If fileChosen = -1 Then
'open each of the files chosen
For i = 1 To fd.SelectedItems.Count
Debug.Print (fd.SelectedItems(i))
Dim fileName As String
' do something with the files.
fileName = fso.getFileName(fd.SelectedItems(i))
Debug.Print (fileName)
Next i
End If
End Sub