Excel VBA में Select का उपयोग करने से कैसे बचें


537

मैंने .Selectएक्सेल वीबीए में उपयोग करने के समझने योग्य घृणा के बारे में बहुत कुछ सुना है , लेकिन इसका उपयोग करने से बचने के तरीके के बारे में अनिश्चित हूं। मुझे पता चल रहा है कि अगर मैं Selectफ़ंक्शन के बजाय चर का उपयोग करने में सक्षम था, तो मेरा कोड अधिक पुन: प्रयोज्य होगा । हालांकि, मुझे यकीन नहीं है कि चीजों का संदर्भ कैसे लें (जैसे ActiveCellआदि) अगर उपयोग नहीं कर रहे हैं Select

मैंने इस लेख को श्रेणियों पर और इस उदाहरण को चुनिंदा उपयोग न करने के लाभों पर पाया है, लेकिन कुछ भी कैसे नहीं मिल सकता है ?


14
यह ध्यान रखना महत्वपूर्ण है कि उपयोग करते समय ऐसे उदाहरण हैं Selectऔर / या ActiveSheetआदि पूरी तरह से अपरिहार्य हैं। यहाँ एक उदाहरण है जो मैंने पाया: stackoverflow.com/questions/22796286/…
रिक ने मोनिका का समर्थन किया

9
और ऐसे मौके हैं - एक अंतर्निहित एक्सेल फाइल के साथ पीपीटी में चार्ट डेटा को संपादित करना एक है - जहां सक्रिय या चयन की आवश्यकता होती है।
brettdj

@brettdj - यहाँ एक हालिया उदाहरण है । किसी कार्यपुस्तिका में सभी पत्रक को समान मान पर सेट करने के लिए, यह .Select / .Selectionआवश्यक है।
ब्रूसवेने

जवाबों:


565

चयन से बचने के कुछ उदाहरण

Dim'D वैरिएबल का उपयोग करें

Dim rng as Range

Setआवश्यक रेंज के लिए चर। एकल-कक्ष श्रेणी को संदर्भित करने के कई तरीके हैं

Set rng = Range("A1")
Set rng = Cells(1,1)
Set rng = Range("NamedRange")

या एक मल्टी-सेल रेंज

Set rng = Range("A1:B10")
Set rng = Range("A1", "B10")
Set rng = Range(Cells(1,1), Cells(10,2))
Set rng = Range("AnotherNamedRange")
Set rng = Range("A1").Resize(10,2)

आप शॉर्टकट को विधि का उपयोग कर सकते हैं Evaluate, लेकिन यह कम कुशल है और आमतौर पर उत्पादन कोड से बचा जाना चाहिए।

Set rng = [A1]
Set rng = [A1:B10]

उपरोक्त सभी उदाहरण सक्रिय शीट पर कोशिकाओं को संदर्भित करते हैं । जब तक आप विशेष रूप से केवल सक्रिय शीट के साथ काम करना चाहते हैं, तब तक एक Worksheetचर को भी डिम करना बेहतर है

Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
Set rng = ws.Cells(1,1)
With ws
    Set rng = .Range(.Cells(1,1), .Cells(2,10))
End With

यदि आप स्पष्टता के साथ काम करना चाहते हैं ActiveSheet, तो स्पष्ट होना सबसे अच्छा है। लेकिन ध्यान रखना, क्योंकि कुछ Worksheetतरीके सक्रिय शीट को बदलते हैं।

Set rng = ActiveSheet.Range("A1")

फिर, यह सक्रिय कार्यपुस्तिका को संदर्भित करता है । जब तक आप विशेष रूप से ActiveWorkbookया के साथ ही काम करना चाहते हैं, तब तक ThisWorkbookएक Workbookचर को भी डिम करना बेहतर है।

Dim wb As Workbook
Set wb = Application.Workbooks("Book1")
Set rng = wb.Worksheets("Sheet1").Range("A1")

यदि आप स्पष्टता के साथ काम करना चाहते हैं ActiveWorkbook, तो स्पष्ट होना सबसे अच्छा है। लेकिन ध्यान रखना, क्योंकि कई WorkBookतरीके सक्रिय पुस्तक को बदलते हैं।

Set rng = ActiveWorkbook.Worksheets("Sheet1").Range("A1")

आप ThisWorkbookचल रहे कोड वाली पुस्तक को संदर्भित करने के लिए ऑब्जेक्ट का उपयोग भी कर सकते हैं ।

Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")

कोड का एक सामान्य (खराब) टुकड़ा एक किताब खोलना, कुछ डेटा प्राप्त करना और फिर बंद करना है

ये गलत है:

Sub foo()
    Dim v as Variant
    Workbooks("Book1.xlsx").Sheets(1).Range("A1").Clear
    Workbooks.Open("C:\Path\To\SomeClosedBook.xlsx")
    v = ActiveWorkbook.Sheets(1).Range("A1").Value
    Workbooks("SomeAlreadyOpenBook.xlsx").Activate
    ActiveWorkbook.Sheets("SomeSheet").Range("A1").Value = v
    Workbooks(2).Activate
    ActiveWorkbook.Close()
End Sub

और बेहतर होगा:

Sub foo()
    Dim v as Variant
    Dim wb1 as Workbook
    Dim  wb2 as Workbook
    Set wb1 = Workbooks("SomeAlreadyOpenBook.xlsx")
    Set wb2 = Workbooks.Open("C:\Path\To\SomeClosedBook.xlsx")
    v = wb2.Sheets("SomeSheet").Range("A1").Value
    wb1.Sheets("SomeOtherSheet").Range("A1").Value = v
    wb2.Close()
End Sub

रेंज चर के रूप में अपने Subएस और Functionएस के लिए सीमाएं पास करें

Sub ClearRange(r as Range)
    r.ClearContents
    '....
End Sub

Sub MyMacro()
    Dim rng as Range
    Set rng = ThisWorkbook.Worksheets("SomeSheet").Range("A1:B10")
    ClearRange rng
End Sub

आपको चर (जैसे ) Findऔर विधियों को भी Copyचर पर लागू करना चाहिए

Dim rng1 As Range
Dim rng2 As Range
Set rng1 = ThisWorkbook.Worksheets("SomeSheet").Range("A1:A10")
Set rng2 = ThisWorkbook.Worksheets("SomeSheet").Range("B1:B10")
rng1.Copy rng2

यदि आप कक्षों की एक सीमा पर लूपिंग कर रहे हैं तो रेंज वैल्यू को कॉपी करने के लिए वेरिएंट एरे को पहले और बेहतर तरीके से कॉपी करना बेहतर (तेज) है।

Dim dat As Variant
Dim rng As Range
Dim i As Long

Set rng = ThisWorkbook.Worksheets("SomeSheet").Range("A1:A10000")
dat = rng.Value  ' dat is now array (1 to 10000, 1 to 1)
for i = LBound(dat, 1) to UBound(dat, 1)
    dat(i,1) = dat(i,1) * 10 'or whatever operation you need to perform
next
rng.Value = dat ' put new values back on sheet

यह संभव है के लिए एक छोटी सी कसाव है।


7
इस शानदार जवाब में जोड़ते हुए कि एक सीमा को काम करने के लिए आपको उसके वास्तविक आकार को जानने की आवश्यकता नहीं है जब तक आप शीर्ष बाएं को जानते हैं ... जैसे rng1(12, 12)कि काम करेगा हालांकि rng1 [A1:A10]केवल सेट किया गया था ।
माइक डी

3
@chrisneilsen क्रिस, मेरा मानना ​​है कि आप शॉर्टहैंड सेल संदर्भ संकेतन से पहले वर्कशीट उपसर्ग का उपयोग कर सकते हैं ताकि आपको Rangeइस तरह से टाइप करने से बचाया जा सके : ActiveSheet.[a1:a4]या ws.[b6]
लोगान रीड

3
@AndrewWillems ... या इस पोस्ट में 48 बार, लेकिन किसकी गिनती है। ☺ ... लेकिन गंभीरता से, वस्तुओं को रखने वाले चर के साथ काम करना भूल जाना आसान है। एक variantचर की आवश्यकता नहीं है Set जब तक आप इसे एक वस्तु निर्दिष्ट नहीं करते हैं। उदाहरण के लिए, Dim x: x = 1ठीक है, लेकिन Dim x: x = Sheets("Sheet1")त्रुटि 438 उत्पन्न करेगा। हालांकि, भ्रमित / स्पष्ट करने के लिए केवल एक त्रुटि पैदा नहींDim x: x = Range("A1") होगी । क्यों? ... क्योंकि यह चर के लिए वस्तु के मूल्य को निर्दिष्ट करता है , कि स्वयं वस्तु का संदर्भ (क्योंकि यह इसके बराबर है )Dim x: x = Range("A1").Value
ashleedawg

1
@ user3932000 मुझे ऐसे परिदृश्य के बारे में पता नहीं है जहाँ शीट नाम अपने आप बदल जाते हैं। फ़ाइल नाम के लिए, यह केवल तभी होगा जब फ़ोल्डर में उस नाम की कोई फ़ाइल पहले से मौजूद हो। बस इसे स्ट्रिंग के रूप में सहेजने के लिए फ़ाइल नाम या हार्ड कोड ... का उपयोग करें। यदि आप इस समस्या को हल नहीं कर सकते हैं, तो आपको टिप्पणी करने के बजाय इसके बारे में एक अलग प्रश्न पूछना चाहिए।
टायलरएच

1
@ user3932000 कि एक दिलचस्प प्रश्न: मैं कर रहा हूँ यकीन है कि वहाँ इसे संभाल करने के लिए तरीके हैं बनाना होगा .. आप इतने लंबे समय के लिए पर्याप्त एक पुराने क्यू पर एक टिप्पणी धागा अपहरण को पता है पर किया गया है जाने के लिए रास्ता नहीं है
क्रिस Neilsen

212

दो मुख्य कारण .Select/ .Activate/ Selection/ Activecell/ Activesheet/ Activeworkbookआदि ... से बचा जाना चाहिए

  1. यह आपके कोड को धीमा कर देता है।
  2. यह आमतौर पर रनटाइम त्रुटियों का मुख्य कारण है।

हम इससे कैसे बचें?

1) प्रासंगिक वस्तुओं के साथ सीधे काम करते हैं

इस कोड पर विचार करें

Sheets("Sheet1").Activate
Range("A1").Select
Selection.Value = "Blah"
Selection.NumberFormat = "@"

इस कोड को भी लिखा जा सकता है

With Sheets("Sheet1").Range("A1")
    .Value = "Blah"
    .NumberFormat = "@"
End With

2) यदि आवश्यक हो तो अपने चर घोषित करें। ऊपर जैसा कोड लिखा जा सकता है

Dim ws as worksheet

Set ws = Sheets("Sheet1")

With ws.Range("A1")
    .Value = "Blah"
    .NumberFormat = "@"
End With

17
यह एक अच्छा जवाब है, लेकिन इस विषय पर मुझे जो याद आ रहा है वह तब है जब हमें वास्तव में सक्रिय होने की आवश्यकता है। हर कोई कहता है कि यह बुरा है, लेकिन कोई भी ऐसे मामलों की व्याख्या नहीं करता है जहां इसका उपयोग करने के लिए समझ में आता है। उदाहरण के लिए मैं 2 कार्यपुस्तिकाओं के साथ काम कर रहा था और पहले इसे सक्रिय किए बिना किसी एक कार्यपुस्तिका पर मैक्रो प्रारंभ नहीं कर सकता था। क्या आप शायद थोड़ा विस्तार कर सकते हैं? उदाहरण के लिए अगर मैं एक शीट से दूसरी शीट की सीमा को कॉपी करते समय शीट को सक्रिय नहीं करता हूं, जब मैं प्रोग्राम को निष्पादित करता हूं, तो यह संबंधित शीट को वैसे भी, सक्रिय रूप से सक्रिय करता है।
user3032689

1
मुझे लगता है कि आपको कभी-कभी एक शीट को सक्रिय करने की आवश्यकता हो सकती है यदि आपको उस पर डेटा पेस्ट या फ़िल्टर करने की आवश्यकता है। मैं कहूंगा कि जितना संभव हो उतना सक्रिय होने से बचें, लेकिन ऐसे उदाहरण हैं जहां आपको इसे करने की आवश्यकता है। इसलिए ऊपर दिए गए उत्तर के अनुसार सक्रिय रहना और निरपेक्ष न्यूनतम का चयन करना।
निक

7
मुझे लगता है कि बिंदु का पूरी तरह से उपयोग करने से बचना नहीं है, लेकिन जितना संभव हो सके। यदि आप कोई कार्यपुस्तिका सहेजना चाहते हैं, ताकि जब कोई इसे खोले तो एक निश्चित पत्रक में एक निश्चित कक्ष चयनित हो, तो आपको उस पत्रक और कक्ष का चयन करना होगा। कॉपी / पेस्ट एक खराब उदाहरण है, कम से कम मूल्यों के मामले में, यह एक कोड द्वारा तेजी से किया जा सकता है जैसेSheets(2).[C10:D12].Value = Sheets(1).[A1:B3].Value
रोबॉटिक

1
@ क्लिक करें आपको उन्हें पेस्ट करने या उन्हें फ़िल्टर करने के लिए शीट को सक्रिय करने की आवश्यकता नहीं है। अपने पेस्ट या फ़िल्टर कमांड में शीट ऑब्जेक्ट का उपयोग करें। यह आसान हो जाता है क्योंकि आप अभ्यास के माध्यम से एक्सेल ऑब्जेक्ट मॉडल सीखते हैं। मेरा मानना ​​है कि मैं केवल उसी समय का उपयोग करता हूं। सक्रिय करें जब मैं एक नई शीट बनाता हूं, लेकिन मैं चाहता हूं कि जब कोड किया जाए तो मूल शीट दिखाई दे।
phrebh

3
@phrebh आपको .Activateमूल शीट पर जाने के लिए उपयोग करने की आवश्यकता नहीं है , बस उपयोग करेंApplication.Goto
GMalc

88

जोर का एक छोटा बिंदु मैं ऊपर दिए गए सभी उत्कृष्ट उत्तरों को जोड़ूंगा:

संभवतः आप सेलेक्ट का उपयोग करने से बचने के लिए सबसे बड़ी बात यह है कि अपने VBA कोड में नामित श्रेणियों (सार्थक परिवर्तनीय नामों के साथ संयुक्त) का उपयोग करें । इस बिंदु का उल्लेख ऊपर किया गया था, लेकिन थोड़ा सा चमक गया; हालाँकि, यह विशेष ध्यान देने योग्य है।

हालांकि नामांकित श्रेणियों का उदार उपयोग करने के लिए कुछ अतिरिक्त कारण हैं, हालांकि मुझे यकीन है कि मैं अधिक सोच सकता था।

नामित श्रेणियां आपके कोड को पढ़ने और समझने में आसान बनाती हैं।

उदाहरण:

Dim Months As Range
Dim MonthlySales As Range

Set Months = Range("Months")
'e.g, "Months" might be a named range referring to A1:A12

Set MonthlySales = Range("MonthlySales")
'e.g, "Monthly Sales" might be a named range referring to B1:B12

Dim Month As Range
For Each Month in Months
    Debug.Print MonthlySales(Month.Row)
Next Month

यह बहुत स्पष्ट है कि नामित पर्वतमालाएँ Monthsऔर MonthlySalesसमाहित हैं, और प्रक्रिया क्या कर रही है।

यह महत्वपूर्ण क्यों है? आंशिक रूप से क्योंकि अन्य लोगों के लिए इसे समझना आसान है, लेकिन फिर भी यदि आप एकमात्र व्यक्ति हैं जो कभी भी आपके कोड को देखेगा या उपयोग करेगा, तो आपको अभी भी नामित श्रेणियों और अच्छे चर नामों का उपयोग करना चाहिए, क्योंकि आप इसका क्या मतलब निकालेंगे ? एक साल बाद, और आप अपना कोड क्या कर रहे हैं, यह पता लगाने में 30 मिनट बर्बाद करेंगे

नामांकित श्रेणियां यह सुनिश्चित करती हैं कि स्प्रेडशीट के कॉन्फ़िगरेशन में बदलाव होने पर आपका मैक्रोज़ नहीं तोड़ा जाए (यदि नहीं!)।

गौर करें, यदि उपरोक्त उदाहरण इस तरह लिखा गया था:

Dim rng1 As Range
Dim rng2 As Range

Set rng1 = Range("A1:A12")
Set rng2 = Range("B1:B12")

Dim rng3 As Range
For Each rng3 in rng1 
    Debug.Print rng2(rng3.Row)
Next rng3

यह कोड पहली बार में ठीक काम करेगा - जब तक कि आप या भविष्य का कोई उपयोगकर्ता "gee wiz" का फैसला नहीं करता, मुझे लगता है कि मैं कॉलम में वर्ष के साथ एक नया कॉलम जोड़ने जा रहा हूं A! ", या महीनों के बीच खर्च कॉलम डाल सकता है बिक्री कॉलम, या प्रत्येक कॉलम में हेडर जोड़ें। अब, आपका कोड टूट गया है। और क्योंकि आपने भयानक चर नामों का उपयोग किया है, इसलिए आपको यह पता लगाने में बहुत अधिक समय लगेगा कि इसे कैसे ठीक करना चाहिए।

यदि आपने शुरू करने के लिए नामित श्रेणियों का उपयोग किया था, Monthsऔर Salesकॉलम को आप की तरह चारों ओर ले जाया जा सकता है, और आपका कोड ठीक काम करना जारी रखेगा।


6
नामांकित सीमाएँ अच्छी हैं या खराब स्प्रेडशीट डिज़ाइन जारी है, इस बारे में बहस जारी है - मैं दृढ़ता से किसी शिविर में नहीं हूँ। मेरे अनुभव में वे त्रुटियां बढ़ाते हैं (मानक उपयोगकर्ताओं के लिए जिन्हें कोड की कोई आवश्यकता नहीं है)।
brettdj


12
मैं आपके विकास दर्शन से सहमत हूं; हालाँकि मुझे लगता है कि कागज बकवास है। यह इस बारे में बात करता है कि कैसे रेंज नाम उन नौसिखियों को भ्रमित कर सकते हैं जो स्प्रेडशीट को डिबगिंग कर रहे हैं, लेकिन जो कोई भी कॉम्प्लेक्स स्प्रेडशीट देखने के लिए नौसिखियों का उपयोग करता है, उसे वह मिलता है जिसके वे हकदार हैं! मैं एक फर्म के लिए काम करता था जिसने वित्तीय स्प्रेडशीट की समीक्षा की थी, और मैं आपको बता सकता हूं कि यह नौसिखिए को देने वाली नौकरी नहीं है।
डीनॉक

8
कोई सार्थक बहस नहीं है। जो कोई भी परिभाषित नामों के खिलाफ तर्क देता है, उसने अपने प्रभाव को पूरी तरह से समझने के लिए समय नहीं लिया है। नामांकित सूत्र एक्सेल के सभी में सबसे गहरा और उपयोगी निर्माण हो सकता है।
एक्सेल हीरो

10
@bretjj: आपका उद्धरण सही है, लेकिन आप यह उल्लेख करना भूल गए कि इसके बाद छह "छोड़कर ..." वाक्यांश हैं। उनमें से एक होने के नाते: " मैक्रो कोडिंग में सेल संदर्भों के विकल्प के रूप में छोड़कर हमेशा मैक्रो का निर्माण करते समय सेल संदर्भों के विकल्प के रूप में एक्सेल नामों का उपयोग करें। यह अतिरिक्त पंक्तियों या स्तंभों के सम्मिलन से उत्पन्न त्रुटियों से बचने के लिए है जिससे मैक्रो कोडिंग अब नहीं होती है। इच्छित स्रोत डेटा को इंगित करता है। "
मार्कस मैंगल्सडॉर्फ

47

मैं संक्षिप्त उत्तर देने जा रहा हूं क्योंकि बाकी सभी ने लंबा दिया।

जब भी आप मैक्रोज़ रिकॉर्ड करें और उनका पुनः उपयोग करें, आप .select और .activate प्राप्त करेंगे। जब आप किसी सेल या शीट को .select करते हैं तो यह इसे सक्रिय बनाता है। उस बिंदु से जब भी आप अयोग्य संदर्भों का Range.Valueउपयोग करते हैं, जैसे वे सक्रिय सेल और शीट का उपयोग करते हैं। यह समस्याग्रस्त हो सकता है यदि आप यह नहीं देखते हैं कि आपका कोड कहाँ रखा गया है या उपयोगकर्ता कार्यपुस्तिका पर क्लिक करता है।

तो, आप अपनी कोशिकाओं को सीधे संदर्भित करके इन मुद्दों को समाप्त कर सकते हैं। जो जाता है:

'create and set a range
Dim Rng As Excel.Range
Set Rng = Workbooks("Book1").Worksheets("Sheet1").Range("A1")
'OR
Set Rng = Workbooks(1).Worksheets(1).Cells(1, 1)

या आप कर सकते थे

'Just deal with the cell directly rather than creating a range
'I want to put the string "Hello" in Range A1 of sheet 1
Workbooks("Book1").Worksheets("Sheet1").Range("A1").value = "Hello"
'OR
Workbooks(1).Worksheets(1).Cells(1, 1).value = "Hello"

इन विधियों के विभिन्न संयोजन हैं, लेकिन यह मेरे जैसे अधीर लोगों के लिए जल्द से जल्द सामान्य विचार व्यक्त किया जाएगा।


33

"... और मुझे पता चल रहा है कि यदि मैं चुनिंदा कार्यों के बजाय चर का उपयोग करने में सक्षम था तो मेरा कोड अधिक पुन: प्रयोज्य होगा।"

हालांकि मैं किसी भी अलग-थलग स्थिति से अधिक के बारे में नहीं सोच .Selectसकता, जहां डायरेक्ट सेल रेफ़रिंग की तुलना में बेहतर विकल्प होगा, मैं बचाव की ओर बढ़ूंगा Selectionऔर यह बताऊंगा कि इसे उन्हीं कारणों से नहीं फेंका .Selectजाना चाहिए जिनसे बचा जाना चाहिए।

ऐसे समय होते हैं, जब समय की बचत करने वाले मैक्रो सब रूटीन को एक-दो कीज के टैप के साथ उपलब्ध हॉट-की कॉम्बिनेशन को सौंपा जाता है, इससे काफी समय की बचत होती है। कार्यशील-वाइड डेटा प्रारूप के अनुरूप नहीं होने वाले पॉकेट डेटा से निपटने पर कार्य कोड पर परिचालन कोड को लागू करने के लिए कोशिकाओं के एक समूह का चयन करने में सक्षम होने के नाते। बहुत कुछ इसी तरह से हो सकता है कि आप कोशिकाओं के एक समूह का चयन करें और एक प्रारूप परिवर्तन लागू करें, विशेष मैक्रो कोड चलाने के लिए कोशिकाओं के एक समूह का चयन करना एक प्रमुख समय बचाने वाला हो सकता है।

चयन-आधारित उप ढांचे के उदाहरण:

Public Sub Run_on_Selected()
    Dim rng As Range, rSEL As Range
    Set rSEL = Selection    'store the current selection in case it changes
    For Each rng In rSEL
        Debug.Print rng.Address(0, 0)
        'cell-by-cell operational code here
    Next rng
    Set rSEL = Nothing
End Sub

Public Sub Run_on_Selected_Visible()
    'this is better for selected ranges on filtered data or containing hidden rows/columns
    Dim rng As Range, rSEL As Range
    Set rSEL = Selection    'store the current selection in case it changes
    For Each rng In rSEL.SpecialCells(xlCellTypeVisible)
        Debug.Print rng.Address(0, 0)
        'cell-by-cell operational code here
    Next rng
    Set rSEL = Nothing
End Sub

Public Sub Run_on_Discontiguous_Area()
    'this is better for selected ranges of discontiguous areas
    Dim ara As Range, rng As Range, rSEL As Range
    Set rSEL = Selection    'store the current selection in case it changes
    For Each ara In rSEL.Areas
        Debug.Print ara.Address(0, 0)
        'cell group operational code here
        For Each rng In ara.Areas
            Debug.Print rng.Address(0, 0)
            'cell-by-cell operational code here
        Next rng
    Next ara
    Set rSEL = Nothing
End Sub

प्रक्रिया का वास्तविक कोड एक लाइन से कई मॉड्यूल तक कुछ भी हो सकता है। मैंने इस पद्धति का उपयोग बाहरी कार्यपुस्तिकाओं के फाइलनाम युक्त कोशिकाओं के एक रैग्ड चयन पर लंबे समय तक चलने वाली दिनचर्या शुरू करने के लिए किया है।

संक्षेप में, Selectionइसके साथ निकटता के कारण त्याग नहीं करते हैं .Selectऔर ActiveCell। वर्कशीट संपत्ति के रूप में इसके कई अन्य उद्देश्य हैं।

(हां, मुझे पता है कि यह सवाल था .Select, नहीं, Selectionलेकिन मैं किसी भी गलतफहमी को दूर करना चाहता था जो नौसिखिया वीबीए कोडर समझ सकता है।)


13
Selectionवर्कशीट में कुछ भी हो सकता है इसलिए किसी वस्तु को किसी वैरिएबल पर असाइन करने से पहले पहले उस प्रकार के परीक्षण कर लें क्योंकि आपने इसे स्पष्ट रूप से घोषित किया था Range
L42

29

कृपया ध्यान दें कि निम्नलिखित में मैं सेलेक्ट एप्रोच (एक कि ओपी बचना चाहता हूं) की तुलना रेंज अप्रोच के साथ कर रहा हूं (और यह सवाल का जवाब है)। इसलिए जब आप पहली बार चयन करें तो पढ़ना बंद न करें।

यह वास्तव में आप क्या करने की कोशिश कर रहे हैं पर निर्भर करता है। वैसे भी एक सरल उदाहरण उपयोगी हो सकता है। मान लीजिए कि आप सक्रिय सेल का मान "फू" पर सेट करना चाहते हैं। ActiveCell का उपयोग करके आप कुछ इस तरह से लिखेंगे:

Sub Macro1()
    ActiveCell.Value = "foo"
End Sub

यदि आप इसे एक सेल के लिए उपयोग करना चाहते हैं जो सक्रिय नहीं है, उदाहरण के लिए "बी 2" के लिए, आपको इसे पहले चुनना चाहिए, जैसे:

Sub Macro2()
    Range("B2").Select
    Macro1
End Sub

रंग का उपयोग करके आप एक अधिक सामान्य मैक्रो लिख सकते हैं जिसका उपयोग किसी भी सेल के मूल्य को सेट करने के लिए किया जा सकता है जिसे आप चाहते हैं:

Sub SetValue(cellAddress As String, aVal As Variant)
    Range(cellAddress).Value = aVal
End Sub

तो आप Macro2 को फिर से लिख सकते हैं:

Sub Macro2()
    SetCellValue "B2", "foo"
End Sub

और मैक्रो 1 इस प्रकार है:

Sub Macro1()
    SetValue ActiveCell.Address, "foo"
End Sub

आशा है कि यह चीजों को थोड़ा स्पष्ट करने में मदद करता है।


1
इतनी जल्दी उत्कृष्ट प्रतिक्रिया के लिए धन्यवाद। तो क्या इसका मतलब यह है कि अगर मैं आम तौर पर कोशिकाओं को रेंज में जोड़ने के लिए, रेंज का नाम, और इसके माध्यम से पुनरावृति करता हूं, तो मुझे एक सरणी बनाने के लिए सीधे कूदना चाहिए?
BiGXERO

मुझे यकीन नहीं है कि मैं समझ सकता हूं कि आपका क्या मतलब है, लेकिन आप एक एकल निर्देश के साथ एक रेंज बना सकते हैं (जैसे रेंज ("बी 5: सी 14")) और आप एक बार में इसका मूल्य भी निर्धारित कर सकते हैं (यदि इसके लिए समान होना चाहिए रेंज में प्रत्येक सेल), उदाहरण के लिए रेंज ("बी 5: सी 14")। मूल्य = "एबीसी"
फ्रांसेस्को बरुचेलि

29

टालना Selectऔर Activateवह चाल है जो आपको थोड़ा बेहतर VBA डेवलपर बनाती है। सामान्य तौर पर, Selectऔर Activateमैक्रो रिकॉर्ड होने पर उपयोग किया जाता है, इस प्रकार Parentवर्कशीट या रेंज को हमेशा सक्रिय माना जाता है।

यह आप कैसे से बचने के सकता है Selectऔर Activateनिम्नलिखित मामलों में:


एक नया कार्यपत्रक जोड़ना और उस पर एक सेल कॉपी करना:

मैक्रो रिकॉर्डर के साथ उत्पन्न कोड से:

Sub Makro2()
    Range("B2").Select
    Sheets.Add After:=ActiveSheet
    Sheets("Tabelle1").Select
    Sheets("Tabelle1").Name = "NewName"
    ActiveCell.FormulaR1C1 = "12"
    Range("B2").Select
    Selection.Copy
    Range("B3").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
End Sub

सेवा:

Sub TestMe()
    Dim ws As Worksheet
    Set ws = Worksheets.Add
    With ws
        .Name = "NewName"
        .Range("B2") = 12
        .Range("B2").Copy Destination:=.Range("B3")
    End With
End Sub

जब आप वर्कशीट के बीच रेंज कॉपी करना चाहते हैं:

से:

Sheets("Source").Select
Columns("A:D").Select
Selection.Copy
Sheets("Target").Select
Columns("A:D").Select
ActiveSheet.Paste

सेवा:

Worksheets("Source").Columns("A:D").Copy Destination:=Worksheets("Target").Range("a1")

फैंसी नाम श्रेणी का उपयोग करना

आप उन्हें []अन्य तरीकों की तुलना में, जो वास्तव में सुंदर हैं, के साथ एक्सेस कर सकते हैं । अपने आप को जांचो:

Dim Months As Range
Dim MonthlySales As Range

Set Months = Range("Months")    
Set MonthlySales = Range("MonthlySales")

Set Months =[Months]
Set MonthlySales = [MonthlySales]

ऊपर से उदाहरण इस तरह दिखेगा:

Worksheets("Source").Columns("A:D").Copy Destination:=Worksheets("Target").[A1]

मूल्यों की नकल नहीं, बल्कि उन्हें लेना

आमतौर पर, यदि आप करने के लिए तैयार हैं, तो selectशायद आप कुछ कॉपी कर रहे हैं। यदि आप केवल मूल्यों में रुचि रखते हैं, तो यह चयन से बचने का एक अच्छा विकल्प है:

Range("B1:B6").Value = Range("A1:A6").Value


हमेशा वर्कशीट को भी संदर्भित करने का प्रयास करें

यह शायद सबसे आम गलती है । जब भी आप श्रेणियों की प्रतिलिपि बनाते हैं, कभी-कभी कार्यपत्रक को संदर्भित नहीं किया जाता है और इस प्रकार VBA गलत शीट को ActiveWorksheet मानता है।

'This will work only if the 2. Worksheet is selected!
Public Sub TestMe()
    Dim rng As Range
    Set rng = Worksheets(2).Range(Cells(1, 1), Cells(2, 2)).Copy
End Sub

'This works always!
Public Sub TestMe2()
    Dim rng As Range
    With Worksheets(2)
        .Range(.Cells(1, 1), .Cells(2, 2)).Copy
    End With
End Sub

क्या मैं वास्तव में कभी भी .Selectया .Activateकिसी चीज के लिए उपयोग नहीं कर सकता हूं ?

  • जब आप उपयोग में उचित हो सकते हैं .Activateऔर .Selectजब आप यह सुनिश्चित करना चाहते हैं कि एक विशिष्ट कार्यपत्रक दृश्य कारणों से चुना गया है, तो इसका एक अच्छा उदाहरण है । उदाहरण के लिए, आपका एक्सेल हमेशा पहले कवर की गई वर्कशीट के साथ खुलता है, जिसमें यह अवहेलना होती है कि कौन सी फाइल बंद होने पर ActiveSheet थी।

इस प्रकार, नीचे दिए गए कोड की तरह कुछ ठीक है:

Private Sub Workbook_Open()
    Worksheets("Cover").Activate
End Sub

आप Worksheets के बजाय Application.Goto का उपयोग कर सकते हैं। सक्रिय करें। थोड़ा कम जोखिम भरा।
ज्योफ ग्रिसवल्ड

1
लेट उत्तर FYI - एक आवश्यक के लिए एक अच्छा और कुछ अप्रत्याशित उदाहरण .Select- साथ ही साथ मेरे काम के बारे में - सभी शीट्स पर समान जानकारी कैसे लिखी जा सकती है - @Vityata :)
TM

1
@ टीएम - वास्तव में यह एक दिलचस्प उदाहरण है, और शायद कुछ मिलीसेकंड को 100+ वर्कशीट के लिए बचाता है, लेकिन मैं शायद इसे हतोत्साहित करूंगा, अगर मैं इसे कहीं देखता हूं। वैसे भी, वहाँ का चयन स्पष्ट रूप से नहीं लिखा गया है, लेकिन इसका परिणाम .FillAcrossSheetsकहीं है, इसलिए यह बीच में है (कम से कम मेरे विचार में VBA वर्गीकरण के बारे में)
Vityata

17

हमेशा वर्कबुक, वर्कशीट और सेल / रेंज बताएं।

उदाहरण के लिए:

Thisworkbook.Worksheets("fred").cells(1,1)
Workbooks("bob").Worksheets("fred").cells(1,1)

क्योंकि अंत उपयोगकर्ता हमेशा बटन पर क्लिक करेंगे और जैसे ही फ़ोकस कार्यपुस्तिका से हट जाता है कोड के साथ काम करना चाहता है तब चीजें पूरी तरह से गलत हो जाती हैं।

और कार्यपुस्तिका के सूचकांक का उपयोग कभी न करें।

Workbooks(1).Worksheets("fred").cells(1,1)

जब उपयोगकर्ता आपका कोड चलाता है, तो आप नहीं जानते कि अन्य कार्यपुस्तिकाएँ क्या होंगी।


7
वर्कशीट के नाम बदल सकते हैं, आप भी जानते हैं। इसके बजाय कोडनाम का उपयोग करें।
रिक

वर्कशीट नाम बदल सकते हैं, निश्चित। लेकिन मैं इस बात से असहमत हूं कि आपको अपने कोड को कम करने और उसे कम करने की कोशिश करनी चाहिए। यदि कोई उपयोगकर्ता शीट का नाम बदलता है और उनका मैक्रो काम करना बंद कर देता है, तो यह उन पर है। मैं आम तौर पर मानती हूं कि वर्कशीट के नाम समान होंगे। विशेष रूप से महत्वपूर्ण मैक्रोज़ के लिए, मैं मैक्रो में लॉन्च करने से पहले थोड़ा-सा फ़्लाइट चेक चलाता हूं, जो यह सुनिश्चित करने के लिए जांच करता है कि यह पता लगाने की सभी शीट वास्तव में हैं, और यदि कोई गायब है तो यह उपयोगकर्ता को सूचित करता है कि कौन सा है।
ज्योफ ग्रिसवल्ड

10

इन तरीकों को बल्कि कलंकित किया जाता है, इसलिए रेत में एक रेखा खींचने के लिए @Vityata और @Jeeped का नेतृत्व करना:

क्यों फोन नहीं .Activate, .Select, Selection, ActiveSomethingतरीकों / गुण

मूल रूप से क्योंकि वे मुख्य रूप से अनुप्रयोग UI के माध्यम से उपयोगकर्ता इनपुट को संभालने के लिए कहते हैं। चूंकि वे विधियां हैं, जब उपयोगकर्ता यूआई के माध्यम से वस्तुओं को संभालते हैं, तो वे मैक्रो-रिकॉर्डर द्वारा रिकॉर्ड किए गए हैं, और इसीलिए उन्हें कॉल करना या तो ज्यादातर स्थितियों के लिए भंगुर या अतिरेक है: आपको एक तरीके का चयन करने की आवश्यकता नहीं है ऑब्जेक्ट तो Selectionसही के साथ एक कार्रवाई करने के लिए ।

हालाँकि, यह परिभाषा उन स्थितियों को सुलझाती है जिन पर उन्हें बुलाया जाता है:

जब कॉल करने के लिए .Activate, .Select, .Selection, .ActiveSomethingतरीकों / गुण

मूल रूप से जब आप अंतिम उपयोगकर्ता से निष्पादन में भूमिका निभाने की उम्मीद करते हैं ।

यदि आप विकसित कर रहे हैं और उपयोगकर्ता से अपेक्षा करते हैं कि वह आपके कोड को संभालने के लिए ऑब्जेक्ट इंस्टेंस का चयन करेगा, तो .Selectionया उपयुक्त .ActiveObjectहैं।

दूसरी ओर, .Selectऔर .Activateजब आप उपयोगकर्ता की अगली कार्रवाई का अनुमान लगा सकते हैं, तो आप उपयोग कर रहे हैं और आप चाहते हैं कि आपका कोड उपयोगकर्ता का मार्गदर्शन करे, संभवतः उसे कुछ समय और माउस क्लिकों की बचत हो। उदाहरण के लिए, यदि आपके कोड ने केवल एक चार्ट का नया उदाहरण बनाया है या किसी एक को अपडेट किया है, तो उपयोगकर्ता इसे जांचना चाहेगा, और आप .Activateइसे या इसके शीट पर कॉल कर सकते हैं ताकि उपयोगकर्ता इसे खोज सके; या यदि आप जानते हैं कि उपयोगकर्ता को कुछ रेंज मानों को अपडेट करने की आवश्यकता होगी, तो आप प्रोग्रामिक रूप से उस रेंज का चयन कर सकते हैं।


6

IMHO का उपयोग .selectलोगों से आता है, जिन्होंने मुझे पसंद किया और मैक्रों की रिकॉर्डिंग के माध्यम से आवश्यकता के अनुसार VBA सीखना शुरू किया और फिर कोड को संशोधित किए बिना यह महसूस किया कि .selectऔर बाद selectionमें सिर्फ एक अनावश्यक मध्य-पुरुष है।

.select पहले से मौजूद वस्तुओं के साथ सीधे काम करके, पहले से ही पोस्ट किए गए कई उपायों से बचा जा सकता है, जो विभिन्न अप्रत्यक्ष संदर्भों की अनुमति देता है जैसे कि जटिल तरीके से i और j की गणना करना और फिर सेल (i, j), आदि का संपादन करना।

अन्यथा, .selectअपने आप में कुछ भी गलत नहीं है और आप आसानी से इसके लिए उपयोग पा सकते हैं, जैसे मेरे पास एक स्प्रेडशीट है कि मैं तारीख के साथ आबाद करता हूं, मैक्रो को सक्रिय करता हूं जो इसके साथ कुछ जादू करता है और इसे एक अलग शीट पर स्वीकार्य प्रारूप में निर्यात करता है, जो हालाँकि, आसन्न सेल में कुछ अंतिम मैनुअल (अप्रत्याशित) इनपुट की आवश्यकता होती है। तो यहाँ उस पल के लिए आता है जो .selectमुझे उस अतिरिक्त माउस आंदोलन और क्लिक को बचाता है।


2
जब आप सही होते हैं, तो कम से कम एक बात का चयन गलत है: यह धीमा है। मैक्रो में होने वाली बाकी चीजों की तुलना में बहुत धीमी गति से।
वीआइपी

4

शीघ्र जवाब:

.Selectविधि का उपयोग करने से बचने के लिए आप अपनी इच्छित संपत्ति के बराबर एक चर सेट कर सकते हैं।

उदाहरण के लिए, यदि आप चाहते हैं कि Cell A1आप उस सेल की वैल्यू प्रॉपर्टी के बराबर वैरिएबल सेट कर सकें।

  • उदाहरण valOne = Range("A1").Value

उदाहरण के लिए, यदि आप 'Sheet3' का कोडनेम चाहते हैं, तो आप उस वर्कशीट की कोडनेम संपत्ति के बराबर एक चर सेट कर सकते हैं।

  • उदाहरण valTwo = Sheets("Sheet3").Codename

मुझे आशा है कि वह मदद करेंगे। अगर आपका कोई प्रश्न हैं, तो मुझे से पूछें।


3

मैंने देखा कि इनमें से कोई भी उत्तर .Offset Property का उल्लेख नहीं करता है । यह भी Selectकुछ कोशिकाओं में हेरफेर करते समय कार्रवाई से बचने के लिए इस्तेमाल किया जा सकता है , विशेष रूप से चयनित सेल के संदर्भ में (जैसा कि ओपी का उल्लेख है ActiveCell)।

यहाँ एक दो उदाहरण हैं।

मैं यह भी मानूंगा कि "ActiveCell" J4 है

ActiveCell.Offset(2, 0).Value = 12

  • यह सेल J6को 12 के मान में बदल देगा
  • एक माइनस -2 ने J2 को संदर्भित किया होगा

ActiveCell.Offset(0,1).Copy ActiveCell.Offset(,2)

  • इस में सेल की प्रतिलिपि बनाएगा k4करने के लिए L4
  • ध्यान दें कि ऑफ़सेट पैरामीटर में "0" की आवश्यकता नहीं है, यदि आवश्यक नहीं है (, 2)
  • पिछले उदाहरण के समान माइनस 1 होगा i4

ActiveCell.Offset(, -1).EntireColumn.ClearContents

  • यह कॉलम k में सभी कोशिकाओं में मानों को स्पष्ट करेगा।

ये कहने के लिए नहीं हैं कि वे उपरोक्त विकल्पों की तुलना में "बेहतर" हैं, लेकिन सिर्फ विकल्पों की सूची बना रहे हैं।


0

के साथ काम कर रहे हैं ।Parent सुविधा। इस उदाहरण से पता चलता है कि केवल एक myRng संदर्भ की स्थापना कैसे पूरे वातावरण को गतिशील बनाता है। (कोई वंशानुगत नहीं है। बच्चों की सुविधा)

Sub ShowParents()
    Dim myRng As Range
    Set myRng = ActiveCell
    Debug.Print myRng.Address                    ' an address of the selected cell
    Debug.Print myRng.Parent.name                ' the name of sheet, where MyRng is in
    Debug.Print myRng.Parent.Parent.name         ' the name of workbook, where MyRng is in
    Debug.Print myRng.Parent.Parent.Parent.name  ' the name of application, where MyRng is in

    ' You may use this feature to set reference to these objects
    Dim mySh    As Worksheet
    Dim myWbk   As Workbook
    Dim myApp   As Application

    Set mySh = myRng.Parent
    Set myWbk = myRng.Parent.Parent
    Set myApp = myRng.Parent.Parent.Parent
    Debug.Print mySh.name, mySh.Cells(10, 1).Value
    Debug.Print myWbk.name, myWbk.Sheets.Count
    Debug.Print myApp.name, myApp.Workbooks.Count

    ' You may use dynamically addressing
    With myRng
        .Copy

       ' pastes in D1 on sheet 2 in the same workbook, where copied cell is
        .Parent.Parent.Sheets(2).Range("D1").PasteSpecial xlValues
    ' or myWbk.Sheets(2).Range("D1").PasteSpecial xlValues

       ' we may dynamically call active application too
        .Parent.Parent.Parent.CutCopyMode = False
    ' or myApp.CutCopyMode = False
    End With
End Sub

बहुत अच्छा है, लेकिन यह सुनिश्चित नहीं है कि ओपी के प्रश्न के साथ इसका क्या करना है। VBA में काम करने के लिए आपको "पैरेंट" की जरूरत नहीं है सिलेक्ट या एक्टिवशीट के उपयोग के बिना
Geoff Griswald

0

सिलेक्ट या एक्टीवेटशीट का उपयोग न करने का मुख्य कारण यह है क्योंकि अधिकांश लोगों के पास कम से कम एक और जोड़ी वर्कबुक खुली होगी (कभी-कभी दर्जनों) जब वे आपकी मैक्रो को चलाते हैं, और यदि वे आपकी शीट से दूर रहते हैं तो आपका मैक्रो चल रहा है और किसी अन्य पर क्लिक करें उनके पास खुली हुई पुस्तक है, फिर "एक्टीवेटशीट" बदल जाती है, और अयोग्य "चयन" कमांड परिवर्तनों के लिए लक्ष्य कार्यपुस्तिका भी बदल जाती है।

सबसे अच्छा, आपका मैक्रो क्रैश हो जाएगा, कम से कम आप गलत वर्कबुक में राइटिंग वैल्यू या सेल बदलने के साथ-साथ उन्हें "अनडू" करने का कोई तरीका नहीं दे सकते।

मेरे पास एक सरल सुनहरा नियम है जिसका मैं अनुसरण करता हूं: वर्कबुक ऑब्जेक्ट और वर्कशीट ऑब्जेक्ट के लिए "wb" और "ws" नाम के वैरिएबल जोड़ें और मेरी मैक्रो बुक को संदर्भित करने के लिए हमेशा उन का उपयोग करें। अगर मुझे एक से अधिक पुस्तक, या एक से अधिक शीट का संदर्भ लेने की आवश्यकता है, तो मैं और अधिक चर जोड़ता हूं।

उदाहरण के लिए

Dim wb as Workbook
Dim ws as Worksheet
Set wb = ThisWorkBook
Set ws = wb.sheets("Output")

"सेट wb = ThisWorkbook" कमांड बिल्कुल महत्वपूर्ण है। एक्सेल में "ThisWorkbook" एक विशेष मूल्य है, और इसका मतलब है कि वर्तमान में आपका VBA कोड जिस वर्कबुक से चल रहा है । अपनी कार्यपुस्तिका चर के साथ सेट करने के लिए एक बहुत ही उपयोगी शॉर्टकट।

आपके द्वारा अपने उप के शीर्ष पर किए जाने के बाद, उनका उपयोग करना अधिक सरल नहीं हो सकता है, बस उनका उपयोग करें जहाँ भी आप "चयन" का उपयोग करेंगे:

इसलिए "आउटपुट" में सेल "A1" के मूल्य को "Hello" में बदलने के लिए, इसके बजाय:

Sheets("Output").Activate
ActiveSheet.Range("A1").Select
Selection.Value = "Hello"

अब हम यह कर सकते हैं:

ws.Range("A1").Value = "Hello"

यदि उपयोगकर्ता न केवल अधिक स्प्रेडशीट के साथ काम कर रहा है, तो यह दुर्घटना के लिए बहुत अधिक विश्वसनीय और कम संभावना नहीं है, यह बहुत छोटा, तेज और लिखने में आसान है।

एक अतिरिक्त बोनस के रूप में, यदि आप हमेशा अपने चर "wb" और "ws" का नाम लेते हैं , तो आप एक पुस्तक से दूसरी पुस्तक में कोड कॉपी और पेस्ट कर सकते हैं और यह आमतौर पर आवश्यक न्यूनतम परिवर्तनों के साथ काम करेगा, यदि कोई हो।


1
मेरे डाउनवोट नहीं, लेकिन मुझे यकीन नहीं है कि मौजूदा उत्तरों में पहले से ही जो प्रस्तावित किया गया है, उसमें यह कुछ नया जोड़ता है।
बिगबेन

हाँ, मेरा उत्तर थोड़ा बेमानी है, लेकिन अन्य उत्तर बहुत लंबे हैं, बहुत अधिक मात्रा में सामान हैं और किसी ने भी आपके कार्यपत्रक चर को सेट अप करने के लिए थॉटवर्क्सबुक का उपयोग करने का उल्लेख नहीं किया है। यह कुछ ऐसा है, जो अगर किसी ने मुझे पहली बार दिखाया है कि मैं एक पैर की अंगुली को VBA में डुबो देता हूं, तो मुझे अविश्वसनीय मदद मिलेगी। अन्य लोगों ने वर्कशीट चर का उपयोग करने का उल्लेख किया है, लेकिन वास्तव में यह नहीं समझाते हैं कि बहुत अच्छी तरह से क्यों, और वर्कशीट और वर्कबुक चर का उपयोग किए बिना कोड का एक उदाहरण प्रस्तुत नहीं करता है।
ज्योफ ग्रिस्वाल्ड

लेकिन स्वीकृत उत्तर निश्चित रूप से चर्चा करता है ThisWorkbook... मुझे यकीन नहीं है कि आपकी टिप्पणी सटीक है।
बिगबैन

यह करता है, तुम गलत नहीं हो। लेकिन कार्यपुस्तिका चर सेट करने के लिए इसका उपयोग करने और उस कार्यपुस्तिका चर का उपयोग करने के संदर्भ में नहीं, या कार्यपत्रक चर सेट करने के लिए उस कार्यपुस्तिका चर का उपयोग करने के संदर्भ में, जैसा कि मैं सुझाव दे रहा हूं। मेरा उत्तर स्वीकृत उत्तर की तुलना में शुरुआती के लिए छोटा, सरल और अधिक सुलभ है।
ज्योफ ग्रिसवल्ड

-3

यह एक उदाहरण है जो सेल "A1" की सामग्री को साफ करेगा (या यदि चयन प्रकार xllastcell, आदि है)। सभी कोशिकाओं का चयन किए बिना किया जाता है।

Application.GoTo Reference:=Workbook(WorkbookName).Worksheets(WorksheetName).Range("A1")
Range(Selection,selection(selectiontype)).clearcontents 

मुझे उम्मीद है इससे किसी को सहायता मिलेगी।


1
कोई खेद नहीं। ऐसा आपने वहां बिल्कुल नहीं किया है। आपने वास्तव में "Application.GoTo" कमांड का उपयोग करके सेल "A1" का चयन किया है, जो वास्तव में "Select" का उपयोग करने से अलग नहीं है, फिर अपने चयन पर क्लीयरकंटेंट्स का उपयोग करें। ऐसा करने का तरीका यह है कि कोशिकाओं का चयन किए बिना ऐसा होगा Workbook(WorkbookName).Worksheets(WorksheetName).Range("A1").ClearContentsजो एक पंक्ति में है और दो नहीं है, और वास्तव में कोशिकाओं का चयन किए बिना काम करता है।
ज्योफ ग्रिज्डल्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.