ভিবিএতে গল্ফ করার টিপস


16

অনুরূপ এই , এই , এবং এই প্রশ্ন ...

গল্ফ করার জন্য আপনার কাছে কোন সাধারণ টিপস রয়েছে VBA? আমি এমন ধারণাগুলি সন্ধান করছি যা সাধারণভাবে গল্ফ সমস্যাগুলিতে প্রয়োগ করা যেতে পারে যা অন্তত কিছুটা নির্দিষ্ট VBA(যেমন "মন্তব্যগুলি সরান" কোনও উত্তর নয়)। দয়া করে উত্তর প্রতি একটি টিপ পোস্ট করুন।

আমি অন্যান্য ভাষার সাথে কাজ করার সময়, আমি সবচেয়ে শক্তিশালী VBAএবং আমি VBAএই সাইটে অনেক গল্ফার ব্যবহার করতে দেখি না ।


নীতি অনুসারে সম্প্রদায় উইকিতে রূপান্তরিত হয়েছে।
ডিএমকেই --- প্রাক্তন-মডারেটর বিড়ালছানা

দুঃখিত যে আমার পক্ষ থেকে স্বয়ংক্রিয় ছিল না!
গাফি

কোনও ঝামেলা নেই। প্রকৃতপক্ষে, তারা ব্যবহারকারীদের থেকে সিডাব্লু দূরে প্রশ্ন তৈরি করার ক্ষমতা নিয়েছে (আপনি এখনও উত্তরগুলি দিতে পারেন, আমি মনে করি)। আপনি মডারেটরের মনোযোগের জন্য পতাকা তুলতে পারেন, তবে কোডগল্ফের মতো সামান্য ক্রিয়াকলাপ খুব কমই প্রয়োজনীয়।
ডিএমকেকে --- প্রাক্তন মডারেটর বিড়ালছানা

2
ভিবিএ হ'ল কয়েকটি সিনট্যাক্স শর্টকাট সহ তুলনামূলক ভার্জোজ ভাষা। আপনি যদি সেরা স্কোরের জন্য যাচ্ছেন তবে ভিবিএ ভাল পছন্দ নাও হতে পারে। আপনি যদি নিজের দক্ষতা অর্জন করতে চান তবে আপনার কাছে আরও শক্তি।
মিঃ লালমা

2
@ গিগা ওয়াট আমার দক্ষতা সম্মান করে তা হচ্ছে। আসলে বিভিন্ন চ্যালেঞ্জের সাথে খেলা করার পরে, আমি ইতিমধ্যে ভিবিএর সাথে কাজ করার জন্য কয়েকটি নতুন কৌশল বেছে নিয়েছি! আমি ভিবিএর সাথে কোনও বাস্তব কোড-গল্ফ চ্যালেঞ্জ জিততে আশা করি না , তবে এটি ভাল অনুশীলন। :-)
গাফি

উত্তর:


8

ByRefসাবস কল করার সময় ডিফল্টটি শোষণ করুন

কিছু অতিরিক্ত অক্ষর সংরক্ষণের জন্য মাঝে মাঝে Subকলটির ব্যবহার করা সম্ভব হয় Function...

এটি ( ৮rs টি চর)

Sub a()
b = 0
Do Until b = 5
b = c(b)
Loop
End Sub
Function c(d)
c = d + 1
End Function

( 73 অক্ষর) এ আবার কাজ করা যেতে পারে :

Sub a()
b = 0
Do Until b = 5
c b
Loop
End Sub
Sub c(d)
d = d + 1
End Sub

লক্ষ্য করুন এটি চিরতরে লুপ হবে না , যদিও এটি প্রদর্শিত হয় আপনি কখনই bএর মান পুনরায় বরাদ্দ করছেন না ।

Functionউপরেরগুলি কোনও কল ব্যবহার করে না , পরিবর্তে কলটির ByRef("রেফারেন্স দ্বারা") কার্যকারিতাটি কাজে লাগায় Sub। এর অর্থ কীভাবে পাস করা যুক্তিটি হ'ল কলিং ফাংশনটির মতো একই পরিবর্তনশীল (এটি একটি ByVal"প্রতি মান দ্বারা" পাস করার বিপরীতে , যা একটি অনুলিপি)। পাস করা ভেরিয়েবলের যে কোনও পরিবর্তনগুলি কলিং ফাংশনে ফিরে অনুবাদ করবে।

ডিফল্টরূপে, সমস্ত আর্গুমেন্ট হিসাবে গ্রহণ করে ByRef, সুতরাং এটি সংজ্ঞায়িত করতে অক্ষরগুলি ব্যবহার করার দরকার নেই।

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

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

Sub a()
b = 0
Debug.Print c(b) ' This will print 0, and b will equal 1.'
End Sub
Function c(d)
c = d
d = d + 1
End Function

7

তাত্ক্ষণিক উইন্ডোতে ভিবিএ কোড লিখুন এবং চালান

তাত্ক্ষণিক উইন্ডো কোনও বৈধ ভিবিএ এক্সিকিউটেবল স্টেটমেন্টকে মূল্যায়ন করে। কোড সম্পাদক হিসাবে আপনি কেবল উইন্ডোতে স্টেটমেন্ট প্রবেশ করুন। এটি দ্রুত ভিবিএ কোড কার্যকর করে এবং এটি অনেকগুলি অতিরিক্ত অক্ষর সংরক্ষণ করতে পারে কারণ:

  1. বিবৃতি শুরুর দিকে প্রশ্ন চিহ্ন (?) রেখে তাত্ক্ষণিক উইন্ডোটিকে আপনার কোডের ফলাফল প্রদর্শন করতে বলে।

এখানে চিত্র বর্ণনা লিখুন

  1. আপনার কোডে আপনাকে একটি সাব এবং শেষ সাব ব্যবহার করার দরকার নেই।

এখানে চিত্র বর্ণনা লিখুন


ট্যাগ দিয়ে পিপিসিজির পোস্টের উত্তর দেওয়ার জন্য তাৎক্ষণিক উইন্ডোতে ভিবিএ কোডের উদাহরণ এখানে রয়েছে : A ছাড়াই একটি অক্ষর

?Chr(88-23);

জফান উত্তর দিয়েছেন


ক্রেডিট চিত্রগুলি: এক্সেল ক্যাম্পাস


1
এটি একটি REPL পরিবেশ ব্যবহার করে যদিও? তার মানে এটি কেবল একটি স্নিপেট, কোনও প্রোগ্রাম বা অনুষ্ঠান নয়
শৃঙ্খলাবদ্ধ coinheringaahing

আমি মনে করি যোগ করার জন্য আরও একটি উদাহরণ হতে পারে আপনি ভেরিয়েবলগুলি ইনলাইনও তৈরি করতে পারেন; যেমন a="value":?aপ্রথমে এর মান নির্ধারণ করে a, তারপরে এটি মুদ্রণ করে।
লোভো

6

লুপিংয়ের আগে শর্তসাপেক্ষ চেক

লুপের সাথে একত্রে ব্যবহৃত হলে কিছু শর্তসাপেক্ষ চেকগুলি অতিরিক্ত কাজ করে। উদাহরণস্বরূপ, Forশুরুর শর্তটি চলমান অবস্থার বাইরে থাকা অবস্থায় একটি লুপ প্রক্রিয়া করবে না।

অন্য কথায়, এটি ( 49 টি অক্ষর):

If B > 0 Then
For C = A To A + B
'...
Next
End If

এটি ( 24 অক্ষর) এ রূপান্তরিত হতে পারে :

For C = A To A + B ' if B is 0 or less, then the code continues past Next, unabated.
'...
Next

নীচে মন্তব্যটি ভুল। যদি বি = 0 হয় তবে লুপটি প্রবেশ করানো হবে। পেস্টবিন.
com

5

পরিবর্তনশীল ঘোষণা

ভিবিএ-র বেশিরভাগ ক্ষেত্রে, আপনি ছেড়ে যেতে পারেন Option Explicit(প্রায়শই যে কোনওভাবেই ডিফল্টরূপে বাদ দেওয়া হয়) এবং Dimআপনার প্রচুর ভেরিয়েবলগুলি যুক্ত করতে পারেন।

এটি করার ক্ষেত্রে এটি ( 96 টি চর):

Option Explicit

Sub Test()
Dim S As String
Dim S2 As String
S = "Test"
S2 = S
MsgBox S2
End Sub

এটি হয়ে যায় ( 46 টি চর):

Sub Test()
S = "Test"
S2 = S
MsgBox S2
End Sub

আপনার যদি কিছু নির্দিষ্ট অবজেক্ট ব্যবহার করার প্রয়োজন হয় (উদাহরণস্বরূপ, অ্যারে), আপনার এখনও Dimসেই পরিবর্তনশীলের প্রয়োজন হতে পারে ।


এক সেকেন্ড অপেক্ষা করুন, আপনি নিজের প্রশ্নের নিজের উত্তরটি স্বীকার করেছেন। ভাল না, ডুড।
টেলর স্কট

1
@ টেলরস্কট এটি একটি উইকি পোস্ট - কোনও পয়েন্ট নয় এবং এক্ষেত্রে একটিও সেরা উত্তর নেই। :) আমি আমার প্রশ্ন তালিকায় পতাকা না এড়াতে ~ 5 বছর আগে উত্তরটি গ্রহণ করি।
গাফি

1
@ টেলরস্কট এছাড়াও যদি আপনি নিজের উত্তরটি স্বীকার করেন, আপনি +15 বা +2 পাবেন না (গ্রহণের জন্য)
শয্যাশায়ী coinheringaahing

5

Evaluate() এবং []

পূর্বে উল্লেখ করা হয়েছে যে, হার্ড-কোডেড রেঞ্জ কলগুলি বর্গাকার বন্ধনী [A1]নোটেশন ব্যবহার করে হ্রাস করা যেতে পারে । তবে এটির চেয়ে অনেক বেশি ব্যবহার রয়েছে।

এমএসডিএন ডকুমেন্টেশন অনুসারে , Application.Evaluate()পদ্ধতিটি একটি একক আর্গুমেন্ট গ্রহণ করে, যা Nameমাইক্রোসফ্ট এক্সেলের নামকরণ কনভেনশন দ্বারা সংজ্ঞায়িত একটি is

এনবি [string]শর্টহ্যান্ডের জন্য রয়েছে Evaluate("string")( ""স্ট্রিং ডেটাটাইপকে বোঝাতে স্পিচ চিহ্নগুলি নোট করুন ), যদিও কয়েকটি গুরুত্বপূর্ণ পার্থক্য রয়েছে যা শেষে coveredেকে দেওয়া হয়েছে।

ব্যবহারের ক্ষেত্রে এর অর্থ কী?

মূলত, [some cell formula here]একটি এক্সেল ওয়ার্কশিটে একটি ঘর প্রতিনিধিত্ব করে, এবং আপনি এটিতে বেশ কিছু দিতে পারেন এবং এটি থেকে সাধারণ কোনও ঘর দিয়ে যা কিছু পেতে পারেন

কি ভিতরে যায়

সংক্ষেপে, উদাহরণ সহ

  • এ 1-স্টাইলের রেফারেন্স। সমস্ত রেফারেন্স পরম রেফারেন্স হিসাবে বিবেচনা করা হয়।
    • [B7] সেই ঘরে একটি রেফারেন্স দেয়
    • রেফারেন্স যেমন নিখুঁত, ?[B7].Addressফিরতি"B$7$"
  • রেঞ্জস আপনি রেফারেন্স সহ ছেদ করতে পারেন এবং ইউনিয়ন অপারেটরগুলি (যথাক্রমে কোলন, স্পেস এবং কমা) ব্যবহার করতে পারেন।
    • [A1:B5]A1:B5(রেঞ্জ) এ একটি পরিসীমা রেফারেন্স প্রদান করে
    • [A1:B5 A3:D7]A3:B5(ছেদ করা) এর একটি পরিসীমা রেফারেন্স প্রদান করে
    • [A1:B5,C1:D5]A1:D5(প্রযুক্তিগতভাবে A1:B5,C1:D5) (ইউনিয়ন) এর একটি পরিসীমা রেফারেন্স প্রদান করে
  • সংজ্ঞায়িত নাম
    • ব্যবহারকারী সংজ্ঞায়িত যেমন [myRange]A1: G5 উল্লেখ হিসাবে
    • স্বয়ংক্রিয়, যেমন টেবিলের নামগুলি [Table1](কোডগল্ফের জন্য সম্ভবত কম কার্যকর)
    • আপনি [Formulas]> [Name Manager]মেনুতে আর কিছু খুঁজে পেতে পারেন
  • সূত্র
    • খুব দরকারী ; যে কোনও সূত্র যে কোনও ঘরে যেতে পারে সেগুলি প্রবেশ করতে পারে Evaluate()বা যেতে পারে[]
    • [SUM(1,A1:B5,myRange)]MyRange এখানে রেঞ্জের মানগুলিতে অঙ্কের গাণিতিক যোগফল প্রদান করে একটি ভিবিএ ভেরিয়েবল নয় এমন একটি ওয়ার্কবুকের নামকে বোঝায়
    • [IF(A1=1,"true","false")](ভিবিএ সমমানের চেয়ে 1 বাইট কম Iif([A1]=1,"true","false"))
    • অ্যারে সূত্রগুলি [CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]- সমস্ত স্ট্রিংয়ের সাথে যুক্ত হয় যার দৈর্ঘ্য কোনও স্থানের সাথে 2 এর চেয়ে বেশি
  • বাহ্যিক রেফারেন্স
    • আপনি !কোনও কক্ষ বা অন্য ওয়ার্কবুকে সংজ্ঞায়িত একটি নাম উল্লেখ করতে অপারেটরটি ব্যবহার করতে পারেন
    • [[BOOK1]Sheet1!A1]BOOK1 অথবা ক 1 করার জন্য একটি ব্যাপ্তির রেফারেন্স ফেরত পাঠায় ['[MY WORKBOOK.XLSM]Sheet1!'A1]একই জন্যMY WORKBOOK
    • 'তাদের নামের ফাঁকা জায়গা সহ ওয়ার্কবুকগুলির জন্য এবং ডিফল্ট নামযুক্ত ওয়ার্কবুকগুলির জন্য এক্সটেনশনের অভাব নোট করুন ( BOOK+n)
  • চার্ট অবজেক্টস (এমএসডিএন নিবন্ধটি দেখুন)

এনবি আমি এই তথ্যের জন্য এসও-তে একটি প্রশ্ন জিজ্ঞাসা করেছি, সুতরাং আরও ভাল ব্যাখ্যার জন্য সেখানে একবার দেখুন

কী বেরিয়ে আসে

যা goesুকে যায় তার মতোই, যা প্রকাশিত হয় তার মধ্যে এমন কোনও কিছু অন্তর্ভুক্ত থাকে যা কোনও কার্যপত্রক ঘর ফিরে আসতে পারে। এগুলি হ'ল স্ট্যান্ডার্ড এক্সেল ডেটা ধরণের (এবং তাদের ভিবিএ সমতুল্য):

  • যৌক্তিক ( Boolean)
  • পাঠ্য ( String)
  • সংখ্যাসূচক ( Double)
  • ত্রুটি ( Variant/Error) (এগুলি নন-ব্রেকিং ত্রুটি, অর্থাত্‍ এগুলি কোড প্রয়োগ কার্যকর করে না, ?[1/0]জরিমানা কার্যকর করে)

তবে কয়েকটি জিনিস ফিরে যেতে পারে যা কোষগুলি করতে পারে না:

  • পরিসীমা রেফারেন্স ( Range) (উপরের বিভাগগুলি দেখুন)
  • অ্যারে ( Variant())

অ্যারেগুলির

যেমন দেখানো হয়েছে, []অ্যারে সূত্রগুলি মূল্যায়ন করতে ব্যবহার করা যেতে পারে যা স্ট্যান্ডার্ড এক্সেলের ডেটা ধরণের একটিকে ফেরত দেয়; যেমন [CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]যা আয় Text। তবে টাইপের Evaluateঅ্যারেগুলিও ফিরে আসতে পারে Variant। এগুলি হতে পারে

হার্ডকোডেড:

[{1,2;3,4}]- 2D অ্যারে আউটপুট দেয়: ,কলাম বিভাজক, ;সারি পৃথক করে। 1D অ্যারে আউটপুট করতে পারে

অ্যারে সূত্রগুলি:

[ROW(A1:A5)]- একটি 2 ডি অ্যারের আউটপুট {1,2,3,4,5}, অর্থাৎ (2,1) দ্বিতীয় আইটেম (এখনও কিছু ফাংশন আউটপুট 1 ডি অ্যারে)

  • যে কারণেই হোক না কেন, কিছু ফাংশন ডিফল্টরূপে অ্যারে ফেরায় না

[LEN(A1:A5)] কেবল কোনও ব্যাপ্তির প্রথম কক্ষে পাঠ্যের দৈর্ঘ্যকে আউটপুট দেয়

  • তবে এগুলি জোর করে অ্যারে দিতে পারে

Split([CONCAT(" "&LEN(A1:A5))]) 1 থেকে 1 অ্যারে দেয় 0 থেকে 5, যেখানে প্রথম আইটেমটি খালি

[INDEX(LEN(A1:A5),)]অন্য কাজের মত, মূলত আপনার পছন্দসই অ্যারে রিটার্নিং আচরণ পেতে আপনার অ্যারে হ্যান্ডলিং ফাংশনটি অবশ্যই নিয়োগ করতে হবে, RAND()আপনার কার্যপত্রকের সূত্রগুলিকে অস্থির করতে অর্থহীন যুক্ত করার অনুরূপ ।

  • আমি এসও-তে একটি প্রশ্ন জিজ্ঞাসা করেছিলাম এটি সম্পর্কে আরও কিছু ভাল তথ্য পাওয়ার চেষ্টা করার জন্য দয়া করে যদি এগুলি খুঁজে পান তবে আরও ভাল বিকল্পের সাথে সম্পাদনা / মন্তব্য করুন

Evaluate() বনাম []

তার মাঝে একটি কয়েক পার্থক্য আছে Evaluate()এবং []সচেতন হতে হবে

  1. স্ট্রিং বনাম হার্ডকোডযুক্ত
    • সম্ভবত সবচেয়ে গুরুত্বপূর্ণ পার্থক্য, মূল্যায়ন একটি স্ট্রিং ইনপুট নেয় যেখানে [] একটি হার্ডকোডযুক্ত ইনপুট প্রয়োজন
    • এর মানে হল আপনার কোড ভেরিয়েবল সঙ্গে স্ট্রিং যেমন বিল্ড আপ করতে পারেন Evaluate("SUM(B1,1,"&v &",2)")যোগফল হবে [B1], 1, 2এবং পরিবর্তনশীলv
  2. অ্যারেগুলির

    কোনও অ্যারে ফেরত দেওয়ার সময়, অ্যারে সূচক দিয়ে কেবল মূল্যায়ন ব্যবহার করা যায়

    v=Evaluate("ROW(A1:A5)")(1,1) ''#29 bytes

    সমতুল্য

    i=[ROW(A1:A5)]:v=i(1,1) ''#23 bytes

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

1
আসলে অ্যারেতে শেষ বিভাগটি কিছুটা বন্ধ - এটি তাত্ক্ষণিক উইন্ডোতে ব্যবহার করা যেতে পারেi=[ROW(A1:A5)]:v=i(2,1):?v
টেলর স্কট

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

এই ম্যাচ দিয়ে কাজ করে? আমি চেষ্টা করেছি, তবে এটি সর্বদা ত্রুটিগুলি ফিরিয়ে দেয়। যদিও আমি রেঞ্জের পরিবর্তে একটি অ্যারে পাস করছিলাম।
seadoggie01

5

Nextবিবৃতি একত্রিত করুন

Next:Next:Next

নিচে নামানো হতে পারে

Next k,j,i

যেখানে জন্য iterators Forলুপ হয় i, jএবং k- যাতে।

উদাহরণস্বরূপ নীচের (By৯ বাইট)

For i=0To[A1]
For j=0To[B1]
For k=0To[C1]
Debug.?i;j;k
Next
Next
Next

65 বাইটে নিচে নামানো যেতে পারে

For i=0To[A1]
For j=0To[B1]
For k=0To[C1]
Debug.?i;j;k
Next k,j,i

এবং যতদূর এই ফর্ম্যাটিং এবং ইন্ডেন্টেশনকে কীভাবে প্রভাবিত করে, আমি মনে করি এটি পরিচালনা করার সেরা পদ্ধতির পরবর্তী বিবৃতিটি বিবৃতিটির জন্য বাইরের সর্বাধিকের সাথে সারিবদ্ধ করে রাখা হয়েছে। যেমন।

For i=0To[A1]
    For j=0To[B1]
        For k=0To[C1]
            Debug.?i;j;k
Next k,j,i

4

Ifবিবৃতি হ্রাস করা হচ্ছে

শর্তসাপেক্ষ If ... Then ... Elseচেক ব্যবহার করে কোনও ভেরিয়েবল নির্ধারণের সময় , আপনি End Ifপুরো চেকটি এক লাইনে রেখে মুছে ফেলা ব্যবহার করে কোডের পরিমাণ কমিয়ে আনতে পারেন ।

উদাহরণস্বরূপ, এটি ( 37 টি অক্ষর):

If a < b Then
c = b
Else
c = a
End If

এটিতে হ্রাস করা যেতে পারে ( 30 টি অক্ষর)

If a < b Then c = b Else c = a

আপনার যদি একাধিক নেস্টেড শর্তসাপেক্ষ থাকে তবে আপনি এগুলি সেভাবেও ছোট করতে পারেন:

If a Then If b Then If c Then Z:If d Then Y:If e Then X Else W Else V:If f Then U 'Look ma! No "End If"!

নোটটি :আপনাকে Ifব্লকের মধ্যে একাধিক লাইন / কমান্ড যুক্ত করতে দেয় ।

এর মতো সাধারণ ক্ষেত্রে, আপনি সাধারণত চেক ( 25 টি অক্ষর) এর Elseআগে ভেরিয়েবল সেট করে মুছে ফেলতে পারেন :If

c = a
If a < b Then c = b

আরও ভাল, উপরের IIf()ক্রিয়াকলাপটি ব্যবহার করে এটি আরও কমিয়ে আনা যেতে পারে ( 20 টি চর):

c = IIf(a < b, b, a)

3

Range("A1")কলগুলি হ্রাস করুন এবং লাইক করুন

Range("A1").Value(17 বাইট) এবং সরল Range("A1")(11 বাইট) কমিয়ে [A1](4 বাইট) করা যেতে পারে


2
বা সাধারণভাবে, ভিবিএতে []প্রতিস্থাপনের ব্যবহার Evaluate()কেবলমাত্র রেঞ্জ কলগুলির চেয়ে অনেক বেশি বহুমুখী। উদাহরণস্বরূপ আপনি এটিকে WorksheetFunction.FuncName(args)স্রেফ প্রতিস্থাপন করতে ব্যবহার করতে পারেন [FuncName(args)], যেমন ?[SUMPRODUCT({1,3,5},{2,7,-1})]বা খুব দরকারী [MIN(1,2,3)]/[MAX(1,2,3)]
গ্রিডো

লোভ, এটি একটি অবিশ্বাস্যরূপে গুরুত্বপূর্ণ কার্যকারিতা যা আপনার সম্পর্কে আমি অবগত ছিল না this এটির নিজের উত্তর হিসাবে এটি যুক্ত করা উচিত।
টেলর স্কট

1
নিশ্চিত কথা, আমি খুব শীঘ্রই কিছু লিখব। হ্যাঁ Evaluate("str")বা শর্টহ্যান্ড [str]ভিবিএতে খুব শক্তিশালী, আমি সম্প্রতি সন্ধান করেছি এবং আমি অনুমান করছি যে এটি গল্ফিংয়ের জন্যও কার্যকর হবে!
লোভো

খুব দরকারী, যথেষ্ট যে আমি আমার উত্তরগুলি দিয়ে ফিরে যাচ্ছি তা দেখার জন্য আমি কোনও কারণে আমার বাইটাকেট বাদ দিতে পারি কিনা
টেলর স্কট

3

স্পেস সরান

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

আসল সংস্করণ: (188 বাইট)

Sub g(n)
For i = 0 To 1
For x = -3 To 3 Step 0.05
y = n ^ x * Cos(Atn(1) * 4 * x)
If y < m Then m = y
If i = 1 Then Cells(500 * (1 - y / m) + 1, (x + 3) * 100 + 1) = "#"
Next
Next
End Sub

হ্রাস সংস্করণ: (146 বাইট)

Sub g(n)
For i=0To 1
For x=-3To 3Step 0.05
y=n^x*Cos(Atn(1)*4*x)
If y<m Then m=y
If i=1Then Cells(500*(1-y/m)+1,(x+3)*100+1)="#"
Next
Next
End Sub

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

  • কোনও গাণিতিক অপারেশনের আগে এবং পরে: +-=/*^ইত্যাদি
  • এর আগে Toএবং Stepএকটি Forবিবৃতিতে:For x=-3To 3Step 0.05
  • আসলে, কোন সংরক্ষিত করার আগে কোনো শব্দ ( To, &, Then, ইত্যাদি) এটা একটি সংখ্যা হিসাবে একটি আক্ষরিক যেমন পূর্বে থাকলে, ), ?, %, ইত্যাদি
  • &স্ট্রিং সমন্বয় করার পরে :Cells(1,1)=Int(t)&Format(t,":hh:mm:ss")
  • ফাংশন কল করার পরে: If s=StrReverse(s)Then
  • ফাংশন কলগুলির মধ্যে: Replace(Space(28)," ",0)

স্বতঃ-বিন্যাসের মাধ্যমে অতিরিক্ত স্থান ছাড়ানো অক্ষরগুলির বিধি কি on আমি দেখতে ?বনাম এর মতো কিছু Printগ্রহণযোগ্য, তবে &যেমন ভেরিয়েবল যেমন Debug.?a&"z"দেয় ততক্ষন পরে টাইপ ডিক্লেয়ারেশন রাখে Debug.Print a&; "z";এই এখনও অনুমতি দেওয়া হয় - চরিত্র যোগ অপরিহার্য চালানোর কোড জন্য?
লোভো

2
@ গ্রিডো আমি এটি মেটা উত্তর দ্বারা বর্ণিতভাবে দেখছি : আপনি যদি এটি সম্পাদকে অনুলিপি / পেস্ট করতে পারেন এবং কোডটি চলবে, ঠিক আছে। IE, আপনি কোডটি পেস্ট করার সময় যদি ভিবিএ স্বয়ংক্রিয়ভাবে চরিত্রটি যুক্ত করে, তবে ঠিক আছে।
ইঞ্জিনিয়ার টোস্ট

1
@EngineerToast আপনি আসলে আপনার উদাহরণ দেখা বন্ধ আরও একটি বাইট ড্রপ করতে পারেন: If i=1 Then হতে পারে If i=1Then , কারণ একটি সাধারণ নিয়ম একটি সংরক্ষিত শব্দ করে একটি আক্ষরিক নিম্নরূপ হতে একটি নম্বর, ), ?, %, .. ইত্যাদি, একটি দ্বারা পৃথক করা প্রয়োজন নেই স্পেস
টেলর স্কট

1
@ ইঞ্জিনিয়ারস্টোস্ট, আপনি আপনার তৃতীয় বুলেট পয়েন্ট থেকে একটি বাইটও ফেলে দিতে পারেন যেহেতু আপনি একটি )(বা অন্য কোনও অ- &
টেলর স্কট

3

পিক্সেল আর্টের জন্য প্রস্তুত করুন

পিক্সেল আর্ট হ'ল এক্সেলের অন্যতম শক্তিশালী অঞ্চল, কেননা ক্যানভাস নির্মাণের দরকার নেই, কারণ এটি ইতিমধ্যে আপনার জন্য রয়েছে - আপনাকে যা করতে হবে তা হল কিছু ছোট সামঞ্জস্য করা

1) কোষগুলি বর্গাকার করুন

Cells.RowHeight=48

বা, বিকল্পভাবে, আরও 1 বাইটের জন্য, তবে কাজ করা আরও সহজ easier

Cells.ColumnWidth=2

2) প্রয়োজনীয় পরিসীমা রঙ করুন

যে কোনও Rangeবস্তু কল করে রঙিন হতে পারে

`MyRangeObj`.Interior.Color=`ColorValue`

দ্রষ্টব্য: এটি এবং এই উইকের উপরে উল্লিখিত অন্যান্য কৌশলগুলির সাথে একত্রিত হওয়া উচিত, যেমন একটি বা কল ব্যবহারের জন্য []স্বরলিপি ব্যবহার করে (যেমন [A1:R5,D6]) রেফারেন্সিং রেঞ্জগুলি । এছাড়াও, এই উইকিতে উল্লিখিত হিসাবে এটি রঙিন রেফারেন্সের আকারটি গল্ফের সাথে নেতিবাচক রঙের মানের সাথে মিলিত হতে পারে Cells(r,c)Range(cellAddress)

দ্রুত তথ্যসূত্র

ব্যাপ্তি উল্লেখ

কোষটি A1নিম্নলিখিত যে কোনও উপায়ে উল্লেখ করা যেতে পারে

Range("A1")
Cells(1,1)
[A1]

এবং ব্যাপ্তি A1:D4নিম্নলিখিত যে কোনও উপায়ে উল্লেখ করা যেতে পারে

Range("A1:D4")
Range("A1").Resize(4,4)
Cells(1,1).Resize(4,4)
[A1].Resize(4,4,)
[A1:D4]

রঙের রেফারেন্স

Black  0
White  -1
Red    255
Aqua   -256

3

অন্তর্নির্মিত কার্যাদি সরল করুন ify

নির্দিষ্ট ফাংশন ঘন ঘন ব্যবহার করার সময় তাদের ব্যবহারকারী-সংজ্ঞায়িত ফাংশনে পুনরায় নিয়োগ করুন।

নিম্নলিখিত কোড ( 127 অক্ষর) থেকে হ্রাস করা যেতে পারে:

Sub q()
w = 0
x = 1
y = 2
z = 3
a = Format(w, "0.0%")
b = Format(x, "0.0%")
c = Format(y, "0.0%")
d = Format(z, "0.0%")
End Sub

থেকে ( 124 চর):

Sub q()
w = 0
x = 1
y = 2
z = 3
a = f(w)
b = f(x)
c = f(y)
d = f(z)
End Sub
Function f(g)
f = Format(g, "0.0%")
End Function

এটি বাইরফ ট্রিকের সাথে একত্রিত করে আপনি আরও বেশি অক্ষর সংরক্ষণ করতে পারবেন ( ১১৪ এর নিচে ):

Sub q()
w = 0
x = 1
y = 2
z = 3
a = f(w)
b = f(x)
c = f(y)
d = f(z)
End Sub
Sub f(g)
g = Format(g, "0.0%")
End Sub

এটি ন্যায়বিচারের সাথে করুন, কারণ ভিবিএ এ-এর সংজ্ঞা দিতে অনেকগুলি অক্ষর গ্রহণ করে Function। দ্বিতীয় কোড ব্লকটি আসলে যে কোনও সংখ্যক কম Format()কল দিয়ে প্রথমটির চেয়ে বড় হবে ।


2
শেষেরটিতে আপনার অ্যাসাইনমেন্ট কলের দরকার নেই, যার অর্থ a = f(w)হ্রাস করা যেতে পারেf w
টেলর স্কট

3

STDIN এবং STDOUT

থেকে ইনপুট করার Subরুটিন এবং Functionইনপুট বৈপরিত্য মাধ্যমে গুলি

Public Sub A(ByRef B as String)

কমে যেতে পারে

Sub a(b$) 

Publicএবং ByRefকল VBA এবং এইভাবে অন্তর্নিহিত জন্য ডিফল্ট, এবং (প্রায়) সবসময় বাদ করা যেতে পারে।

টাইপ আক্ষরিক $বাহিনী টাইপ bহতে হবে String

অন্যান্য ধরণের আক্ষরিক

  • ! একক
  • @ মুদ্রা
  • # ডবল
  • % পূর্ণসংখ্যা
  • $ দড়ি
  • & দীর্ঘ
  • ^ দীর্ঘতরং (কেবলমাত্র 64 বিট)

তদ্ব্যতীত, এটি সাধারণত গৃহীত হয় যে আপনি ইনপুট ভেরিয়েবলটি ডিফল্ট টাইপ হিসাবে Variantছেড়ে দিতে পারেন এবং কোনও টাইপ-ভিত্তিক ত্রুটিগুলি আনহ্যান্ডেল ছাড়তে পারেন। যেমন। Sub E(F)যার Fমধ্যে প্রকারের প্রত্যাশিত Boolean[](যা রুটিনের মতো পাস হবে E Array(True, False, False))

Subরুটিনগুলিতে ইনপুট করা এবং এর মাধ্যমে উইন্ডো ফাংশনগুলির তত্ক্ষণাতCells

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

এক্সেল ইন, সাধারণত কোনও ঘর বা কক্ষের পরিসীমা থেকে ইনপুট নিতে গৃহীত হয়, যা এর মতো হতে পারে

s=[A1]

যা .valueকোষ থেকে স্পষ্টতই রাখে [A1](যা হিসাবে cells(1,1)বা হিসাবেও উল্লেখ করা যেতে পারেrange("A1")

উদাহরণ সমস্যার: একটি বার্তা বাক্সে ইনপুট প্রদর্শন করুন

সাবরুটাইন মাধ্যমে Sub A:msgbox[A1]:End Sub

উইন্ডো ফাংশন ইমিমেডিয়েটসের মাধ্যমে msgbox[A1]

শর্তসাপেক্ষ সংকলন যুক্তিগুলির মাধ্যমে ইনপুট করা

ভিবিএ প্রকল্পগুলি কমান্ড লাইন থেকে বা ভিবিপ্রজেক্ট বৈশিষ্ট্যগুলির মাধ্যমে যুক্তিগুলি সমর্থন করে (প্রকল্প এক্সপ্লোরারের মাধ্যমে দেখুন -> [আপনার ভিবিএ প্রকল্প] - (ডান ক্লিক করুন) -> ভিবিপ্রজেক্ট সম্পত্তি -> শর্তসাপেক্ষ সংকলন যুক্তি)

এটি ত্রুটি কোড চ্যালেঞ্জগুলির জন্য মূলত কার্যকর

শর্তসাপেক্ষ সংকলন আর্গুমেন্ট দেওয়া n=[কিছু_মূল্য] এটি কার্যকর করার কোডের জন্য মঞ্জুরি দেয় যা এরর মানের ভিত্তিতে একটি ত্রুটি কোড তৈরি করবে n। দ্রষ্টব্য, n=এটি ভিবিপ্রজেক্ট প্রপার্টি প্যানের শর্তসাপেক্ষ সংকলন যুক্তি বিভাগে আপনার কোডে 2 বাইট যুক্ত করার জন্য কল করে ।

উদাহরণ কোড

...
#If n=3 then
return ''  Produces error code '3', Return without GoSub
#ElseIf n=20 then
resume ''  Produces error code '20', Resume without Error
#EndIf
...

ফাংশন মান মাধ্যমে আউটপুটিং

এখানে খুব বেশি কিছু বলা যায় না, নীচে উদ্ধৃত সাধারণ ফর্মটি প্রায় কমপ্যাক্ট হিসাবে তৈরি করা যায়।

Public Function A(b)
    ...
    A=C
End Function

দ্রষ্টব্য: বিস্তৃত ক্ষেত্রে এটি আরও বাইট পদ্ধতিটিকে একটি সাবরুটিন এবং আউটপুটকে ভিবিই ইমিডিয়েট উইন্ডোতে রূপান্তরিত করে (নীচে দেখুন)

রুটিনগুলি থেকে Subও ভিবিই Functionইমিডিয়েট উইন্ডো দিয়ে আউটপুটিং

টেক্সট ভিত্তিক চ্যালেঞ্জগুলির জন্য ভিবিএর জন্য ভিবিই ইমিডিয়েট উইন্ডো (একো ভিবিই ডিবাগ উইন্ডো) আউটপুটিং একটি সাধারণ আউটপুট পদ্ধতি, তবে, এটি মনে রাখা গুরুত্বপূর্ণ যে Debug.Print "Text"কলটি যথেষ্ট গল্ফড হতে পারে।

Debug.Print "Text"

কার্যত অভিন্ন

Debug.?"Text"

?অটোফর্ম্যাট হিসাবে Print

Subরুটিনগুলি এবং ভিবিই ইমিডিয়েট উইন্ডো ফাংশনগুলি থেকে অন্য পদ্ধতির মাধ্যমে আউটপুটিং

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


2

ফর্ম্যাট করার বিষয়ে দ্রুত নোট

কারণ StackExchange ব্যবহার Markdown এবং Prettify.js এটা আপনার কোডিং উত্তর, যা সাধারণত তোলে তাদের আরো পেশাদার দেখুন একটি ভাষা পতাকা যোগ করা সম্ভব। যদিও আমি গ্যারান্টি দিতে পারি না যে এটি আপনাকে ভিবিএতে গল্ফ করার ক্ষেত্রে আরও ভাল করে তুলবে, আমি গ্যারান্টি দিতে পারি যে এটি আপনাকে আপনার মতো দেখায়।

নীচের পতাকাগুলির মধ্যে দুটি যোগ করা রূপান্তরিত হবে

Public Sub a(ByRef b As Integer) ' this is a comment

প্রতি

Public Sub a(ByRef b As Integer) ' this is a comment

ভিবিএ ভাষা ট্যাগসমূহ

<!-- language: lang-vb -->

<!-- language-all: lang-vb -->

দ্রষ্টব্য: পরেরটি আপনার উত্তরে সমস্ত কোড বিভাগকে রূপান্তরিত করে, পূর্ববর্তী কেবল তত্ক্ষণাত নিম্নলিখিত কোড বিভাগগুলিকে রূপান্তর করে


lang-vbঅঁ্যা? - lang-vbaআশ্চর্যজনক যে ভিবিএ উত্তরের চেয়ে ফর্ম্যাটগুলি আরও ভাল ।
লোভ

1
@ গ্রিডো, কারণ lang-vbaহাইলাইট দেওয়ার সময় এটি কেবলমাত্র ডিফল্ট হাইলাইট করা হবে। স্পষ্টতই ভিবিএ বাস্তবায়িত হয়নি প্রিট্টিফাই.জেজে, তাই আমাদের ভিবি হাইলাইটের সাথে লেগে থাকতে হবে
টেলর স্কট

2

একাধিক If .. Thenচেক

অন্যান্য ভাষার মতো, একাধিক Ifচেককে সাধারণত একক লাইনে একত্রিত করা যায়, যা And/ Or(ie &&/ ||সি এবং অন্যান্য) ব্যবহারের অনুমতি দেয় , যা ভিবিএতে a Thenএবং an উভয়কে প্রতিস্থাপন করে End If

উদাহরণস্বরূপ, নেস্টেড শর্তসাপেক্ষে ( 93 অক্ষর):

'There are MUCH easier ways to do this check (i.e. a = d).
'This is just for the sake of example.
If a = b Then
    If b = c Then
        If c = d Then
            MsgBox "a is equal to d"
        End If
    End If
End If

( 69 টি চর) হয়ে উঠতে পারে :

If a = b And b = c And c = d Then
    MsgBox "a is equal to d"
End If

এটি নেস্টেড শর্তসাপেক্ষেও কাজ করে।

বিবেচনা করুন ( ৮৪ টি চর):

If a = b Then            
    d = 0
End If

If c = b Then            
    d = 0
End If

এটি হয়ে উঠতে পারে ( ৫১ টি চর):

If a = b Or c = b Then            
    d = 0
End If

1
যদি - এর পরে বিবরণ দেয় "শেষ - যদি" ​​অংশটি isচ্ছিক আপনি একক লাইনে কোড লেখেন।
বোকা_ইন্টার্ন

পুনঃটুইট এই অন্যান্য উত্তরটিও
গাফি

উপরের বিবৃতিটি আরও d=iif(a=b or c=b,0,d)
টেলর স্কট

2

Forলুপগুলি শেষ হচ্ছে

Forলুপগুলি ব্যবহার করার সময় , একটি Nextলাইনের কোনও ভেরিয়েবল নামের প্রয়োজন হয় না (যদিও এটি সাধারণত কোডিংয়ে ব্যবহার করা ভাল better

অতএব,

For Variable = 1 to 100
    'Do stuff
Next Variable

সংক্ষিপ্ত করা যেতে পারে:

For Variable = 1 to 100
    'Do stuff
Next

(সঞ্চয়গুলি আপনার পরিবর্তনশীল নামের উপর নির্ভর করে, আপনি যদি গল্ফ করছেন তবে এটি সম্ভবত 1 অক্ষর + 1 স্থান।)


1
2 টি অক্ষর, স্থান গণনা করতে ভুলবেন না!
11684

আমি প্রায় কখনও চলকটি সনাক্ত করতে পারি না, এমনকি সাধারণ কোডেও!
dnep

2

একটি স্ট্রিংকে একটি অক্ষরের অ্যারেতে বিভক্ত করুন

কখনও কখনও পৃথক অক্ষরের মধ্যে একটি স্ট্রিং বিচ্ছিন্ন করা দরকারী হতে পারে, তবে এটি ভিবিএতে ম্যানুয়ালি এটি করতে কিছুটা কোড নিতে পারে।

ReDim a(1 To Len(s))
' ReDim because Dim can't accept non-Const values (Len(s))
For i = 1 To Len(s)
    a(i) = Mid(s, i, 1)
Next

পরিবর্তে, আপনি কাজটি করতে একটি একক লাইন, অপেক্ষাকৃত ন্যূনতম শৃঙ্খলা ব্যবহার করতে পারেন:

a = Split(StrConv(s, 64), Chr(0))

এটি আপনার স্ট্রিং ধার্য হবে sথেকে Variantঅ্যারের a। সতর্কতা অবলম্বন করুন, যদিও অ্যারের শেষ আইটেমটি খালি স্ট্রিং ( "") হবে, যা সঠিকভাবে পরিচালনা করা দরকার।

এটি কীভাবে কাজ করে তা এখানে: StrConvফাংশনটি Stringআপনার নির্দিষ্ট করে অন্য ফর্ম্যাটে রূপান্তর করে । এই ক্ষেত্রে, 64 = vbUnicode, সুতরাং এটি একটি ইউনিকোড ফর্ম্যাটে রূপান্তর করে। সাধারণ ASCII স্ট্রিংগুলির সাথে কাজ করার সময়, ফলাফলটি ""প্রতিটি অক্ষরের পরে aোকানো শূন্য অক্ষর (খালি স্ট্রিং নয় )।

নিম্নলিখিত Splitতারপর ফলে রূপান্তর করবে Stringএকটি অ্যারের মধ্যে, নাল অক্ষর ব্যবহার Chr(0)একটি বিভেদক হিসাবে।

এটি লক্ষ করা গুরুত্বপূর্ণ যে Chr(0)খালি স্ট্রিংয়ের মতো নয় ""এবং এটি ব্যবহার Splitকরে ""আপনি যে অ্যারে আশা করতে পারেন তা ফিরিয়ে দেবে না। এটি একই ক্ষেত্রে সত্য vbNullString(তবে আপনি যদি গল্ফ করছেন তবে কেন আপনি প্রথমদিকে এমন ভার্জোজ ধ্রুবক ব্যবহার করবেন?)।


আপনার উল্লেখ করা উচিত যে ফলস্বরূপ অ্যারের শেষে অতিরিক্ত খালি স্ট্রিং থাকে।
হাওয়ার্ড 5

@ হ্যাওয়ার্ড হ্যাঁ, আমার উচিত। আমি এটি টাইপ করার সময় এটি আমার মাথায় ছিল, অবশ্যই আমার মন পিছলে গেছে।
গাফী

2

ব্যবহার With(কখনও কখনও! পাদটীকা দেখুন)

Withআপনি যদি কিছু জিনিস বারবার ব্যবহার করেন তবে বিবৃতিটি ব্যবহার করা আপনার কোডের আকারকে উল্লেখযোগ্যভাবে হ্রাস করতে পারে।

অর্থাৎ এটি ( ৮০ টি চর):

x = foo.bar.object.a.value
y = foo.bar.object.b.value
z = foo.bar.object.c.value

( 79 অক্ষর) হিসাবে কোড করা যায় :

With foo.bar.object
    x = .a.value
    y = .b.value
    z = .c.value
End With

উপরেরটি এমনকি সেরা ক্ষেত্রেও নয়। অ্যাক্সেসের মধ্যে থেকে Applicationযেমন কিছু ব্যবহার করা থাকলে Excel.Applicationউন্নতিটি আরও বেশি তাৎপর্যযুক্ত হবে।


* পরিস্থিতির উপর নির্ভর করে Withএই ( cha৪ টি চর) এর চেয়ে বেশি দক্ষ হতে পারে বা নাও হতে পারে :

Set i = foo.bar.object
x = i.a.value
y = i.b.value
z = i.c.value

2

অসীম লুপস

প্রতিস্থাপনের জন্য বিবেচনা কর

Do While a<b
'...
Loop

অথবা

Do Until a=b
'...
Loop

পুরানো তবে নিম্ন বাইট গণনা সহ

While a<b
'...
Wend

আপনার যদি অকাল Subবা Functionআগে থেকে প্রস্থান করতে হয় তবে তার পরিবর্তেExit ...

For i=1To 1000
    If i=50 Then Exit Sub
Next

বিবেচনা End

For i=1To 1E3
    If i=50 Then End
Next

নোট করুন যে Endসমস্ত কোড প্রয়োগ কার্যকর করে এবং যে কোনও বৈশ্বিক ভেরিয়েবল সাফ করে, তাই বুদ্ধিমানের সাথে ব্যবহার করুন


আপনার শেষ বিভাগটি ( Forএবং End) পুনরায় 100লেখার বিষয়টি বিবেচনা করা উচিত যাতে কেসটি কখনও পূরণ হবে না এবং একটি অপ্রয়োজনীয় বাইট যুক্ত করুন
টেলর স্কট

এছাড়াও, যদিও এটি অত্যন্ত সুস্পষ্ট, আপনি এই পদ্ধতির সম্ভাব্য সুবিধাগুলি আরও ভালভাবে দেখানোর জন্য হোয়াইটস্পেস অপসারণের বিষয়টি বিবেচনা করতে পারেন (কোডগল্ফিংয়ের জন্য ভিবিএতে স্বতঃসারণের অপব্যবহার করা সর্বদা ভাল)
টেলর স্কট

2

Spc(n)ওভার ব্যবহার করুন Space(n), [Rept(" ",n)]বাString(n," ")

দৈর্ঘ্যের বেশ কয়েকটি স্থান সন্নিবেশ করানোর চেষ্টা করার সময় nব্যবহার করুন

Spc(n)              ''  6  bytes

উপর

B1=n:[Rept(" ",B1)] ''  19 bytes
String(n," ")       ''  13 bytes
Space(n)            ''  8  bytes

দ্রষ্টব্য: কেন আমি নিশ্চিত তা না, তবে মনে হয় Spc(n)আপনি কোনও পরিবর্তনশীলকে আউটপুট বরাদ্দ করতে পারবেন না এবং এটি অবশ্যই সরাসরি প্রিন্ট করা উচিত - সুতরাং কিছু ক্ষেত্রে Space(n)এখনও সবচেয়ে ভাল উপায়।


2

হ্রাস করুন Debug.Printএবং Printকল করুন

Debug.Print [some value] 

(12 বাইটস; পেছনের স্থানটি নোট করুন) এ কমতে পারে

Debug.?[some value]

(7 বাইটস; পিছনের জায়গার অভাব নোট করুন)।

একইভাবে,

Print 

(By বাইট) কমে যেতে পারে

?

(1 বাইট)

তদ্ব্যতীত, কোনও বেনামে VBE তাত্ক্ষণিক উইন্ডো ফাংশন প্রসঙ্গে কাজ করার সময় Debugবিবৃতিটি পুরোপুরি বাদ দেওয়া যেতে পারে এবং পরিবর্তে VBE অবিলম্বে উইন্ডোতে মুদ্রণ ?STDIN / STDOUT বলে ধরে নেওয়া যেতে পারে

বিশেষ অক্ষর

স্ট্রিং প্রিন্ট করার সময় আপনি এর জায়গায় বিশেষ অক্ষরও ব্যবহার করতে পারেন &। এগুলি মুদ্রিত বা হোয়াইটস্পেস অপসারণের বিকল্প ফর্ম্যাটগুলির অনুমতি দেয়

পরিবর্তে পরিবর্তনশীল স্ট্রিংগুলিতে যোগদান করতে

Debug.Print s1 &s2

আপনি একটি সেমিকোলন ব্যবহার করতে পারেন ;

Debug.?s1;s2

এই সেমিকোলনটি ধারাবাহিক স্ট্রিংগুলির পূর্বনির্ধারিত আচরণ, যতক্ষণ না কোনও দ্ব্যর্থতা নেই তাই এগুলি বৈধ:

Debug.?s1"a"
Debug.?"a"s1

কিন্তু না

Debug.?s1s2 'as this could be interpreted as a variable named "s1s2", not 2 variables
            'use Debug.?s1 s2 instead (or s1;s2)
Debug.?"a""b" 'this prints a"b, so insert a space or ; for ab

দ্রষ্টব্য যে; একটি লাইনের শেষে একটি নিউলাইন দমন করে, যেহেতু প্রতিটি মুদ্রণের পরে ডিফল্টরূপে নিউলাইনগুলি যুক্ত হয়। ভিবিএ কোড দ্বারা ফিরিয়ে দেওয়া গণনা বাইটগুলি বিতর্কের মধ্যে রয়েছে

একটি ট্যাবে যোগদানের জন্য কমা ব্যবহার করুন ,(আসলে 14 টি স্পেস তবে অনুযায়ী)

Debug.?s1,s2 'returns "s1              s2"

অবশেষে, আপনি পরিবর্তে স্ট্রিংগুলিতে যুক্ত হওয়ার জন্য টাইপ ডিক্লেয়ারেশন ব্যবহার করতে পারেন; ফর্ম্যাটিংয়ের প্রত্যেকটির নিজস্ব প্রভাব রয়েছে। নীচের সকলের জন্য a = 3.14159প্রথম লাইন

Debug.?a&"is pi" -> " 3 is pi" 'dims a as long, adds leading and trailing space to a
Debug.?a!"is pi" -> " 3.14159 is pi" 'dims a as single, adds leading and trailing space
Debug.?a$"is pi" -> "3.14159is pi" 'dims a as string, no spaces added

2

একটি সাহায্যকারী ব্যবহার করুন SubথেকেPrint

কোডটির যদি ছয়টিরও বেশি Debug.? বিবৃতি ব্যবহারের প্রয়োজন হয় তবে আপনি সমস্ত ডিবাগ প্রতিস্থাপন করে বাইট হ্রাস করতে পারেন? নীচের মত একটি সাব একটি কল সহ লাইন। একটি ফাঁকা লাইন প্রিন্ট করতে আপনাকে p ""পরামিতি প্রয়োজন যেহেতু কল করতে হবে।

Sub p(m)
Debug.?m
End Sub

1
এটির সাথে একটি নতুন লাইন মুদ্রণ করতে আপনার কেবল প্রয়োজন হবে p""বা এটি নির্বিঘ্নে করা যেতে পারে যদি p",। যাইহোক, বিস্তৃত ক্ষেত্রে যেখানে এটি প্রয়োগ হতে পারে সেখানে স্ট্রিং ভেরিয়েবলটি ব্যবহার করা আরও তাত্পর্যপূর্ণ এবং কেবল স্ট্রিং ভেরিয়েবলটি শেষে প্রিন্ট করে।
টেলর স্কট

1

এর Array() Choose()পরিবর্তে Selectবা ব্যবহার করুনIf...Then

অন্য ভেরিয়েবলের মানের উপর ভিত্তি করে ভেরিয়েবল বরাদ্দ করার সময় If...Then, চেকগুলি সহ ধাপগুলি লেখার জন্য এটি বোধগম্য হয় :

If a = 1 Then
b = "a"
ElseIf a = 2 Then
b = "c"
'...
End If

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

পরিবর্তে, Select Caseবিবৃতিটি একটি ব্লকের সমস্ত কিছু আবদ্ধ করে চেকগুলির আকার হ্রাস করতে সহায়তা করে:

Select Case a
Case 1:
b = "a"
Case 2:
b = "c"
'...
End Select

এটি অনেক ছোট কোডের দিকে পরিচালিত করতে পারে, তবে খুব সাধারণ ক্ষেত্রে যেমন এর থেকে আরও কার্যকর পদ্ধতি রয়েছে: Choose()এই ফাংশনটি তালিকা থেকে একটি মান বেছে নেবে, যা তার কাছে দেওয়া মানের উপর ভিত্তি করে।

b = Choose(a,"a","c",...)

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

b = Choose(a, 5 + 4, String(7,"?"))

একটি অতিরিক্ত বিকল্প হ'ল Arrayঅন্য চরিত্রটি সংরক্ষণ করার সময় একই প্রভাব পেতে ফাংশনটি ব্যবহার করা :

b = Array(5 + 4, String(7,"?"))(a)

গল্ফিংয়ের জন্য একটি আকর্ষণীয় এবং সম্ভবত খুব উপকারী ব্যবহার হ'ল এটি IIf()একে অন্যের সাথে মিলিয়ে ব্যবহার করা Choose():A1=IIf(a=Choose(b,c,d,e),Choose(Choose(f,g,h,i),j,k,l),Choose(IIf(m=n,Choose(p,q,r,s),IIf(t=u,v,w)),x,y,z))
গাফি

1

বিট-শিফটেড আরজিবি মান

এক্সেল যেভাবে রঙগুলি পরিচালনা করে, এর কারণে (স্বাক্ষরযুক্ত, 6-অক্ষরের হেক্সাডেসিমাল পূর্ণসংখ্যা) আপনি নেতিবাচক স্বাক্ষরিত পূর্ণসংখ্যার ব্যবহার করতে পারেন, যার মধ্যে এক্সেল কেবল একটি রঙ মান নির্ধারণ করতে ডান 6 বাইট ব্যবহার করবে

এটি কিছুটা বিভ্রান্তিকর তাই কিছু উদাহরণ নীচে সরবরাহ করা হয়েছে

বলুন যে আপনি রঙ সাদা ব্যবহার করতে চান যা সংরক্ষণ করা হয়

rgbWhite

এবং এর সমতুল্য

&HFFFFFF ''#value: 16777215

গলফ এই সব আমরা যা করতে হবে নিচে একটি খুঁজতে নেতিবাচক হেক্সাডেসিমেল মান যা বন্ধ FFFFFFএবং যেহেতু নেতিবাচক হেক্স মূল্যবোধের ফর্ম্যাটে হতে হবে FFFFXXXXXX(যেমন যে Xএকটি বৈধ হেক্সাডেসিমেল হয়) থেকে নিচে গণনা FFFFFFFFFF( -1করা) FFFF000001( -16777215)

এটি জেনে আমরা সূত্রটি সাধারণীকরণ করতে পারি

Let Negative_Color_Value = -rgbWhite + Positive_Color_Value - 1
                         = -16777215 + Positive_Color_Value - 1
                         = -16777216 + Positive_Color_Value

এটি ব্যবহার করে কিছু দরকারী রূপান্তর are

rgbWhite = &HFFFFFF = -1 
rgbAqua  = &HFFFF00 = -256
16747627 = &HFF8C6B = -29589

সেখানে কী চলছে তা জেনে রাখা ভাল, আমি এই প্রশ্নে দুর্ঘটনাক্রমে এটি আবিষ্কার করেছি - তবে এই স্পষ্ট ব্যাখ্যাটি দেখায় যে এটি ঠিক কীভাবে কাজ করে। আরেকটি বিষয় মনে রাখবেন যে গাণিতিক অপারেটরগুলির সাথে নির্দিষ্ট কী রঙগুলি হ্রাস করা যেতে পারে; rgbWhite= 2^24-1যদিও আপনি সেখানে মোটামুটিভাবে -1 পেতে মিস করলে সম্ভবত আরও হ্রাস করা যেতে পারে
লোভো

1
প্রকৃতপক্ষে, এখানে তাদের গাণিতিক উপস্থাপনা সহ রঙগুলির একটি তালিকা রয়েছে, যা ইতিবাচক বা নেতিবাচক দশমিক সংস্করণগুলির চেয়ে সংক্ষিপ্ত: &000080: 2^7, &000100: 2^8, &000200: 2^9, &000400: 2^10, &000800: 2^11, &001000: 2^12, &002000: 2^13, &004000: 2^14, &008000: 2^15, &010000: 2^16, &01FFFF: 2^17-1, &020000: 2^17, &03FFFF: 2^18-1, &040000: 2^18, &07FFFF: 2^19-1, &080000: 2^19, &0FFFFF: 2^20-1, &100000: 2^20, &1FFFFF: 2^21-1, &3FFFFF: 2^22-1, &400000: 2^22, &7FFFFF: 2^23-1 এনবি অগত্যা সম্পূর্ণ নয়, তবে আমি মনে করি যে আমি মোটামুটি পুরোপুরি কাজটি করেছি
গ্রিডো

1

"তাত্ক্ষণিক উইন্ডোতে প্রিন্ট করার সময় টার্মিনাল ছাড়ুন

নীচের ফাংশনটি দেওয়া হয়েছে, যা ডিবাগ উইন্ডোতে ব্যবহৃত হবে

h="Hello":?h", World!"

টার্মিনালটি "-1 বাইটের জন্য ছেড়ে দেওয়া যেতে পারে, স্ট্রিংটি বন্ধ রেখে দেওয়া হয় এবং প্রোগ্রামটি ত্রুটি ছাড়াই এটি সম্পাদন করবে

h="Hello":?h", World!

এর চেয়েও আশ্চর্যের বিষয় হ'ল এটি সম্পূর্ণ সংজ্ঞায়িত সাবরুটাইনগুলির মধ্যে করা যেতে পারে।

Sub a
h="Hello":Debug.?h", World!
End Sub

উপরের সাব্রোটিনটি প্রত্যাশিত হিসাবে চলে এবং এতে স্বতঃরূপ হয়

Sub a()
h = "Hello": Debug.Print h; ", World!"
End Sub

1

শর্তসাপেক্ষে সত্যবাদী এবং ফালসি ভেরিয়েবলগুলি ব্যবহার করুন

কখনও কখনও অন্তর্নিহিত ধরণের রূপান্তর বলা হয় - একটি If, [IF(...)]বা IIf(...)বিবৃতিতে সরাসরি কোনও সংখ্যার ব্যবহার করে number সংখ্যার সত্যবাদী এবং মিথ্যা প্রকৃতি ব্যবহার করে একেবারে আপনাকে কিছু বাইট সংরক্ষণ করতে পারে।

ভিবিএতে, যে কোনও সংখ্যার ধরণের ভেরিয়েবল যা শূন্য নয় তা সত্য বলে বিবেচিত হয় (এবং এইভাবে শূন্য, 0একমাত্র মান মিথ্যা) এবং এইভাবে

If B <> 0 Then 
    Let C = B
Else 
    Let C = D
End If 

ঘনীভূত হতে পারে

If B Then C=B Else C=D

এবং আরও

C=IIf(B,B,D)

1

নাম অনুসারে ঠিকানা পত্রক

পরিবর্তে WorkSheetফোন করে কোনও বস্তুকে সম্বোধন করা

Application.ActiveSheet
''  Or 
ActiveSheet   

এক ব্যবহার করতে পারেন

Sheets(n)  ''  Where `n` is an integer
''  Or 
[Sheet1]

বা আরও বেশি পছন্দ করে কেউ সরাসরি অবজেক্ট অ্যাক্সেস করতে এবং ব্যবহার করতে পারে

Sheet1

1

ক্ষতচিহ্ন এবং LongLong64-বিট ভিবিএতে এস

ক্ষয়ক্ষতির সাধারণ ফর্ম,

A to the power of B

ভিবিএ হিসাবে হিসাবে প্রতিনিধিত্ব করা যেতে পারে

A^B 

তবে কেবলমাত্র অফিসের 32-বিট ইনস্টলগুলিতে, অফিসের 64-বিট ইনস্টলগুলিতে, সংক্ষিপ্ততম উপায়ে আপনি ত্রুটি ছাড়াই উপস্থাপন করতে পারেন এটি is

A ^B

এটি কারণ ভিবিএর 64৪-বিট সংস্করণে ক্ষতচিহ্ন ^আক্ষরিক এবং LongLongপ্রকার ঘোষণার চরিত্র উভয় হিসাবে কাজ করে । এর অর্থ এই যে কিছু অদ্ভুত-চেহারাযুক্ত তবে বৈধ বাক্য গঠন যেমন উদয় হতে পারে

a^=2^^63^-1^

যা aএর সর্বোচ্চ মান ধরে রাখতে ভেরিয়েবলকে বরাদ্দ করেLonglong


1

স্ট্রিং হিসাবে বাইট অ্যারে সংকুচিত করুন

যে ধরণের চ্যালেঞ্জগুলির জন্য ধ্রুবক ডেটা ধরে রাখার সমাধানের প্রয়োজন হয়, সেই তথ্যটি একটি একক স্ট্রিং হিসাবে সংকুচিত করতে এবং তারপরে স্ট্রিং জুড়ে পুনরাবৃত্তি করার জন্য ডেটা আনতে কার্যকর হতে পারে।

ভিবিএতে, কোনও বাইট মানটি সরাসরি কোনও অক্ষরে রূপান্তরিত হতে পারে

Chr(byteVal)

এবং একটি longবা integerমান দুটি অক্ষরে রূপান্তরিত হতে পারে

Chr(longVal / 256) & Chr(longVal Mod 256)

সুতরাং একটি byteঅ্যারের জন্য একটি সংক্ষেপণ অ্যালগরিদম কিছু দেখতে হবে

For Each Var In bytes
    Select Case Var
        Case Is = Asc(vbNullChar)
            outstr$ = outstr$ & """+chr(0)+"""
        Case Is = Asc(vbTab)
            outstr$ = outstr$ & """+vbTab+"""
        Case Is = Asc("""")
            outstr$ = outstr$ & """"""
        Case Is = Asc(vbLf)
            outstr$ = outstr$ & """+vbLf+"""
        Case Is = Asc(vbCr)
            outstr$ = outstr$ & """+vbCr+"""
        Case Else
            outstr$ = outstr$ & Chr$(Var)
    End Select
Next
Debug.Print "t="""; outstr$

উল্লেখ করে যে Select Caseবিভাগটি অক্ষরগুলির কারণে কার্যকর করা হয়েছে যা স্ট্রিংয়ে আক্ষরিক হিসাবে সংরক্ষণ করা যায় না।

ফলস্বরূপ স্ট্রিং থেকে, যা দেখতে এমন কিছু দেখাচ্ছে

t="5¼-™):ó™ˆ"+vbTab+"»‘v¶<®Xn³"+Chr(0)+"~ίšÐ‘š;$ÔÝ•óŽ¡¡EˆõW'«¡*{ú{Óx.OÒ/R)°@¯ˆ”'®ïQ*<¹çu¶àªp~ÅP>‹:<­«a°;!¾y­›/,”Ì#¥œ5*B)·7    

এরপরে ডেটাগুলি Ascএবং Midফাংশনগুলি ব্যবহার করে বের করা যেতে পারে , যেমন eg

i=Asc(Mid(t,n+1))

1

অনুপযুক্ত ধ্রুবক ব্যবহার করুন

ভিবিএ কিছু ক্ষেত্রে, তালিকাভুক্ত বা অযৌক্তিক ধ্রুবক ব্যবহারের জন্য যাতে ধ্রুবক মান প্রয়োজন হয় require এগুলি প্রায়শই উত্তরাধিকারের মান এবং যথাযথ মানগুলির চেয়ে দৈর্ঘ্যে কম।

উদাহরণস্বরূপ নীচের মানগুলি যখন কোনও rng.HorizantalAlignmentসম্পত্তিকে ধরে রাখার সময় ব্যবহার করা যেতে পারে ।

ImproperProperGeneral ConstantxlHAlign  Constant11xlGeneralxlHAlignGeneral24131xlLeftxlHAlignLeft34108xlCenterxlHAlignCenter44152xlRightxlHAlignRight55xlFillxlHAlignFill64130xlJustifyxlHAlignJustify77xlCenterAcrossSelectionxlHAlignCenterAcrossSelection84117xlDistributedxlHAlignDistributed

এর অর্থ হল, উদাহরণস্বরূপ যে কোনও পাঠ্যকে কেন্দ্র করে এটির জন্য একটি সেল সেট করা

rng.HorizantalAlignment=-4108

সংক্ষিপ্ত হতে পারে

rng.HorizantalAlignment=3

যথাযথ মানটির 3জন্য অনুপযুক্ত ধ্রুবক মান প্রতিস্থাপন করে -4108। মনে রাখবেন যে আপনি যদি rng.HorizantalAlignmentসম্পত্তিটির মূল্য আনে , তবে এটি যথাযথ মানটি ফিরিয়ে দেবে। এই ক্ষেত্রে, যে হবে -4108


1

এক্সেলে, কর্কিং রেঞ্জের মাধ্যমে সংখ্যাযুক্ত অ্যারে তৈরি করুন

S[{...}]Split(String)

Δbyte count=5 bytesS

উদাহরণ

এই ক্ষেত্রে,

x=Split("1 2 34 567 8910")

হিসাবে লেখা হতে পারে

x=[{1,2,34,567,8910}]

আরও লক্ষণীয় যে এই পদ্ধতিটি সরাসরি অনুক্রমের জন্য অনুমতি দেয় না, এটি সরাসরি লুপের জন্য পুনরাবৃত্তি করার অনুমতি দেয়, অর্থাত্

For Each s In[{1,3,5,7,9,2,4,6,8}]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.