এক্সেল ম্যাক্রো তারিখ পার্সার একক-দিন দিন পরিচালনা করতে পারে না


1

এই এবং অন্যান্য সাইটগুলিতে পূর্ববর্তী প্রশ্নগুলি থেকে আমাকে একটি ফাংশন দেওয়া হয়েছিল যা পাঠ্য স্ট্রিং বা কোষগুলিতে তারিখগুলি সন্ধান করতে এবং সন্ধান করতে পারে। এখানে ফাংশন:

Function GetDate(strInput As String) As Date

    Dim DateFormat() As String
    Dim intDateLength As Integer
    Dim intMaxFormat As Integer
    Dim intFrmtCtr As Integer
    Dim intPosition As Integer

    intMaxFormat = 6
    ReDim DateFormat(1 To intMaxFormat)

    DateFormat(1) = "*##[-/]##[/-]####*"
    DateFormat(2) = "*#[-/]##[-/]####*"
    DateFormat(3) = "*##[-/]#[-/]####*"
    DateFormat(4) = "*##[-/]##[-/]##*"
    DateFormat(5) = "*#[-/]##[-/]##*"
    DateFormat(6) = "*#[-/]#[-/]##*"

    GetDate = Now

    For intFrmtCtr = 1 To intMaxFormat
        If strInput Like DateFormat(intFrmtCtr) Then
            intDateLength = Len(DateFormat(intFrmtCtr)) - 8
            strInput = Replace(strInput, " ", "")

            For intPosition = 1 To Len(strInput)
                If Mid(strInput, intPosition, intDateLength) Like DateFormat(intFrmtCtr) Then
                    GetDate = DateValue(Mid(strInput, intPosition, intDateLength))
                    Exit Function
                End If
            Next intPosition
        End If
    Next intFrmtCtr

End Function

এটি তখন একটি সেল ঠিকানা উল্লেখ করে বলা হয়:

'Gets date from cell A2
    Range("A2").Select
    dateWork = GetDate(Selection)

আমি তারপর আউটপুট ব্যবহার করে ফরম্যাট করতে পারেন Format(dateWork, "mmddyy") অথবা সাদৃশ্যপূর্ণ.

উপরের ক্ষেত্রে, একটি ঘর বিষয়বস্তু দেওয়া 8/31/2011 স্ট্রিং 08312011 ফিরে এসেছে।

কোষ সামগ্রীর সাথে শুরু হওয়া একটি একক সংখ্যার দিন (অর্থাৎ, মাসের প্রথম দিকে), যদিও, ফাংশনটি দ্বিতীয় দুই সংখ্যার পরিবর্তে বছরের প্রথম দুইটি সংখ্যা ফেরত পাঠাতে শুরু করে। হঠাৎ করেই, ২0২0 সালে তারা যেমন দেখছিল, তেমনি তারিখগুলিও শুরু হল 2011।

আমি অন্যথায় অভিন্ন ইনপুট তথ্য শীট ব্যবহার করে এই পরীক্ষা করতে সক্ষম হয়েছে তারিখ পর্যন্ত এবং সহ 8/31/2011 সঠিকভাবে এবং তারিখ শুরু সঙ্গে ফিরে আসেন 9/1/2011 এবং বছরের হিসাবে সব রিটার্ন "20" অব্যাহত।

কোথায় এই ফাংশন ভঙ্গ করা হয়?

প্রশ্নের জন্য সাম্প্রতিক ব্যাখ্যা:

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

GetDate () ফাংশনটি কোন স্ট্রিংয়ের তারিখগুলি সন্ধান করতে বলা যেতে পারে। স্ট্রিংগুলি বিভিন্ন ফরম্যাটগুলির মধ্যে কেবল তারিখ হতে পারে, অথবা তারা পাঠ্য এবং তারিখের সমন্বয় হতে পারে যেমন "টোটালস 9/13/1977"।

যতক্ষণ পর্যন্ত এটি উপরে পেশ করা ক্ষমতাগুলি ধরে রাখে ততক্ষণ আমি আপনার সরলকরণ বা সম্পাদনার ফাংশনে কৃতজ্ঞতা প্রকাশ করব।

উত্তর:


3

তোমার Mid(strInput, intPosition, intDateLength) আপনার জন্য কাজ করছে না। 9/1/2011 এর জন্য, আপনি মিলছে DateFormat(6) = "*#[-/]#[-/]##*"। সুতরাং Mid(strInput, intPosition, intDateLength) = Mid("9/1/2011", 1, 6) এবং "9/1/2011" পরিবর্তে "9/1/20" প্রদান করে।

উপরে আপনার উদাহরণের উপর ভিত্তি করে, আমার মনে হয় আপনাকে আরও 2 টি প্যাটার্ন যুক্ত করতে হবে যাতে আপনি 1 এবং 2 সংখ্যার মাস / দিনগুলির সমস্ত সমন্বয়গুলি ঢেকে রাখেন। 2 এবং 4 অঙ্ক বছর। অর্ডারটি গুরুত্বপূর্ণ কারণ আপনি 4 ডিজিটের বছরগুলি প্রথমে মিলতে চান (আপনার সমস্যার কোনও কারণ আছে তা উল্লেখ করুন # / # / ## 9/1/2011 ম্যাচে যখন আপনি কেবল এটি 9/1/11 ম্যাচ করতে চান। সুতরাং কোড পরিবর্তন নীচের মত কিছু। আমি পুরোপুরি এটি সমস্ত তারিখ বিন্যাস সঙ্গে পরীক্ষা করে নি, কিন্তু এটা ঠিক মনে হচ্ছে।

intMaxFormat = 8
ReDim DateFormat(1 To intMaxFormat)

DateFormat(1) = "*##[-/]##[/-]####*"
DateFormat(2) = "*#[-/]##[-/]####*"
DateFormat(3) = "*##[-/]#[-/]####*"
DateFormat(4) = "*#[-/]#[-/]####*"
DateFormat(5) = "*##[-/]##[-/]##*"
DateFormat(6) = "*##[-/]#[-/]##*"
DateFormat(7) = "*#[-/]##[-/]##*"
DateFormat(8) = "*#[-/]#[-/]##*"

যে কারণে একক দিনের দিন?
music2myear

হ্যাঁ। DateFormat (6) কার্যকরভাবে d / M / YY , যা একমাত্র 9/1/2011 ম্যাচ। অন্যান্য ফরম্যাটের জন্য 2 ডিজিট দিন বা মাস প্রয়োজন। তাই যদি আপনি 09/01/2011 এ রাখেন, এটি জরিমানা কাজ করবে
Rhys Gibson

1
আপনি যদি যা অর্জন করতে চান তা আমাকে বলতে পারেন তবে আমি আপনার জন্য ফাংশনটি সহজ করতে পারি। আমি মনে করি সেখানে কিছু অকার্যকর বিট আছে, বিশেষ করে যদি আপনার সমস্ত তারিখ একই বিন্যাসে থাকে।
Rhys Gibson

আমি কী ধরণের স্ট্রিং GetDate () কাজ করে এবং আমার ব্যবহারের জন্য এটির প্রয়োজনীয়তা সম্পর্কে স্পষ্টতা যোগ করেছি।
music2myear

আপনি যোগ করেছেন যে তারিখের ফরম্যাটগুলি দেখছেন, সংখ্যা 6 এবং 7 বিপরীত হওয়া উচিত? সংখ্যা 2 এবং 3 যা 6 এবং 7 থেকে বিপরীত ক্রম বলে মনে হয় তা কোনটি সঠিক (বা তারা আপনাকে দেওয়া ক্রম অনুসারে হওয়া উচিত)?
music2myear

0

আমি একটি ছোট ম্যাক্রো লিখেছেন যা আপনি চান তা করতে হবে। এটি স্থান চরিত্র দ্বারা একটি অ্যারের মধ্যে স্ট্রিং আপ বিভক্ত। ম্যাক্রো তারপর তারিখ খুঁজছেন অ্যারে মাধ্যমে সঞ্চালিত হয়। তারিখ সংযুক্ত অতিরিক্ত অক্ষর আছে যদি এটা ব্যর্থ হবে। তবে, যদি তারিখটি "নিজের শব্দ" উভয় প্রান্তে স্থানান্তরিত করে আলাদা করে তবে এটি পুরোপুরি কাজ করে। আপনার প্রয়োজনের উপর নির্ভর করে এটি সামান্য বিট পরিবর্তন করা প্রয়োজন হতে পারে।

Function GetDate(strInput As String) As Date

 Dim strDate() As String, i As Long

  strDate = Split(strInput, " ")

 For i = 0 To UBound(strDate) - 1
    If Right(strDate(i), 1) = "." Then strDate(i) = Left(strDate(i), Len(strDate(i)) - 1)
    If IsDate(strDate(i)) Then
       GetDate = strDate(i)
       Exit For
    End If
 Next i

End Function

দেখে মনে হচ্ছে যে হ্যান্ডলগুলি তারিখগুলি অনুসরণ করে, ঠিক আছে? কিন্তু কমা এবং অন্যান্য বিরামচিহ্ন যেমন অন্যান্য অক্ষর সমস্যা হতে পারে?
music2myear

হা. আমার সহজ পরীক্ষায় আমি একটি সময় ছিল। আপনি শেষে একটি সংখ্যা জন্য প্রতিটি স্ট্রিং পরীক্ষা করতে পারে এবং এটি না হলে মুছে দিন। তার সঠিক প্রয়োজনীয়তা বুদ্ধিমান ছাড়া কোডটি কার্যকরভাবে লিখতে অসম্ভব।
wbeard52
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.