এক্সেল ভিবিএতে সিলেক্ট করা ব্যবহার কীভাবে এড়ানো যায়


537

.Selectএক্সেল ভিবিএতে ব্যবহারের বোধগম্য ঘৃণা সম্পর্কে আমি অনেক শুনেছি , তবে কীভাবে এটি ব্যবহার করা যায় তা সম্পর্কে নিশ্চিত নই। আমি সন্ধান করছি যে আমার Selectফাংশনগুলির পরিবর্তে ভেরিয়েবলগুলি ব্যবহার করতে সক্ষম হলে আমার কোডটি পুনরায় ব্যবহারযোগ্য হবে । তবে আমি নিশ্চিত না যে কীভাবে জিনিসগুলি ব্যবহার করা যায় ( ActiveCellইত্যাদি ইত্যাদি) যদি ব্যবহার না করা হয় Select

আমি এই নিবন্ধটি ব্যাপ্তিগুলির মধ্যে খুঁজে পেয়েছি এবং এই উদাহরণটি সিলেক্ট না ব্যবহারের সুবিধার উপর পেয়েছি তবে কীভাবে কিছুই খুঁজে পাচ্ছি না ?


14
এটি লক্ষণীয় যে এখানে ব্যবহার করার সময় Selectএবং / অথবা ActiveSheetইত্যাদি সম্পূর্ণরূপে অনিবার্য is এখানে আমি পেয়েছি এমন একটি উদাহরণ এখানে দেওয়া হয়েছে: stackoverflow.com/questions/22796286/…
রিক

9
এবং এমন কিছু অনুষ্ঠান রয়েছে - পিটিপিতে একটি অন্তর্নিহিত এক্সেল ফাইলের সাথে চার্ট ডেটা সম্পাদনা - যেখানে সক্রিয় বা নির্বাচন করা প্রয়োজন।
brettdj

@ ব্র্যাটেডজ - একটি সাম্প্রতিক উদাহরণ এখানে । একটি ওয়ার্কবুকের সমস্ত পত্রককে একই মানতে সেট করতে, এটি .Select / .Selectionপ্রয়োজনীয় বলে মনে হচ্ছে।
ব্রুসওয়েেন

3
একই কিউএ থেকে ব্রুস @ ব্রুস মনে হচ্ছে এটি তা নয়
chris neilsen

উত্তর:


564

কীভাবে নির্বাচন এড়ানো যায় তার কয়েকটি উদাহরণ

Dim'ভেরিয়েবল ব্যবহার করুন

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

আপনি যদি অনেকগুলি কক্ষের উপর লুপ করে চলেছেন তবে প্রথমে পরিসর মানগুলিকে প্রথমে কোনও বৈকল্পের অ্যারেতে অনুলিপি করা এবং তার থেকে লুপ করা ভাল often

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
@ ক্রিস্নিলসেন ক্রিস, আমি বিশ্বাস করি যে আপনাকে শর্টহ্যান্ড সেল রেফারেন্স নোটেশন দেওয়ার আগে আপনি Rangeএই জাতীয় টাইপ করা থেকে বাঁচাতে ওয়ার্কশিট উপসর্গটিও ব্যবহার করতে পারেন : ActiveSheet.[a1:a4]বা ws.[b6]
লোগান রিড

3
@ অ্যান্ড্রু উইলিয়ামস ... বা এই পোস্টে 48 বার, কিন্তু কে গণনা করছে। ☺ ... তবে গম্ভীরভাবে, ভেরিয়েবলগুলি ধরে রেখে অবজেক্টের সাথে কাজ করার সময় এটি ভুলে যাওয়া সহজ। কোনও variantভেরিয়েবলের প্রয়োজন হয় না Set যতক্ষণ না আপনি এটিতে কোনও বস্তু নির্ধারণ করেন। উদাহরণস্বরূপ, Dim x: x = 1ঠিক আছে Dim x: x = Sheets("Sheet1")তবে 438 ত্রুটি উত্পন্ন হবে However তবে কেবল বিভ্রান্ত / স্পষ্ট Dim x: x = Range("A1")করতে ত্রুটি তৈরি হবে না । কেন? ... কারণ এটি নির্ধারিত হচ্ছে মান পরিবর্তনশীল, এর বস্তুর না বস্তুর নিজেই একটি রেফারেন্স (যেহেতু এটি সমতুল্য Dim x: x = Range("A1").Value)
ashleedawg

1
@ ব্যবহারকারী 393232000 আমি শীতের নামগুলি স্বয়ংক্রিয়ভাবে পরিবর্তিত হয় এমন দৃশ্যের বিষয়ে অবগত নই। ফাইলের নাম হিসাবে, এটি কেবল তখনই করতে পারে যদি ফোল্ডারে ইতিমধ্যে সেই নামের কোনও ফাইল থাকে। কেবল স্ট্রিং হিসাবে সংরক্ষণের জন্য ফাইলের নাম সংরক্ষণ করুন ... বা হার্ড কোড ব্যবহার করুন। আপনি যদি এই সমস্যাটি সমাধান করতে না পারেন তবে মন্তব্য করার পরিবর্তে আপনার এটি সম্পর্কে একটি পৃথক প্রশ্ন করা উচিত।
টাইলার এইচ

1
@ ব্যবহারকারী 393232000 যা একটি আকর্ষণীয় প্রশ্ন তৈরি করবে। আমি নিশ্চিত যে এটি পরিচালনা করার উপায়গুলি রয়েছে .. আপনি এতদিন ধরেই জেনে গেছেন যে কোনও পুরানো কিউতে একটি মন্তব্য থ্রেড হাইজ্যাক করা উপায় নয়
ক্রিস নীলসেন

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
এটি একটি উত্তরের উত্তর, তবে এই বিষয়টিতে আমি যা অনুভব করছি তা হ'ল যখন আমাদের আসলে অ্যাক্টিভেটের প্রয়োজন হয়। প্রত্যেকে বলছেন এটি খারাপ, তবে কেউ এটির ক্ষেত্রে এটির বোধগম্যতার কোনও ক্ষেত্রে ব্যাখ্যা দেয় না। উদাহরণস্বরূপ, আমি ২ টি ওয়ার্কবুক নিয়ে কাজ করছি এবং প্রথমটি সক্রিয় না করে কোনও একটি ওয়ার্কবুকে ম্যাক্রো শুরু করতে পারিনি। আপনি কি কিছুটা বিস্তারিত বলতে পারেন? এছাড়াও যদি উদাহরণস্বরূপ আমি যখন শীটটি অন্য শিট থেকে অন্য একটি শিটের অনুলিপি করার সময় সক্রিয় না করি, যখন আমি প্রোগ্রামটি সম্পাদন করি, মনে হয় যে কোনওভাবেই, প্রাসঙ্গিকভাবে সম্পর্কিত শিটগুলি সক্রিয় করা হবে।
ব্যবহারকারী 3032689

1
আমি দেখতে পেয়েছি যে আপনাকে কখনও কখনও প্রথমে কোনও শীট সক্রিয় করার প্রয়োজন হতে পারে যদি আপনার এটিতে ডেটা আটকানো বা ফিল্টার করার প্রয়োজন হয়। যতটা সম্ভব সক্রিয় হওয়া এড়াতে আমি তার সেরাটি বলতে চাই তবে এমন ঘটনা যেমন আপনার করা দরকার। সুতরাং উপরের উত্তর অনুসারে সক্রিয়করণ এবং নিরঙ্কুশতম সর্বনিম্নে নির্বাচন করা চালিয়ে যান।
নিক

7
আমি মনে করি যে বিন্দুগুলি এগুলি সম্পূর্ণরূপে ব্যবহার করা এড়ানো নয়, তবে যতটা সম্ভব সম্ভব। আপনি যদি কোনও ওয়ার্কবুক সংরক্ষণ করতে চান, যাতে যখন কেউ এটি নির্দিষ্ট শিটের একটি নির্দিষ্ট ঘর নির্বাচন করে, তখন আপনাকে সেই শীট এবং ঘরটি নির্বাচন করতে হবে। অনুলিপি / পেস্ট একটি খারাপ উদাহরণ, কমপক্ষে মানগুলির ক্ষেত্রে এটি একটি কোডের মাধ্যমে দ্রুত করা যায় যেমনSheets(2).[C10:D12].Value = Sheets(1).[A1:B3].Value
রোবটিক

1
@ নিক আপনার শীটগুলিতে আটকানো বা ফিল্টার করতে সক্রিয় করার দরকার নেই। আপনার পেস্ট বা ফিল্টার কমান্ডগুলিতে শীট অবজেক্টটি ব্যবহার করুন। অনুশীলনের মাধ্যমে আপনি এক্সেল অবজেক্ট মডেলটি শিখার সাথে সাথে এটি আরও সহজ হয়ে যায়। আমি বিশ্বাস করি আমি কেবলমাত্র একবার ব্যবহার করি .আমি যখন নতুন শিট তৈরি করি তখন সচল হয় তবে কোডটি হয়ে গেলে আমি মূল শীটটি উপস্থিত হওয়া চাই।
ফ্রেবভ

3
@ ফ্রেভ আপনার .Activateমূল Application.Goto
শিটটিতে

88

জোরের একটি ছোট বিষয় আমি উপরে বর্ণিত সমস্ত দুর্দান্ত উত্তরগুলিতে যুক্ত করব:

সম্ভবত সিলেক্ট ব্যবহার এড়াতে আপনি সবচেয়ে বড় কাজটি যতটা সম্ভব সম্ভব হ'ল আপনার ভিবিএ কোডে নামযুক্ত রেঞ্জগুলি (অর্থবহ পরিবর্তনশীল নামের সাথে মিলিত) ব্যবহার করুন । এই বিন্দুটি উপরে বর্ণিত ছিল, তবে কিছুটা উপরেই প্রকাশিত হয়েছিল; তবে এটি বিশেষ মনোযোগের দাবিদার।

নামযুক্ত রেঞ্জগুলির উদার ব্যবহারের কয়েকটি অতিরিক্ত কারণ এখানে রয়েছে যদিও আমি নিশ্চিত যে আমি আরও কিছু ভাবতে পারি।

নামের রেঞ্জগুলি আপনার কোডটি পড়তে ও বুঝতে সহজ করে তোলে।

উদাহরণ:

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

এই কোডটি প্রথমে ঠিকঠাকভাবে কাজ করবে - যা আপনি বা ভবিষ্যতের ব্যবহারকারী সিদ্ধান্ত না নেওয়ার আগ পর্যন্ত "জি উইজ, আমি মনে করি আমি কলামে একটি নতুন কলাম যুক্ত করব A !", বা মাসের মধ্যে ব্যয়ের কলাম রাখব এবং বিক্রয় কলাম, বা প্রতিটি কলামে একটি শিরোনাম যুক্ত করুন। এখন, আপনার কোডটি নষ্ট হয়ে গেছে। এবং যেহেতু আপনি মারাত্মক ভেরিয়েবলের নাম ব্যবহার করেছেন, এটি ঠিক করার চেয়ে এটি কীভাবে ঠিক করবেন তা নির্ধারণ করতে আপনাকে আরও অনেক বেশি সময় লাগবে।

আপনি যদি নামের শুরুতে ব্যাপ্তিগুলি শুরু করে থাকেন তবে, Monthsএবং Salesকলামগুলি আপনার পছন্দ মতো সমস্ত জায়গায় স্থানান্তরিত হতে পারে এবং আপনার কোডটি ঠিকঠাক কাজ করা চালিয়ে যাবে।


6
নামযুক্ত রেঞ্জগুলি ভাল বা খারাপ স্প্রেডশিট ডিজাইন কিনা তা নিয়ে বিতর্ক অব্যাহত রয়েছে - আমি দৃ camp়ভাবে নো শিবিরে আছি। আমার অভিজ্ঞতায় তারা ত্রুটিগুলি বাড়িয়ে তোলে (স্ট্যান্ডার্ড ব্যবহারকারীদের জন্য যাদের কোডের প্রয়োজন নেই)।
brettdj


12
আমি আপনার বিকাশের দর্শনের সাথে একমত; তবে আমি মনে করি কাগজটি আজেবাজে। এটি স্প্রেডশিটগুলি ডিবাগ করা নবাগতদের কীভাবে বিভ্রান্ত করতে পারে সে সম্পর্কে আলোচনা করে, তবে যে কেউ স্প্রেডশিটগুলি জটিল স্প্রেডশিটগুলি দেখার জন্য নভিস ব্যবহার করেন তারা কী প্রাপ্য তা পান! আমি এমন একটি ফার্মের জন্য কাজ করতাম যিনি আর্থিক স্প্রেডশিটগুলি পর্যালোচনা করেছিলেন এবং আমি আপনাকে বলতে পারি যে আপনি কোনও নবজাতককে যে ধরণের কাজ দেন তা নয়।
ডিনোক

8
কোনও অর্থবহ বিতর্ক নেই। যে কেউ সংজ্ঞায়িত নামের বিরুদ্ধে যুক্তি দেয় সেগুলি তাদের প্রবিধানগুলি পুরোপুরি বুঝতে সময় নেয়নি। নামযুক্ত সূত্রগুলি সমস্ত এক্সেলের মধ্যে একক সবচেয়ে গভীর এবং দরকারী নির্মাণ হতে পারে।
এক্সেল হিরো

10
@ ব্র্যাটেডজ: আপনার উদ্ধৃতিটি সঠিক, তবে আপনি এটি উল্লেখ করতে ভুলে গেছেন যে এটির পরে ছয়টি "বাদে ..." বাক্যাংশ রয়েছে। এর মধ্যে একটি হ'ল: " ম্যাক্রো কোডিং-এ সেল রেফারেন্সের বিকল্প ব্যতীত সর্বদা ম্যাক্রো নির্মাণের সময় এক্সেল নামগুলি সেল রেফারেন্সের বিকল্প হিসাবে ব্যবহার করুন This এটি অতিরিক্ত সারি বা কলামগুলির সন্নিবেশ থেকে উদ্ভূত ত্রুটিগুলি এড়ানো যাতে ম্যাক্রো কোডিং আর থাকে না ing উদ্দেশ্যে উত্স ডেটা নির্দেশ করে। "
মার্কাস মঙ্গেলসডর্ফ

47

আমি যেহেতু প্রত্যেকেই দীর্ঘ উত্তর দিয়েছিলাম সেহেতু আমি সংক্ষিপ্ত উত্তর দিতে যাচ্ছি।

আপনি যখনই ম্যাক্রো রেকর্ড করবেন এবং সেগুলি পুনরায় ব্যবহার করবেন তখন আপনি নির্বাচন করুন এবং নিষ্ক্রিয় পাবেন। আপনি যখন একটি ঘর বা শীট নির্বাচন করেন তখন এটি কেবল সক্রিয় করে তোলে। সেই অবস্থান থেকে আপনি যখনই অযোগ্য উল্লেখগুলি Range.Valueব্যবহার করেন ঠিক যেমন তারা কেবল সক্রিয় সেল এবং শিট ব্যবহার করে sheet আপনার কোডটি কোথায় রাখা হয়েছে তা যদি না দেখেন বা কোনও ব্যবহারকারী ওয়ার্কবুকটিতে ক্লিক করেন তবে এটি সমস্যাযুক্তও হতে পারে।

সুতরাং, আপনি সরাসরি আপনার ঘরের রেফারেন্সের মাধ্যমে এই সমস্যাগুলি দূর করতে পারেন। যা যায়:

'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এড়ানো উচিত নয় যা এড়ানো উচিত।

এমন কিছু সময় রয়েছে যখন হ'ল-কী সংমিশ্রণগুলিতে স্বল্প সময় সাশ্রয়কারী ম্যাক্রো সাব রুটিনগুলি থাকার পরে বেশ কয়েকটি কীগুলির ট্যাপের সাহায্যে পাওয়া যায় time ওয়ার্কশিট-বিস্তৃত ডেটা ফর্ম্যাটের সাথে খাপ খায় না এমন পকেটযুক্ত ডেটার সাথে ডিল করার সময় বিস্ময়ের কাজ করে অপারেশনাল কোডটি কার্যকর করতে কক্ষের একটি গ্রুপ নির্বাচন করতে সক্ষম হওয়া। অনেকগুলি একইভাবে আপনি কক্ষের একটি গ্রুপ নির্বাচন করতে পারেন এবং একটি ফর্ম্যাট পরিবর্তন প্রয়োগ করতে পারেন, বিশেষ ম্যাক্রো কোডের বিরুদ্ধে কোষের একটি গ্রুপ নির্বাচন করা একটি বড় সময় বাঁচাতে পারে।

নির্বাচন-ভিত্তিক উপ কাঠামোর উদাহরণ:

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

দয়া করে নোট করুন যে নিম্নলিখিতগুলিতে আমি নির্বাচন করা পদ্ধতির সাথে তুলনা করছি (ওপি যেটিকে এড়াতে চায়), রেঞ্জ পদ্ধতির সাথে (এবং এটিই প্রশ্নের উত্তর)। সুতরাং আপনি যখন প্রথম নির্বাচনটি দেখেন তখন পড়া বন্ধ করবেন না।

এটি আপনি যা করার চেষ্টা করছেন তার উপর নির্ভর করে। যাইহোক একটি সাধারণ উদাহরণ কার্যকর হতে পারে। ধরা যাক আপনি সক্রিয় কক্ষের মান "foo" তে সেট করতে চান। অ্যাক্টিভেল ব্যবহার করে আপনি এরকম কিছু লিখবেন:

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

আশা করি এটি কিছুটা পরিষ্কার করতে সহায়তা করে।


1
এত তাড়াতাড়ি দুর্দান্ত প্রতিক্রিয়ার জন্য ধন্যবাদ। সুতরাং এর অর্থ কি এই যে আমি যদি স্বাভাবিকভাবে পরিসীমাতে ঘরগুলি যুক্ত করতে পারি, রেঞ্জটির নামকরণ করি এবং এর মাধ্যমে পুনরাবৃত্তি করি তবে আমি সরাসরি অ্যারে তৈরি করতে লাফিয়ে উঠব?
বিজিএক্সরো

আমি নিশ্চিত না যে আপনি কী বলতে চাইছেন তা আমি বুঝতে পেরেছি তবে আপনি একটি একক নির্দেশাবলীর দ্বারা একটি রেঞ্জ তৈরি করতে পারেন (উদাহরণস্বরূপ রেঞ্জ ("বি 5: সি 14")) এবং আপনি এমনকি একবারে এর মান সেট করতে পারেন (যদি এটির মতো হতে হয় তবে) রেঞ্জের প্রতিটি ঘর), যেমন রেঞ্জ ("বি 5: সি 14") Val মান = "এবিসি"
ফ্রান্সেস্কো বারুচেলি

28

এড়ানো Select এবং Activateএমন পদক্ষেপ যা আপনাকে আরও ভাল ভিবিএ বিকাশকারী করে তোলে। সাধারণত, 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


পাশাপাশি কার্যপত্রকটি উল্লেখ করার জন্য সর্বদা চেষ্টা করুন

এটি সম্ভবত সবচেয়ে সাধারণ ভুল । আপনি যখনই সীমাগুলি অনুলিপি করেন, কখনও কখনও কার্যপত্রকটি উল্লেখ করা হয় না এবং এইভাবে ভিবিএ ভুল পত্রকটিকে অ্যাক্টিভরকশিট হিসাবে বিবেচনা করে।

'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এটি যখন আপনি নিশ্চিত করতে চান যে কোনও নির্দিষ্ট কার্যপত্রকটি ভিজ্যুয়াল কারণে নির্বাচিত হয়েছে of উদাহরণস্বরূপ, আপনার এক্সেল সর্বদা প্রথম নির্বাচিত কভার ওয়ার্কশিটটি দিয়ে খোলা থাকবে, ফাইলটি বন্ধ হওয়ার পরে কোনটি অ্যাক্টিভশিট ছিল তা উপেক্ষা করে।

সুতরাং, নীচের কোডটির মতো কিছু একদম ঠিক আছে:

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

আপনি কার্যপত্রকগুলির পরিবর্তে অ্যাপ্লিকেশন.গোটো ব্যবহার করতে পারেন cএকটিভেট করুন। কিছুটা কম ঝুঁকিপূর্ণ।
জিওফ গ্রিসওয়াল্ড

1
দেরীতে উত্তর এফওয়াইআই - একটি প্রয়োজনীয় এবং কিছুটা অপ্রত্যাশিত উদাহরণ .Select- পাশাপাশি আমার কাজ সম্পর্কে - সমস্ত শিটগুলিতে অভিন্ন তথ্য কীভাবে লিখতে হয় তা পাওয়া যাবে - @ ভিটিটা :)
টিএম

1
@TM - প্রকৃতপক্ষে এটি একটি আকর্ষণীয় উদাহরণ, এবং সম্ভবত 100+ কার্যপত্রক জন্য কিছু মিলিসেকেন্ড সংরক্ষণ করে, কিন্তু আমি সম্ভবত এটা নিরুৎসাহিত হবে, যদি আমি এটা কোথাও দেখতে পাচ্ছি। যাইহোক, সেখানের নির্বাচনটি স্পষ্টভাবে লিখিত হয়নি তবে একটি ফলাফল .FillAcrossSheets, সুতরাং এটি কোথাও কোথাও এর মধ্যে রয়েছে (কমপক্ষে
ভিবিএ

17

সর্বদা ওয়ার্কবুক, কার্যপত্রক এবং ঘর / ব্যাপ্তিটি স্থির করুন।

উদাহরণ স্বরূপ:

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

কারণ শেষ ব্যবহারকারীরা সর্বদা কেবল বোতামগুলিতে ক্লিক করবেন এবং ওয়ার্কবুকটি ফোকাসের সাথে সাথেই কোডটি কাজ করতে চায় তখন জিনিসগুলি সম্পূর্ণরূপে ভুল হয়ে যায়।

এবং কখনই কোনও কাজের বইয়ের সূচি ব্যবহার করবেন না।

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

আপনি যখন জানবেন না যখন ব্যবহারকারী আপনার কোড চালায় তখন অন্যান্য ওয়ার্কবুকগুলি কী উন্মুক্ত হবে।


7
ওয়ার্কশিটগুলির নামগুলিও বদলে যেতে পারে, আপনি জানেন। পরিবর্তে কোডনাম ব্যবহার করুন।
রিক

কার্যপত্রকের নামগুলি অবশ্যই পরিবর্তন করতে পারে। তবে আমি একমত নই যে আপনার কোডটি চেষ্টা করে ও প্রশমিত করার জন্য আপনার কোডটিকে অতিরিক্ত জটিল করে তোলা উচিত। যদি কোনও ব্যবহারকারী কোনও শীটের নাম পরিবর্তন করে এবং তাদের ম্যাক্রো কাজ করা বন্ধ করে দেয়, এটি তাদের উপর। আমি সাধারণত ধরে নিই ওয়ার্কশিটের নাম একই হতে চলেছে। বিশেষত সমালোচনামূলক ম্যাক্রোগুলির জন্য, আমি ম্যাক্রোটিকে যথাযথভাবে চালু করার আগে সামান্য প্রাক-ফ্লাইট চেকটি চালাচ্ছি, যা কেবল এটি নিশ্চিত করে যাচাই করে যে এটির শীটগুলি খুঁজে পাওয়ার প্রত্যাশা রয়েছে তা অবশ্যই আছে এবং যদি এটি অনুপস্থিত থাকে তবে এটি ব্যবহারকারীকে জানিয়ে দেয়।
জিওফ গ্রিসওয়াল্ড

10

এই পদ্ধতিগুলি বরং কলঙ্কিত, সুতরাং বালিতে একটি লাইন আঁকার জন্য @ ভিটিটা এবং @ জিপেদের নেতৃত্ব নিন:

কেন কল না .Activate, .Select, Selection, ActiveSomethingপদ্ধতি / বৈশিষ্ট্য

মূলত কারণ এগুলি অ্যাপ্লিকেশন UI- র মাধ্যমে ব্যবহারকারীদের ইনপুট হ্যান্ডেল করার জন্য প্রাথমিকভাবে বলা হয়েছিল। যেহেতু যখন ব্যবহারকারীগুলি ইউআইয়ের মাধ্যমে বস্তুগুলি পরিচালনা করে তখন এগুলি সেই পদ্ধতিগুলি হ'ল তারা ম্যাক্রো-রেকর্ডার দ্বারা রেকর্ডকৃত, এবং এ কারণেই তাদের কল করা বেশিরভাগ পরিস্থিতিতেই ভঙ্গুর বা অপ্রয়োজনীয়: আপনাকে একটি নির্বাচন করতে হবে না অবজেক্ট যাতে Selectionডান পরে একটি ক্রিয়া সম্পাদন করতে ।

যাইহোক, এই সংজ্ঞা পরিস্থিতি স্থিত করে যার জন্য তাদের আহ্বান করা হয়েছে:

যখন কল .Activate, .Select, .Selection, .ActiveSomethingপদ্ধতি / বৈশিষ্ট্য

মূলত যখন আপনি আশা করেন চূড়ান্ত ব্যবহারকারীর মৃত্যুদন্ড কার্যকর করার ক্ষেত্রে কোনও ভূমিকা পালন করবে।

যদি আপনি বিকাশ করছেন এবং ব্যবহারকারী আপনার কোডটি পরিচালনা করার জন্য অবজেক্টের উদাহরণগুলি বেছে নেওয়ার প্রত্যাশা করেন, তবে .Selectionবা .ActiveObjectযথাযথ।

অন্যদিকে, .Selectএবং .Activateযখন আপনি ব্যবহারকারীর পরবর্তী ক্রিয়াটি অনুমান করতে পারেন এবং আপনি ব্যবহার করতে পারেন তখন আপনার কোডটি ব্যবহারকারীকে গাইড করতে চান, সম্ভবত তাকে কিছু সময় এবং মাউস ক্লিকগুলি সংরক্ষণ করতে পারেন। উদাহরণস্বরূপ, যদি আপনার কোডটি কেবল একটি চার্টের একেবারে নতুন উদাহরণ তৈরি করেছে বা একটি আপডেট হয়েছে, ব্যবহারকারী এটি পরীক্ষা করে দেখতে চাইতে .Activateপারে এবং ব্যবহারকারীর সন্ধানের সময়টি বাঁচাতে আপনি এটি বা তার পত্রকে কল করতে পারেন; অথবা আপনি যদি জানেন যে ব্যবহারকারীর কিছু পরিসরের মান আপডেট করতে হবে, আপনি ক্রমবর্ধমানভাবে এই ব্যাপ্তিটি নির্বাচন করতে পারেন।


6

আইএমএইচওর ব্যবহার লোকের .selectকাছ থেকে আসে, যারা আমার মতো ম্যাক্রো রেকর্ডিংয়ের মাধ্যমে প্রয়োজনীয়তার সাথে ভিবিএ শিখতে শুরু করেছিলেন এবং তারপরে এটি বুঝতে না পেরে কোডটি সংশোধন করতে শুরু করলেন.select এবং পরবর্তীটি selectionকেবল একটি অপ্রয়োজনীয় মধ্যবিত্ত পুরুষ।

.select ইতিমধ্যে উপস্থিত অনেকগুলি ইতিমধ্যে বিদ্যমান অবজেক্টগুলির সাথে সরাসরি কাজ করে এড়ানো যায়, যা বিভিন্ন অপ্রত্যক্ষ রেফারেন্সিংকে অনুমতি দেয় যেমন একটি জটিল পদ্ধতিতে i এবং j গণনা করা এবং তারপরে সেল (i, j) ইত্যাদি সম্পাদনা করা etc.

অন্যথায়, .selectনিজের সাথে সুস্পষ্টভাবে ভুল কিছু নেই এবং আপনি সহজেই এর ব্যবহারগুলি সন্ধান করতে পারেন, যেমন আমার একটি স্প্রেডশিট রয়েছে যা আমি তারিখের সাথে পপুলেশন করি, ম্যাক্রো সক্রিয় করি যা এর সাথে কিছু জাদু করে এবং এটি একটি পৃথক শীটে গ্রহণযোগ্য বিন্যাসে রফতানি করে, যা তবে, সংলগ্ন কক্ষে কিছু চূড়ান্ত ম্যানুয়াল (অনির্দেশ্য) ইনপুট দরকার। সুতরাং এখানে সেই মুহুর্তটি আসে যা .selectআমাকে সেই অতিরিক্ত মাউস আন্দোলন এবং ক্লিক করে সংরক্ষণ করে।


2
আপনি যখন ঠিক বলেছেন, সেখানে কমপক্ষে একটি জিনিস নির্বাচন সহ স্পষ্টতই ভুল আছে: এটি ধীর গতির। ম্যাক্রোতে ঘটে যাওয়া সমস্ত কিছুর তুলনায় প্রকৃতপক্ষে খুব ধীর।
ফাঁকা

4

দ্রুত উত্তর:

ব্যবহার এড়াতে .Selectপদ্ধতিটি আপনি নিজের পছন্দসই সম্পত্তিটির সমান ভেরিয়েবল সেট করতে পারেন।

► উদাহরণস্বরূপ, আপনি যদি মানটি চান তবে Cell A1সেই ঘরের মান সম্পত্তির সমান একটি ভেরিয়েবল সেট করতে পারেন।

  • উদাহরণ valOne = Range("A1").Value

Instance উদাহরণস্বরূপ, আপনি যদি 'শীট 3` এর কোডনাম চান তবে আপনি সেই কার্যপত্রকের কোডনামের সমান পরিমাণে একটি ভেরিয়েবল সেট করতে পারেন।

  • উদাহরণ valTwo = Sheets("Sheet3").Codename

আমি আশা করি এটি সাহায্য করবে. যদি আপনার কোন প্রশ্ন থাকে তাহলে আমার জানতে দিন।


3

আমি লক্ষ্য করেছি যে এর উত্তরের কোনওটিতেই .Offset সম্পত্তির উল্লেখ নেই । এটি Selectনির্দিষ্ট কক্ষগুলি হেরফের করার সময় অ্যাকশনটি ব্যবহার এড়াতে ব্যবহার করা যেতে পারে , বিশেষত একটি নির্বাচিত ঘরের संदर्भে (যেমন ওপি উল্লেখ করেছেন ActiveCell)।

এখানে কয়েকটি উদাহরণ দেওয়া হল।

আমি "অ্যাক্টিভেল" জে 4 ও ধরে নেব ।

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

  • এটি সেলকে J612 এর মান হিসাবে পরিবর্তন করবে
  • একটি বিয়োগ -2 জে 2-কে রেফারেন্স করবে

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

  • এই সেল কপি হবে k4থেকে L4
  • মনে রাখবেন যে প্রয়োজন না হলে অফসেট প্যারামিটারে "0" প্রয়োজন হয় না (, 2)
  • পূর্ববর্তী উদাহরণের মতো একটি বিয়োগ 1 হবে i4

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

  • এটি ক কলামের সমস্ত কক্ষে মানগুলি সাফ করবে।

এগুলি উপরের বিকল্পগুলির চেয়ে তারা "আরও ভাল" বলার অপেক্ষা রাখে না, কেবল বিকল্পগুলির তালিকা তৈরি করে।


0

প্যারেন্ট ফিচারের সাথে কাজ করা। এই উদাহরণটি দেখায় যে কীভাবে কেবলমাত্র একটি MyRng রেফারেন্স সেট করা পুরো পরিবেশে কোনও .Select, .অ্যাক্টিভেট, .অ্যাকটিভেল, .অ্যাকটিভ ওয়ার্কবুক, .এ্যাকটিভশিট এবং আরও কিছু দিয়ে গতিশীল অ্যাক্সেস সক্ষম করে। (কোনও জেনেরিক নেই h শিশু বৈশিষ্ট্য)

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

খুব সুন্দর, তবে ওপিএস প্রশ্নের সাথে এটির কী আছে তা নিশ্চিত নয়। সিবিএ বা অ্যাক্টিভশিট ব্যবহার না করে ভিবিএতে কাজ করার জন্য আপনার কোনও "পিতামাতার" দরকার নেই
জিওফ গ্রিসওয়াল্ড

0

নির্বাচন বা ক্রিয়াকলাপটি কখনও ব্যবহার না করার মূল কারণ হ'ল বেশিরভাগ লোকেরা আপনার ম্যাক্রোটি চালানোর সময় কমপক্ষে আরও দু'জন ওয়ার্কবুক খোলা থাকে (কখনও কখনও কয়েক ডজন), এবং যদি আপনার ম্যাক্রো চলমান অবস্থায় তারা আপনার পত্রকটি থেকে দূরে ক্লিক করেন এবং অন্য কোনওটিতে ক্লিক করেন তাদের খোলা বইটি, তারপরে "অ্যাক্টিভেটস" পরিবর্তন হয় এবং অযোগ্য "নির্বাচন করুন" কমান্ডের জন্য টার্গেট ওয়ার্কবুকও পরিবর্তিত হয়।

সর্বোপরি, আপনার ম্যাক্রো ক্র্যাশ হয়ে যাবে, সবচেয়ে খারাপভাবে আপনি মানগুলি লিখতে বা সেগুলিকে "পূর্বাবস্থায় ফেলার" কোনও উপায় ছাড়াই ভুল ওয়ার্কবুকে ঘর পরিবর্তন করতে পারেন।

আমার অনুসরণ করা একটি সাধারণ সোনালি নিয়ম রয়েছে: একটি ওয়ার্কবুক অবজেক্ট এবং একটি কার্যপত্রক অবজেক্টের জন্য "wb" এবং "ws" নামের ভেরিয়েবল যুক্ত করুন এবং সেগুলি সর্বদা আমার ম্যাক্রো বইয়ের উল্লেখ করতে ব্যবহার করুন। যদি আমার একাধিক বই, বা একাধিক শীট উল্লেখ করতে হয় তবে আমি আরও ভেরিয়েবল যুক্ত করব।

উদাহরণ স্বরূপ

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

"সেট wb = এই ওয়ার্কবুক" কমান্ডটি একেবারে কী। "এই ওয়ার্কবুক" এক্সেলের একটি বিশেষ মান, এবং এর অর্থ বর্তমানে আপনার ভিবিএ কোডটি যে ওয়ার্কবুকটি থেকে চলছে । আপনার ওয়ার্কবুকের সাথে ভেরিয়েবল সেট করতে একটি খুব সহায়ক শর্টকাট।

আপনার সাব এর শীর্ষে এটি করার পরে এগুলি ব্যবহার করা সহজ হতে পারে না, আপনি যেখানেই "নির্বাচন" ব্যবহার করবেন সেখানে কেবল সেগুলি ব্যবহার করুন:

সুতরাং "আউটপুট" এর "A1" কক্ষের মান পরিবর্তনের পরিবর্তে "হ্যালো" করুন:

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

আমরা এখন এটি করতে পারি:

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

যা কেবল একাধিক নির্ভরযোগ্য নয় এবং ক্র্যাশ হওয়ার সম্ভাবনাও কম নয় যদি ব্যবহারকারী একাধিক স্প্রেডশিট নিয়ে কাজ করে তবে এটি আরও সংক্ষিপ্ত, দ্রুত এবং সহজে লেখা যায়।

একটি যুক্ত বোনাস হিসাবে, আপনি যদি সর্বদা আপনার ভেরিয়েবলগুলির নাম "ডাব্লুবি" এবং "ডাব্লু ডাব্লু" রাখেন, আপনি একটি বই থেকে অন্য বইতে কোড অনুলিপি করতে এবং পেস্ট করতে পারেন এবং এটি সাধারণত ন্যূনতম পরিবর্তনগুলির সাথে কাজ করবে, যদি কোনও হয়।


1
আমার ডাউনভোট নয়, তবে আমি নিশ্চিত নই যে এটি বিদ্যমান উত্তরের মধ্যে ইতিমধ্যে প্রস্তাবিত বিষয়ে নতুন কিছু যুক্ত করেছে।
বিগবেন

হ্যাঁ, আমার উত্তরটি কিছুটা অপ্রয়োজনীয়, তবে অন্য উত্তরগুলি খুব দীর্ঘ, এটি এমন একটি বিষয় যা, যদি কেউ প্রথমবার আমাকে ভিবিএতে একটি পায়ের আঙুল ডুবিয়ে দেখাতো, আমি অবিশ্বাস্যরকম সাহায্যকারী পেতাম। অন্যরা একটি ওয়ার্কশিট ভেরিয়েবল ব্যবহার করার কথা উল্লেখ করেছেন তবে কেন খুব ভাল তা সঠিকভাবে ব্যাখ্যা করেন না এবং ওয়ার্কশিট এবং ওয়ার্কবুকের ভেরিয়েবলগুলি ব্যবহার করে বা ব্যবহার না করে কোডের উদাহরণ উপস্থাপন করবেন না।
জিফ গ্রিসওয়াল্ড

তবে গৃহীত উত্তরটি অবশ্যই স্পষ্টভাবে আলোচনা করে ThisWorkbook... আপনার মন্তব্য সঠিক কিনা তা আমি নিশ্চিত নই।
বিগবেন

এটা করে, আপনি ভুল না। তবে এটি কোনও ওয়ার্কবুক ভেরিয়েবল সেট করতে ব্যবহার করার প্রসঙ্গে নয় এবং সেই ওয়ার্কবুক ভেরিয়েবলটি এগিয়ে যাচ্ছে বা সেই ওয়ার্কবুক ভেরিয়েবলটি ওয়ার্কশিট ভেরিয়েবল সেট করতে ব্যবহার করার প্রসঙ্গে নয়, যেমনটি আমি পরামর্শ দিচ্ছি। আমার উত্তর গ্রহণযোগ্য উত্তরের চেয়ে সংক্ষিপ্ত, সহজ এবং নবীনদের পক্ষে আরও অ্যাক্সেসযোগ্য।
জেফ গ্রিসওয়াল্ড

-3

এটি এমন একটি উদাহরণ যা ঘর "এ 1" এর সামগ্রীগুলি সাফ করবে (বা আরও যদি নির্বাচনের ধরণটি xllastcell হয় ইত্যাদি)। সমস্ত সেল নির্বাচন না করেই সম্পন্ন হয়েছে।

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

আমি আশা করি এটা কারো সাহায্যে লাগবে.


1
না, দুঃখিত। আপনি সেখানে কিছু করেননি এটিই নয়। আপনি যা করেছেন তা হ'ল "অ্যাপ্লিকেশন.গোটো" কমান্ডটি ব্যবহার করে সেল "এ 1" নির্বাচন করা, যা আপনার "সিলেক্ট" ব্যবহার করে আসলেই আলাদা নয়, তারপরে আপনার নির্বাচনের ক্ষেত্রে ক্লিয়ারকন্টেন্ট ব্যবহার করেছেন। কক্ষ নির্বাচন না করে এটি করার উপায়টি Workbook(WorkbookName).Worksheets(WorksheetName).Range("A1").ClearContentsহ'ল যা একটি লাইন এবং দুটি নয় এবং প্রকৃতপক্ষে ঘর নির্বাচন না করেই কাজ করে।
জিওফ গ্রিসওয়াল্ড 13
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.