কোনও ভিবিএ ফাংশন থেকে কীভাবে ফলাফলটি ফেরানো যায়


277

কিভাবে আমি একটি ফাংশন থেকে ফলাফল ফিরে আসতে পারি?

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

Public Function test() As Integer
    return 1
End Function

এটি একটি সংকলন ত্রুটি দেয়।

আমি কীভাবে এই ফাংশনটিকে পূর্ণসংখ্যা ফেরত দেব?


উত্তর:


429

নন-অবজেক্ট রিটার্নের ধরণের জন্য, আপনাকে নিজের ফাংশনের নামের জন্য এই মানটি নির্ধারণ করতে হবে:

Public Function test() As Integer
    test = 1
End Function

ব্যবহারের উদাহরণ:

Dim i As Integer
i = test()

যদি ফাংশনটি কোনও অবজেক্টের ধরণটি দেয়, তবে আপনাকে অবশ্যই এই Setকীওয়ার্ডটি ব্যবহার করতে হবে :

Public Function testRange() As Range
    Set testRange = Range("A1")
End Function

ব্যবহারের উদাহরণ:

Dim r As Range
Set r = testRange()

নোট করুন যে ফাংশন নামে একটি রিটার্ন মান নির্ধারণ করা আপনার ফাংশনটির সম্পাদন শেষ করে না। আপনি যদি ফাংশনটি থেকে প্রস্থান করতে চান, তবে আপনাকে স্পষ্টভাবে বলতে হবে Exit Function। উদাহরণ স্বরূপ:

Function test(ByVal justReturnOne As Boolean) As Integer
    If justReturnOne Then
        test = 1
        Exit Function
    End If
    'more code...
    test = 2
End Function

ডকুমেন্টেশন: http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx


32
সম্পূর্ণতার জন্য এটি লক্ষ করা উচিত যে আপনি যখন কোনও বস্তুর ফিরে আসছেন ( Rangeউদাহরণস্বরূপ), Setকোনও নিয়মিত পদ্ধতিতে কোনও অবজেক্ট ভেরিয়েবল সেট করার সময় আপনার ঠিক তেমনটি ব্যবহার করা দরকার । সুতরাং, উদাহরণস্বরূপ, যদি "পরীক্ষা" এমন কোনও ফাংশন ছিল যা একটি পরিসীমা ফেরত দেয় রিটার্নের বিবৃতিটি এর মতো দেখায় set test = Range("A1")
জে কার

কেন এটি @ জায়েকার?
সাইকোডাটা

4
@ সাইকোডাটা - কেবলমাত্র আপনি সাধারণভাবে কোনও বস্তুর ভেরিয়েবল সেট করে রেখেছিলেন এবং এগুলি না করে setকরলে সমস্যা দেখা দিতে পারে। আমি এটি ছাড়াই এটি করতে সমস্যা ছিল, তবে আমি যদি ব্যবহার setকরি তবে আমি তা করব না :)।
জে কার

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

2
যখন ভিবিএর মধ্যে ডাকা হবে তখন ফাংশনটি একটি ব্যাপ্তিযুক্ত বস্তু ফিরে আসবে, তবে যখন একটি কার্যপত্রক থেকে ডাকা হবে তখন এটি কেবলমাত্র মানটি ফিরে আসবে, ঠিক এটির set test = Range("A1")সমান test = Range("A1").Value, যেখানে "পরীক্ষা "টি একটি পরিসরের পরিবর্তে ভেরিয়েন্ট হিসাবে সংজ্ঞায়িত করা হয়।
ডগ জেনকিনস

86

ভিবিএ ফাংশন ফাংশনটির নামটি নিজেকে ভেরিয়েবলের হিসাবে বিবেচনা করে। সুতরাং "" return"স্টেটমেন্ট ব্যবহার না করে আপনি কেবল বলেছেন:

test = 1

তবে খেয়াল করুন যে এটি ফাংশনটির বাইরে চলে না। এই বিবৃতিটির পরে যে কোনও কোডও কার্যকর করা হবে। সুতরাং, আপনার অনেক অ্যাসাইনমেন্ট স্টেটমেন্ট থাকতে পারে যা বিভিন্ন মানকে নির্ধারিত করে testএবং ফাংশনের শেষে পৌঁছানোর পরে মানটি যাই হোক না কেন মান ফিরে আসবে।


প্রকৃতপক্ষে আপনি অতিরিক্ত তথ্যের সাহায্যে প্রশ্নের আরও স্পষ্ট উত্তর দিয়েছেন (যা সম্ভাব্যভাবে নতুন থেকে ভিবিএ লোকের কাছে আরও একটি প্রশ্নের জন্ম দিতে পারে)। ভাল কাজ চালিয়ে যান
আদর্শ

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

41

কেবলমাত্র ফাংশন নামে রিটার্ন মান নির্ধারণ করা জাভা (বা অন্যান্য) স্টেটমেন্টের ঠিক ঠিক একই নয় return, কারণ জাভাতে, returnফাংশনটি এইভাবে প্রস্থান করে:

public int test(int x) {
    if (x == 1) {
        return 1; // exits immediately
    }

    // still here? return 0 as default.
    return 0;
}

ভিবিতে, আপনি যদি আপনার ফাংশন শেষে রিটার্ন মান সেট না করে থাকেন তবে সঠিক সমতুল্য দুটি লাইন নেয় । সুতরাং, ভিবিতে সঠিক করোলারিটি দেখতে এমন হবে:

Public Function test(ByVal x As Integer) As Integer
    If x = 1 Then
        test = 1 ' does not exit immediately. You must manually terminate...
        Exit Function ' to exit
    End If

    ' Still here? return 0 as default.
    test = 0
    ' no need for an Exit Function because we're about to exit anyway.
End Function 

যেহেতু এটি কেস, আপনি এটি পদ্ধতিতে অন্যান্য ভেরিয়েবলের মতো রিটার্ন ভেরিয়েবল ব্যবহার করতে পারেন তা জেনেও খুব ভাল। এটার মত:

Public Function test(ByVal x As Integer) As Integer

    test = x ' <-- set the return value

    If test <> 1 Then ' Test the currently set return value
        test = 0 ' Reset the return value to a *new* value
    End If

End Function 

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

Public Function test(ByVal x As Integer) As Integer

    test = x ' <-- set the return value

    If test > 0 Then

        ' RECURSIVE CALL...WITH THE RETURN VALUE AS AN ARGUMENT,
        ' AND THE RESULT RESETTING THE RETURN VALUE.
        test = test(test - 1)

    End If

End Function

2
"এটি জেনেও খুব সুন্দর যে আপনি পদ্ধতিতে অন্য কোনও চলকের মতোই রিটার্ন ভেরিয়েবলটি ব্যবহার করতে পারেন" বেশিরভাগ ক্ষেত্রেই সত্য - তবে যেমন যদি রিটার্ন টাইপ হয় Variantএবং আপনার লক্ষ্যটি অ্যারে ফেরত দেয় তবে এর মতো কিছু ReDim test(1 to 100)ত্রুটি ঘটবে। এছাড়াও, যদিও এটির মতো মৌলিক ধরণের চিকিত্সা করা সম্ভব তবে এটি Integersকিছুটা ইউনিডিয়ম্যাটিক হিসাবে বিবেচিত হয়। এটি কোড পড়তে আরও শক্ত করে তোলে। ভিবিএ প্রোগ্রামাররা লাইনগুলির জন্য স্ক্যান করে যা কোনও ফাংশন কী করে তা বোঝার জন্য ফাংশনটির নাম নির্ধারণ করে। নিয়মিত পরিবর্তনশীল হিসাবে ফাংশনটির নাম ব্যবহার করা অযথা এটিকে অস্পষ্ট করে।
জন কোলম্যান

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

এটা তোলে হয় smallish কাজকর্মের জন্য দরকারী, এবং কিছু যে কোনো VBA প্রোগ্রামার, সম্পর্কে জানা উচিত তাই আমি আপনি এটা উল্লেখ সঙ্গে কোনো সমস্যা ছিল না। আমি কেবল ভেবেছিলাম যে একটি সতর্কতা অন্তর্ভুক্ত করা উচিত।
জন কোলেম্যান

কীভাবে Exit Functionসম্পর্কিত তা ব্যাখ্যা করার জন্য ধন্যবাদreturn
অস্টিন ডি

@ জনকোলম্যান, স্পষ্টতই, আপনি ReDim test(1 to 100)কোনও ত্রুটি ট্রিগার ছাড়াই পারবেন না কেবল কারণ 'পরীক্ষা' অ্যারে হিসাবে ঘোষণা করা হয়নি! এবং অন্য কোনও কারণে নয়! আপনি কোনও ক্রিয়াকে অ্যারে হিসাবে ঘোষণা করতে পারবেন না। এটিকে একটি হিসাবে ঘোষণা করুন Variant, তারপরে এই ফাংশনের অভ্যন্তরে কেবল আপনার আউটপুট অ্যারে (এটি ডায়নামিক বা স্ট্যাটিক হতে পারে) তৈরি করুন testএবং তারপরে ("=") এই অ্যারেটিকে testএকটি ফেরতের মান হিসাবে বরাদ্দ করুন । ReDimএনিংস করার মতো আরও কৌশলগত করার জন্য আপনাকে ফিরিয়ে দেওয়া মানটি একটি ভেরিয়েবলের জন্য বরাদ্দ করতে হবে, উদাহরণস্বরূপ Dim x as Variantএবং কল করুন x = test, তারপরে আপনি যা xকরেছেন তা হ'ল test!
জিন

-6

নীচের কোডটি ভেরিয়েবলের মধ্যে ফেরতের মান সংরক্ষণ করে retValএবং তারপরে MsgBoxমানটি প্রদর্শন করতে ব্যবহার করা যেতে পারে:

Dim retVal As Integer
retVal = test()
Msgbox retVal
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.