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


Answers

दो मुख्य कारण क्यों हैं .Select Selection / Activecell / 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
Question

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

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




Select से बचें और Activate Select वह कदम है जो आपको थोड़ा बेहतर वीबीए डेवलपर बनाता है। आम तौर पर, मैक्रो रिकॉर्ड होने पर 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 में सबसे आम गलती है। जब भी आप श्रेणियों की प्रतिलिपि बनाते हैं, कभी-कभी वर्कशीट का उल्लेख नहीं किया जाता है और इस प्रकार वीबीए सक्रिय वर्कशीट को मानता है।

'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 और चयन करें जब आप सुनिश्चित करना चाहते हैं कि विज़ुअल कारणों के लिए एक विशिष्ट वर्कशीट चयनित है। उदाहरण के लिए, आपका एक्सेल हमेशा पहले चयनित कवर वर्कशीट के साथ खुलता है, जो फ़ाइल बंद होने पर सक्रियतापत्र को अनदेखा करता था। इस प्रकार, ऐसा कुछ बिल्कुल ठीक है:

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



शीघ्र जवाब:

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

► उदाहरण के लिए, यदि आप Cell A1 में मान चाहते हैं तो आप उस सेल की मान संपत्ति के बराबर एक चर सेट कर सकते हैं।

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

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

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

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




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

यह वास्तव में इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं। वैसे भी एक साधारण उदाहरण उपयोगी हो सकता है। मान लीजिए कि आप सक्रिय सेल का मान "foo" पर सेट करना चाहते हैं। 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

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

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

और मैक्रो 1 के रूप में:

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

उम्मीद है कि यह चीजों को थोड़ा सा साफ़ करने में मदद करता है।




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

जब भी आप मैक्रोज़ रिकॉर्ड करते हैं और उनका पुन: उपयोग करते हैं तो आपको मिल जाएगा। चयन करें और सक्रिय करें। जब आप एक सेल या चादर का चयन करते हैं तो यह इसे सक्रिय बनाता है। उस बिंदु से जब भी आप Range.Value जैसे अयोग्य संदर्भों का उपयोग करते हैं। 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"

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




Related