সর্বশেষ মিলের সারিটি খুঁজতে এক্সেল ভিবিএ ব্যবহার করে


0

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

Date     |ActionCode
11/4/1999| 2
12/5/1999| 3
1/2/2000 | 2
2/3/2001 | 5
3/1/2001 | 2

3/1/2001-এ ব্যবহারকারী যখন অ্যাকশনকোড "2" এ প্রবেশ করে, আমি কোডটি 1/2/2000পরিবর্তে ফিরে আসতে চাই 11/4/1999। আমি দেখেছি MATCH, তবে মনে হচ্ছে এটি কেবল ফিরে আসবে 11/4/1999। ওয়ার্কশিটে সূত্রগুলি প্রবেশ করে এটি করার জন্য আমি বেশ কয়েকটি পরামর্শ পেয়েছি, তবে কীভাবে সেগুলিকে ভিবিএতে অভিযোজিত করব তা আমি বুঝতে পারি না।


আপনি কি কোনও (ভিবিএ নন) সূত্র সমাধানে আগ্রহী? আপনি যা পোস্ট করেছেন সেখান থেকে আমি এর জন্য ভিবিএ ব্যবহার করার কোনও কারণ দেখতে পাচ্ছি না।
এক্সেল

উদাহরণটি আমি খুব সরল করে তুলেছি। আসল জিনিসটি সূত্র সমাধানগুলির সাথে খুব ঝামেলা হবে। নীচের পরামর্শের জন্য ধন্যবাদ। আমি চেষ্টা করে দেখব।
ব্যবহারকারী 348514

উত্তর:


0

ভিবিএ সমাধান:

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

Private Sub Worksheet_Change(ByVal Target As Range)
Dim userInput As Variant, codeTable() As Variant, maxDate As Long
Application.EnableEvents = False
'Make sure worksheet change affected user input cell
If Not Intersect(Range("F1"), Target) Is Nothing Then
    userInput = Range("F1").Value
    If userInput = "" Then
        Range("F2") = ""
    Else
        'Store table data in an array for fast processing
        codeTable = Range("A2", Range("B1").End(xlDown)).Value
        maxDate = 0
        'Find max date for input code
        For i = LBound(codeTable, 1) To UBound(codeTable, 1)
            If codeTable(i, 2) = userInput Then
                maxDate = Application.WorksheetFunction.Max(maxDate, codeTable(i, 1))
            End If
        Next i
        'Print output to sheet
        If maxDate = 0 Then
            Range("F2") = "No records"
        Else
            Range("F2") = Format(maxDate, "m/d/yyyy")
        End If
    End If
End If
Application.EnableEvents = True
End Sub

সূত্র সমাধান:

আপনি অ্যারে সূত্র দিয়ে একই ফলাফল অর্জন করতে পারেন - আপনার ওয়ার্কবুকে ভিবিএ যুক্ত করার দরকার নেই।

আপনার পছন্দসই আউটপুট কক্ষে, সূত্র বারে নিম্নলিখিতটি পেস্ট করুন এবং তারপরে Ctrl+ Shift+ টিপুন Enter

=MAX(($B$2:$B$21=F1)*A2:A21)

এই সূত্রে, B2:B21আপনার ক্রিয়া কোডগুলি ধরে রাখুন এবং A2:A21সম্পর্কিত তারিখগুলি।

উদাহরণ আউটপুট (উভয় সমাধান):

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


আমি অ্যারে ধারণা পছন্দ করি। আমি অবশ্যই তা ভেবে দেখিনি। তবে MAX ব্যবহার করে সমস্যাটি হ'ল এটির জন্য তারিখের মানগুলি অনন্য হওয়া দরকার। আমি মনে করি যে ব্যবহারকারীদের আমার আবেদনে একই তারিখের সাথে একাধিক অ্যাকশন কোড প্রবেশের প্রয়োজন হতে পারে potential সম্ভবত আমি সর্বাধিক সারি সংখ্যার সাথে সাম্প্রতিক তারিখটি পেতে ম্যাক্সের সাথে (সারি সারি সংখ্যাটি) একত্রিত করতে পারি?
ব্যবহারকারী 348514

আমি মনে করি আমি এখানে একটি সমাধান পেয়েছি: get-digital-help.com/2014/02/07/…
ব্যবহারকারী 348514

0

আপনি একটি সূত্র ব্যবহার করতে পারেন:

=AGGREGATE(14,6,(Dates<J2)*(ActionCode=J3)*Dates,1)
  • জে 2 = ব্যবহারকারীর ইনপুটেড তারিখ, বা TODAY()আপনি যদি আক্ষরিক অর্থে এটির অর্থ দিয়ে থাকেন।
  • জে 3 = ব্যবহারকারী ইনপুটড অ্যাকশন কোড

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

যদি তারিখগুলি আরোহণ অনুসারে বাছাই করা হয় তবে আপনি সহজ সূত্রটি ব্যবহার করতে পারেন:

=LOOKUP(2,1/((Dates<J2)*(ActionCode=J3)),Dates)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.