ভিবিএর সাহায্যে এক্সেলের সর্বশেষ ব্যবহৃত সেলটি অনুসন্ধানের ক্ষেত্রে ত্রুটি


179

যখন আমি সর্বশেষ ব্যবহৃত ঘর মানটি খুঁজতে চাই, আমি ব্যবহার করি:

Dim LastRow As Long

LastRow = Range("E4:E48").End(xlDown).Row

Debug.Print LastRow

আমি যখন একটি ঘরে একটি একক উপাদান রাখি তখন আমি ভুল আউটপুট পাচ্ছি। কিন্তু যখন আমি ঘরে একাধিক মান রাখি, আউটপুটটি সঠিক। এর পিছনে কারণ কী?


উত্তর:


309

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


শেষ সারিটি সন্ধান করার অবিশ্বস্ত উপায়

শেষ সারিটি সন্ধান করার কয়েকটি সাধারণ উপায় যা অত্যন্ত অবিশ্বাস্য এবং তাই কখনও ব্যবহার করা উচিত নয়।

  1. UsedRange
  2. xlDown
  3. COUNTA

UsedRangeডেটা আছে এমন সর্বশেষ কক্ষটি খুঁজতে কখনই ব্যবহার করা উচিত নয় । এটি অত্যন্ত অবিশ্বাস্য। এই পরীক্ষা করে দেখুন।

ঘরে কিছু লিখুন A5। এখন আপনি নীচে প্রদত্ত যে কোনও পদ্ধতিতে শেষ সারিটি গণনা করুন, এটি আপনাকে 5 দিবে Now এখন ঘরটি A10লাল রঙ করুন । আপনি যদি এখন নীচের কোডটি ব্যবহার করেন তবে আপনি 5 পেয়ে যাবেন তবে আপনি Usedrange.Rows.Countকী পান তা যদি ব্যবহার করেন ? এটি 5 হবে না।

কীভাবে UsedRangeকাজ করে তা দেখানোর জন্য এখানে একটি দৃশ্য ।

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

xlDown সমান অবিশ্বাস্য।

এই কোড বিবেচনা করুন

lastrow = Range("A1").End(xlDown).Row

যদি কেবলমাত্র একটি ঘর ( A1) থাকে যেখানে ডেটা থাকে তবে কী হবে ? আপনি কার্যপত্রকটি শেষ সারিতে পৌঁছে যাবেন! এটি সেল নির্বাচন করার A1পরে Endকী টিপুন এবং তারপরে Down Arrowকী টিপানোর মতো। যদি কোনও ব্যাপ্তিতে ফাঁকা ঘর থাকে তবে এটি আপনাকে অবিশ্বাস্য ফলাফলও দেবে।

CountA অবিশ্বাস্যও কারণ এটির মধ্যে ফাঁকা ঘর থাকলে এটি আপনাকে ভুল ফলাফল দেয়।

এবং তাই একের ব্যবহার এড়ানো উচিত UsedRange, xlDownএবং CountAসর্বশেষ সেলটি সন্ধান করা উচিত।


একটি কলামে শেষ সারিটি সন্ধান করুন

কর্নেল ই-এর শেষ সারিটি অনুসন্ধান করতে এটি ব্যবহার করুন

With Sheets("Sheet1")
    LastRow = .Range("E" & .Rows.Count).End(xlUp).Row
End With

আপনি যদি খেয়াল করেন যে আমাদের একটি .আগে আছে Rows.Count। আমরা প্রায়শই তা অগ্রাহ্য করা বেছে নিয়েছিলাম। আপনি পেতে পারেন যে সম্ভাব্য ত্রুটি এই প্রশ্নটি দেখুন । আমি সর্বদা .আগে Rows.Countএবং ব্যবহার করার পরামর্শ দিই Columns.Count। যে প্রশ্ন একটি ক্লাসিক দৃশ্যকল্প যেখানে কোড ব্যর্থ হবে কারণ Rows.Countরিটার্ন 65536এক্সেল 2003 এবং তার আগে এবং 1048576এক্সেল 2007 এবং পরবর্তী সময়ের জন্য। একইভাবে Columns.Countফিরে আসে 256এবং 16384যথাক্রমে।

উপরে যে এক্সেল 2007+ হয়েছে 1048576এছাড়াও সারি সত্য যে আমরা সবসময় পরিবর্তনশীল যা সারি মান রাখা হবে ঘোষণা করা উচিত জোর দেয় Longপরিবর্তে Integerঅন্য আপনি একটি পাবেন Overflowত্রুটি।

মনে রাখবেন যে এই পদ্ধতির কোনও লুকানো সারি বাদ দেওয়া হবে। এ কলামের জন্য উপরের আমার স্ক্রিনশটটি ফিরে দেখুন , সারি 8 টি লুকানো থাকলে এই পদ্ধতির 5পরিবর্তে ফিরে আসবে 8


একটি শীটে শেষ সারিটি সন্ধান করুন

Effectiveশীটে শেষ সারিটি সন্ধান করতে এটি ব্যবহার করুন। এর ব্যবহারটি লক্ষ্য করুন Application.WorksheetFunction.CountA(.Cells)। এটি প্রয়োজনীয় কারণ যদি ওয়ার্কশিটে ডেটা সহ কোনও কক্ষ না থাকে তবে .Findআপনাকে দেবেRun Time Error 91: Object Variable or With block variable not set

With Sheets("Sheet1")
    If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
        lastrow = .Cells.Find(What:="*", _
                      After:=.Range("A1"), _
                      Lookat:=xlPart, _
                      LookIn:=xlFormulas, _
                      SearchOrder:=xlByRows, _
                      SearchDirection:=xlPrevious, _
                      MatchCase:=False).Row
    Else
        lastrow = 1
    End If
End With

একটি সারণীতে সর্বশেষ সারিটি সন্ধান করুন (তালিকাভোজন)

একই নীতিগুলি প্রয়োগ হয়, উদাহরণস্বরূপ, কোনও সারণীর তৃতীয় কলামে শেষ সারিটি পেতে:

Sub FindLastRowInExcelTableColAandB()
Dim lastRow As Long
Dim ws As Worksheet, tbl as ListObject
Set ws = Sheets("Sheet1")  'Modify as needed
'Assuming the name of the table is "Table1", modify as needed
Set tbl = ws.ListObjects("Table1")

With tbl.ListColumns(3).Range
    lastrow = .Find(What:="*", _
                After:=.Cells(1), _
                Lookat:=xlPart, _
                LookIn:=xlFormulas, _
                SearchOrder:=xlByRows, _
                SearchDirection:=xlPrevious, _
                MatchCase:=False).Row
End With

End Sub

9
@phan: সেল এ 5 তে কিছু টাইপ করুন। এখন আপনি উপরের যে কোনও পদ্ধতিতে শেষ সারিটি গণনা করলে এটি আপনাকে 5 দেয় 5. আপনি যদি এখন উপরের যে কোনও কোডটি ব্যবহার করেন তবে আপনি এখনও 5 পাবেন you আপনি যদি Usedrange.Rows.Countকী ব্যবহার করেন তবে ? এটি 5 হবে না। ইউরোঞ্জরেজ শেষ সারিটি সন্ধান করার জন্য অত্যন্ত অবিশ্বাস্য।
সিদ্ধার্থ রাউত

6
মনে রাখবেন যে। দুর্ভাগ্যক্রমে অনুসন্ধান ডায়ালগটিতে ব্যবহারকারীর সেটিংসকে বিশৃঙ্খল করে - যেমন এক্সেলের ডায়ালগটির জন্য কেবলমাত্র 1 সেট সেটিংস রয়েছে এবং আপনি ব্যবহার করছেন ind ফাইন্ডগুলি তাদের প্রতিস্থাপন করে। আর একটি কৌশলটি এখনও ইউজাররেঞ্জ ব্যবহার করা, তবে এটিকে নিখুঁত (তবে অবিশ্বস্ত) সর্বাধিক হিসাবে ব্যবহার করুন যা থেকে আপনি সঠিক সর্বাধিক নির্ধারণ করেন।
কার্ল কলিজন 31'14

4
@ কার্ল কলজিন: আমি এটিকে জঘন্য বলব না। :) এক্সেল কেবল remembersশেষ সেটিংস। এমনকি আপনি যখন ম্যানুয়ালি একটি করেন Find, এটি সর্বশেষ সেটিংটির কথা মনে রাখে যা বাস্তবে কেউ যদি এই "সত্য" জানে তবে এটি একটি
वरदान

3
@ কিথপার্ক: দয়া করে এগিয়ে যান :) জ্ঞানটি কেবল ছড়িয়ে গেলেই তার একটি অর্থ থাকে :)
সিদ্ধার্থ রাউট

9
আমি মনে করি যে আপনার বিবরণ UsedRange( এটি সর্বশেষ সেলটিতে ডেটা রয়েছে এটি সন্ধান করা অত্যন্ত বিশ্বাসযোগ্য নয় ) বিভ্রান্তিকর। UsedRangeএটি কেবলমাত্র সেই উদ্দেশ্যে নয়, যদিও কিছু ক্ষেত্রে এটি সঠিক ফলাফল দিতে পারে। আমি মনে করি প্রস্তাবিত পরীক্ষাটি বিভ্রান্তিকে আরও বাড়িয়েছে। UsedRange($ A $ 1: $ A $ 8) দিয়ে প্রাপ্ত ফলাফলটি মুছে ফেলার প্রথম ডেটা প্রবেশের উপর নির্ভর করে না। কোনও ডিলিট মুছে ফেলা না করে ডান দিকের চিত্রটি এখনও একই থাকবে। আমার উত্তর দেখুন দয়া করে।
সানচো.এস পুনরায় ইনস্টল করুন মনিকাসেলিও

34

দ্রষ্টব্য: এই উত্তরটি এই মন্তব্যে উদ্বুদ্ধ হয়েছিল । UsedRangeউপরের উত্তরে বর্ণিত উদ্দেশ্য থেকে ভিন্ন different

সর্বশেষ ব্যবহৃত কক্ষ অনুসন্ধানের সঠিক পদ্ধতি হিসাবে প্রথমে কোনটি ব্যবহৃত হিসাবে বিবেচিত হবে তা সিদ্ধান্ত নিতে হবে এবং তারপরে একটি উপযুক্ত পদ্ধতি নির্বাচন করুন । আমি কমপক্ষে তিনটি অর্থ ধারনা করছি:

  1. ব্যবহৃত = খালি নয়, অর্থাত্‍ ডেটা থাকা

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

  3. ব্যবহৃত = "... ব্যবহারে, যার অর্থ ডেটা বা ফর্ম্যাটিং রয়েছে এমন বিভাগ " বা শর্তসাপেক্ষ বিন্যাসকরণ। ২ হিসাবে একই, তবে এমন কোনও কোষও অন্তর্ভুক্ত যা কোনও শর্তাধীন বিন্যাসের নিয়মের জন্য লক্ষ্য।

কীভাবে সর্বশেষ ব্যবহৃত সেলটি আপনি কী চান তার উপর নির্ভর করে (আপনার মানদণ্ড)

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

মাপদণ্ড 2 এরUsedRange জন্য, এই ব্যবহারের জন্য ডিজাইন করা অন্যান্য বিকল্পের তুলনায় সবচেয়ে নির্ভরযোগ্য বিকল্প । এমনকি সর্বশেষ ঘরটি আপডেট হয়েছে কিনা তা নিশ্চিত করার জন্য এটি একটি ওয়ার্কবুক সংরক্ষণ করা অপ্রয়োজনীয় করে তোলে। Ctrl+ Endসংরক্ষণের পূর্বে একটি ভুল ঘরে যাবে ( http://msdn.microsoft.com/en-us/library/aa139976%28v=office.10% থেকে "" শেষপত্রটি পুনরায় সেট করা হবে না যতক্ষণ আপনি কার্যপত্রকটি সংরক্ষণ করবেন না) 29. এএসপিএক্স । এটি একটি পুরানো রেফারেন্স, তবে এই ক্ষেত্রে বৈধ)।

মাপদণ্ড 3 এর জন্য, আমি কোনও বিল্ট-ইন পদ্ধতি জানি না । মাপদণ্ড 2 শর্তসাপেক্ষ বিন্যাসের জন্য অ্যাকাউন্ট করে না। ফর্মুলার উপর ভিত্তি করে কারও কাছে ফর্ম্যাটেড সেল থাকতে পারে, যা সনাক্ত UsedRangeবা Ctrl+ দ্বারা সনাক্ত করা যায় না End। চিত্রটিতে, সর্বশেষ ঘরটি বি 3, যেহেতু এতে ফর্ম্যাটিং স্পষ্টভাবে প্রয়োগ করা হয়েছিল। কোষ বি 6: ডি 7 এর একটি শর্তসাপেক্ষ বিন্যাসের নিয়ম থেকে উত্পন্ন ফর্ম্যাট রয়েছে এবং এটি দ্বারা এটি সনাক্তও করা যায় না UsedRange। এই জন্য অ্যাকাউন্টিং কিছু ভিবিএ প্রোগ্রামিং প্রয়োজন হবে।

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


আপনার নির্দিষ্ট প্রশ্ন হিসাবে : এর পিছনে কারণ কি?

জন্য E48 একটি trampoline যেমন: আপনার কোড আপনার পরিসর E4 প্রথম সেল ব্যবহার জাম্পিং সঙ্গে নিচে End(xlDown)

আপনার ব্যাপ্তিতে সম্ভবত প্রথমটি ব্যতীত অন্য কোনও ফাঁকা ঘর না থাকলে "ভ্রান্ত" আউটপুট পাবেন । তারপরে, আপনি অন্ধকারে লাফিয়ে যাচ্ছেন , অর্থাৎ ওয়ার্কশিটটি (আপনার ফাঁকা এবং ফাঁকা স্ট্রিংয়ের মধ্যে পার্থক্যটি লক্ষ্য করা উচিত) !)।

মনে রাখবেন যে:

  1. যদি আপনার পরিসীমাতে অ-স্বতন্ত্র অ-ফাঁকা ঘর থাকে, তবে এটি একটি ভুল ফলাফলও দেবে।

  2. যদি কেবল একটি অ-ফাঁকা ঘর থাকে তবে এটি প্রথমটি নয়, আপনার কোডটি আপনাকে এখনও সঠিক ফলাফল দেবে।


3
আমি সম্মত হই যে কোনটি প্রথমে সিদ্ধান্ত গ্রহণ করা উচিত যা ব্যবহৃত হিসাবে বিবেচিত হয় । আমি কমপক্ষে 6 টি অর্থ দেখতে পাচ্ছি। কক্ষের রয়েছে: 1) ডেটা, অর্থাত্ একটি সূত্র, সম্ভবত একটি ফাঁকা মান হতে পারে; 2) একটি মান, অর্থাত, একটি ফাঁকা সূত্র বা ধ্রুবক; 3) ফর্ম্যাটিং; 4) শর্তসাপেক্ষ বিন্যাস; 5) একটি আকার (মন্তব্য সহ) ঘরে ওভারল্যাপিং; 6) একটি সারণীতে জড়িত (তালিকা অবজেক্ট)। আপনি কোন সংমিশ্রনের জন্য পরীক্ষা করতে চান? কিছু (যেমন টেবিল) এর জন্য পরীক্ষা করা আরও কঠিন হতে পারে এবং কিছু বিরল হতে পারে (যেমন ডেটা সীমার বাইরে একটি আকার) তবে অন্যরা পরিস্থিতির ভিত্তিতে পরিবর্তিত হতে পারে (যেমন, ফাঁকা মান সহ সূত্র)।
গ্লেনফ্রিমআইওওয়া

20

আমি সর্বশেষ সারি, কলাম এবং সেল নির্ধারণের জন্য এই ওয়ানস্টপ ফাংশনটি তৈরি করেছি , এটি ডেটা ফর্ম্যাট করা (গোষ্ঠীযুক্ত / মন্তব্য করা / লুকানো) ঘর বা শর্তসাপেক্ষ বিন্যাসনের জন্যই হোক

Sub LastCellMsg()
    Dim strResult As String
    Dim lngDataRow As Long
    Dim lngDataCol As Long
    Dim strDataCell As String
    Dim strDataFormatRow As String
    Dim lngDataFormatCol As Long
    Dim strDataFormatCell As String
    Dim oFormatCond As FormatCondition
    Dim lngTempRow As Long
    Dim lngTempCol As Long
    Dim lngCFRow As Long
    Dim lngCFCol As Long
    Dim strCFCell As String
    Dim lngOverallRow As Long
    Dim lngOverallCol As Long
    Dim strOverallCell As String

    With ActiveSheet

        If .ListObjects.Count > 0 Then
            MsgBox "Cannot return reliable results, as there is at least one table in the worksheet."
            Exit Sub
        End If

        strResult = "Workbook name: " & .Parent.Name & vbCrLf
        strResult = strResult & "Sheet name: " & .Name & vbCrLf

        'DATA:
        'last data row
        If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
            lngDataRow = .Cells.Find(What:="*", _
             After:=.Range("A1"), _
             Lookat:=xlPart, _
             LookIn:=xlFormulas, _
             SearchOrder:=xlByRows, _
             SearchDirection:=xlPrevious, _
             MatchCase:=False).Row
        Else
            lngDataRow = 1
        End If
        'strResult = strResult & "Last data row: " & lngDataRow & vbCrLf

        'last data column
        If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
            lngDataCol = .Cells.Find(What:="*", _
             After:=.Range("A1"), _
             Lookat:=xlPart, _
             LookIn:=xlFormulas, _
             SearchOrder:=xlByColumns, _
             SearchDirection:=xlPrevious, _
             MatchCase:=False).Column
        Else
            lngDataCol = 1
        End If
        'strResult = strResult & "Last data column: " & lngDataCol & vbCrLf

        'last data cell
        strDataCell = Replace(Cells(lngDataRow, lngDataCol).Address, "$", vbNullString)
        strResult = strResult & "Last data cell: " & strDataCell & vbCrLf

        'FORMATS:
        'last data/formatted/grouped/commented/hidden row
        strDataFormatRow = StrReverse(Split(StrReverse(.UsedRange.Address), "$")(0))
        'strResult = strResult & "Last data/formatted row: " & strDataFormatRow & vbCrLf

        'last data/formatted/grouped/commented/hidden column
        lngDataFormatCol = Range(StrReverse(Split(StrReverse(.UsedRange.Address), "$")(1)) & "1").Column
        'strResult = strResult & "Last data/formatted column: " & lngDataFormatCol & vbCrLf

        'last data/formatted/grouped/commented/hidden cell
        strDataFormatCell = Replace(Cells(strDataFormatRow, lngDataFormatCol).Address, "$", vbNullString)
        strResult = strResult & "Last data/formatted cell: " & strDataFormatCell & vbCrLf

        'CONDITIONAL FORMATS:
        For Each oFormatCond In .Cells.FormatConditions

            'last conditionally-formatted row
            lngTempRow = CLng(StrReverse(Split(StrReverse(oFormatCond.AppliesTo.Address), "$")(0)))
            If lngTempRow > lngCFRow Then lngCFRow = lngTempRow

            'last conditionally-formatted column
            lngTempCol = Range(StrReverse(Split(StrReverse(oFormatCond.AppliesTo.Address), "$")(1)) & "1").Column
            If lngTempCol > lngCFCol Then lngCFCol = lngTempCol
        Next
        'no results are returned for Conditional Format if there is no such
        If lngCFRow <> 0 Then
            'strResult = strResult & "Last cond-formatted row: " & lngCFRow & vbCrLf
            'strResult = strResult & "Last cond-formatted column: " & lngCFCol & vbCrLf

            'last conditionally-formatted cell
            strCFCell = Replace(Cells(lngCFRow, lngCFCol).Address, "$", vbNullString)
            strResult = strResult & "Last cond-formatted cell: " & strCFCell & vbCrLf
        End If

        'OVERALL:
        lngOverallRow = Application.WorksheetFunction.Max(lngDataRow, strDataFormatRow, lngCFRow)
        'strResult = strResult & "Last overall row: " & lngOverallRow & vbCrLf
        lngOverallCol = Application.WorksheetFunction.Max(lngDataCol, lngDataFormatCol, lngCFCol)
        'strResult = strResult & "Last overall column: " & lngOverallCol & vbCrLf
        strOverallCell = Replace(.Cells(lngOverallRow, lngOverallCol).Address, "$", vbNullString)
        strResult = strResult & "Last overall cell: " & strOverallCell & vbCrLf

        MsgBox strResult
        Debug.Print strResult

    End With

End Sub

ফলাফলগুলি এর মতো দেখায়:
শেষ ঘর নির্ধারণ করুন

আরও বিশদ ফলাফলের জন্য কোডের কয়েকটি লাইন নিঃশর্ত করা যেতে পারে:
শেষ কলাম, সারি

একটি সীমাবদ্ধতা বিদ্যমান - যদি শীটটিতে টেবিল থাকে তবে ফলাফলগুলি অবিশ্বাস্য হতে পারে, তাই আমি এই ক্ষেত্রে কোডটি চালানো এড়াতে সিদ্ধান্ত নিয়েছি:

If .ListObjects.Count > 0 Then
    MsgBox "Cannot return reliable results, as there is at least one table in the worksheet."
    Exit Sub
End If

2
@ ফ্র্যাঙ্কলিন - আমি আপনার সংশোধন সহ একটি ইনবক্স বার্তাটি লক্ষ্য করেছি যা পর্যালোচকরা প্রত্যাখ্যান করেছিলেন। আমি সেই ভুল সংশোধন করেছি। আমার যখন প্রয়োজন হবে তখনই আমি এই ফাংশনটি ইতিমধ্যে ব্যবহার করেছি এবং আমি আবার এটি ব্যবহার করব, তাই সত্যই, বিশাল ধন্যবাদ, বন্ধু!
ZygD

11

সমাধানটি ব্যবহার করার সময় মনে রাখার জন্য একটি গুরুত্বপূর্ণ নোট ...

LastRow = ws.Cells.Find(What:="*", After:=ws.range("a1"), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

... আপনার LastRowভেরিয়েবল Longটাইপ রয়েছে তা নিশ্চিত করা :

Dim LastRow as Long

অন্যথায় আপনি .XLSX ওয়ার্কবুকগুলিতে নির্দিষ্ট পরিস্থিতিতে ওভারফ্লু ত্রুটিগুলি শেষ করবেন

এটি আমার এনক্যাপসুলেটেড ফাংশন যা আমি বিভিন্ন কোডের ব্যবহারগুলিতে ফেলে রাখি।

Private Function FindLastRow(ws As Worksheet) As Long
    ' --------------------------------------------------------------------------------
    ' Find the last used Row on a Worksheet
    ' --------------------------------------------------------------------------------
    If WorksheetFunction.CountA(ws.Cells) > 0 Then
        ' Search for any entry, by searching backwards by Rows.
        FindLastRow = ws.Cells.Find(What:="*", After:=ws.range("a1"), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    End If
End Function

8

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

এছাড়াও, আমার যে কোনও লাস্টরো পদ্ধতির সংস্করণটি ফাঁকা ওয়ার্কশিটের জন্য একটি শূন্য প্রদান করবে, তারপরে আমি জানতে পারি যে এটি ফাঁকা।


8

আমি অবাক হই যে এটির কথা কেউ উল্লেখ করেনি, তবে সর্বশেষ ব্যবহৃত সেলটি পাওয়ার সহজতম উপায় হ'ল:

Function GetLastCell(sh as Worksheet) As Range
    GetLastCell = sh.Cells(1,1).SpecialCells(xlLastCell)
End Function

এটি সেলটি নির্বাচন করার পরে আপনি Ctrl+ দ্বারা যে একই কক্ষটি পাবেন তা মূলত ফেরত দেয় ।EndA1

সাবধানতার একটি শব্দ: এক্সেল সবচেয়ে কার্যকরী নীচে ডান ঘরটি ট্র্যাক করে যা কোনও ওয়ার্কশিটে ব্যবহৃত হয়েছিল। তাই আপনি যদি উদাহরণস্বরূপ আপনি কিছু লিখুন B3 থেকে এবং অন্য কিছু H8 এবং তারপর পরে সামগ্রীগুলিকে মুছুন H8 টিপে Ctrl+ + Endএখনও নিয়ে যাবে H8 কক্ষ। উপরের ফাংশনটির একই আচরণ থাকবে।


2
Last Cellএক্সেলে মাঝে মাঝে একটি খালি ঘর (থেকে Used Range) বোঝায় যা এর থেকে পৃথক Last Used Cell;)।
shA.t

1
ওপিকে কেবল সর্বশেষ সারির দরকার ছিল তবে আপনি সঠিক, শেষ কক্ষটি H5 হওয়া উচিত ; তবে আপনি এ 5 এর মান মুছে ফেলার পরে আপনার ফাংশনটি পরীক্ষা করতে পারেন আপনি দেখতে পাবেন যে সর্বশেষ সেলটি খালি ঘর, এবং আমি মনে করি যে আপনার কোডটির এমন কিছু সম্পাদনা দরকার যা Cells(1,1).Select()এটি অবৈধ ActiveSheet.Cells(1,1).Select; এছাড়াও ভিবিএতে এটি ব্যবহার করার প্রস্তাব দেওয়া হয় না Select;)।
shA.t

5
এটি এক্সেল ভিবিএর জন্য দুটি মূল নিয়ম ভঙ্গ করে: নির্বাচন ব্যবহার করবেন না! এবং আপনি যে শীটটি চান তা সক্রিয় মনে করবেন না।
র‌্যাচেল হেটিঙ্গার

1
এটি একটি পুরানো উত্তর হল, কিন্তু এটি একটি অনুপস্থিত Set
বিগবেন

8

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

আমি সম্প্রসারিত করে শুরু করব sancho.s দ্বারা উত্তর এবং GlennFromIowa মন্তব্য , এমনকি আরো বিস্তারিত যোগ:

[...] প্রথমে কোনটি ব্যবহার হিসাবে বিবেচিত হবে তা সিদ্ধান্ত নিতে হবে। আমি কমপক্ষে 6 টি অর্থ দেখতে পাচ্ছি। সেল রয়েছে:

  • 1) ডেটা, অর্থাত্, একটি সূত্র, সম্ভবত একটি শূন্যমূল্যের ফলস্বরূপ;
  • 2) একটি মান, অর্থাত, একটি ফাঁকা সূত্র বা ধ্রুবক;
  • 3) ফর্ম্যাটিং;
  • 4) শর্তসাপেক্ষ বিন্যাস;
  • 5) একটি আকার (মন্তব্য সহ) ঘরে ওভারল্যাপিং;
  • 6) একটি সারণীতে জড়িত (তালিকা অবজেক্ট)।

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

আপনি বিবেচনা করতে পারেন অন্যান্য জিনিস:

  • ক) লুকানো সারিগুলি (যেমন অটোফিল্টার), ফাঁকা ঘর থাকতে পারে বা ফাঁকা সারি থাকতে পারে?
  • খ) কোন ধরণের পারফরম্যান্স গ্রহণযোগ্য?
  • গ) ভিবিএ ম্যাক্রো কোনওভাবে ওয়ার্কবুক বা অ্যাপ্লিকেশন সেটিংসকে প্রভাবিত করতে পারে?

এটি মনে রেখে, আসুন দেখুন "শেষ কক্ষ" পাওয়ার সাধারণ উপায়গুলি কীভাবে অপ্রত্যাশিত ফলাফল আনতে পারে:

  • .End(xlDown)প্রশ্নটি থেকে কোড (সঙ্গে যেমন সবচেয়ে সহজে ভঙ্গ করবে একটি একক খালি নয় এমন সেল অথবা যখন আছে মধ্যবর্তী ফাঁকা কোষ ) কারণে ব্যাখ্যা সিদ্ধার্থ পরাজিত দ্বারা উত্তর এখানে (অনুসন্ধান "xlDown সমানভাবে অবিশ্বস্ত হয়।" ) 👎
  • Countআইএন ( CountAবা Cells*.Count) এর উপর ভিত্তি করে যে কোনও সমাধান বা .CurrentRegionফাঁকা ঘর বা সারিগুলির উপস্থিতিতেও ভেঙে যায় 👎
  • .End(xlUp)একটি কলামের শেষে থেকে পিছনে সন্ধানের সাথে যুক্ত একটি সমাধান যেমন সিটিআরএল + ইউপি হিসাবে দৃশ্যমান সারিগুলিতে ডেটা অনুসন্ধান করবে (ফাঁকা মান উত্পাদনকারী সূত্রগুলিকে "ডেটা" হিসাবে বিবেচনা করা হয়) (সুতরাং এটি অটোফিল্টার সক্ষম করে এটি ব্যবহার করলে ভুল ফলাফল হতে পারে ⚠️ )।

    স্ট্যান্ডার্ড ক্ষতিগুলি এড়াতে আপনাকে যত্ন নিতে হবে (বিশদগুলির জন্য আমি আবার এখানে সিদ্ধার্থ রাউটের উত্তরটি উল্লেখ করব , " শেষ সারিটিতে হার্ড-কোডিংয়ের মতো " "একটি কলামে শেষ সারিটি সন্ধান করুন" বিভাগটি সন্ধান করুন) Range("A65536").End(xlUp)) পরিবর্তে উপর নির্ভর করে sht.Rows.Count

  • .SpecialCells(xlLastCell)"ব্যবহৃত ব্যাপ্তি" এর নীচে-সর্বাধিক এবং ডান-সর্বাধিক কক্ষটি ফেরত সিটিআরএল + এন্ডের সমতুল্য, সুতরাং "ব্যবহৃত ব্যাপ্তি" এর উপর নির্ভর করার জন্য প্রযোজ্য সমস্ত ক্যাভেটসও এই পদ্ধতিতে প্রযোজ্য। এছাড়াও, "ব্যবহৃত ব্যাপ্তি" কেবলমাত্র ওয়ার্কবুকটি সংরক্ষণ করার সময় এবং অ্যাক্সেস করার সময় পুনরায় সেট করা হয় worksheet.UsedRange, সুতরাং xlLastCellঅচিহ্নিত পরিবর্তনগুলি (যেমন কিছু সারি মুছার পরে মুছে ফেলা হয়) সহ বাসি ফলাফল তৈরি করতে পারে। ডটনেট দ্বারা কাছের উত্তর দেখুন ।
  • sht.UsedRange( এখানে সানচো.-এর উত্তরে বর্ণিত ) ডেটা এবং ফর্ম্যাটিং উভয় বিবেচনা করে (যদিও শর্তযুক্ত বিন্যাস নয়) এবং কার্যপত্রকের "ব্যবহৃত পরিসর" পুনরায় সেট করে , যা আপনি চান তা হতে পারে বা নাও পারে।

    নোট করুন যে একটি সাধারণ ভুল - ব্যবহার করতে .UsedRange.Rows.Countto, যা ব্যবহৃত পরিসরে সারিগুলির সংখ্যা প্রদান করে , শেষ সারি সংখ্যাটি নয় (প্রথম কয়েকটি সারি ফাঁকা হলে তারা আলাদা হবে), বিশদটির জন্য আমি কীভাবে খুঁজে পাব তার উত্তরটির উত্তর দেখুন ম্যাক্রো সহ এক্সেল শীটে ডেটা রয়েছে এমন সর্বশেষ সারিতে?

  • .Findআপনাকে কোনও ডেটা (সূত্র সহ) বা কোনও কলামে একটি ফাঁকা মান সহ শেষ সারিটি সন্ধান করতে দেয় । আপনি সূত্র বা মানগুলিতে আগ্রহী কিনা তা আপনি চয়ন করতে পারেন, তবে ধরা পড়লে এটি এক্সেলের অনুসন্ধান সংলাপ in এ ডিফল্টগুলি পুনরায় সেট করে ️️⚠️ যা আপনার ব্যবহারকারীদের জন্য অত্যন্ত বিভ্রান্তিকর হতে পারে। এটিও সাবধানে ব্যবহার করা দরকার, এখানে সিদ্ধার্থ রাউটের উত্তর দেখুন (বিভাগ "একটি শীটে শেষ সারিটি সন্ধান করুন" )
  • স্বতন্ত্র Cells'লুপে' পরীক্ষা করে এমন আরও স্পষ্ট সমাধানগুলি এক্সেল ফাংশনটি পুনরায় ব্যবহারের চেয়ে ধীর হয় (যদিও এখনও পারফরম্যান্ট হতে পারে) তবে আপনাকে কী সন্ধান করতে চান তা নির্দিষ্ট করে দিন। প্রদত্ত কলামে ডেটা সহ শেষ কক্ষটি সন্ধানের জন্য আমারUsedRange এবং ভিবিএ অ্যারে ভিত্তিক আমার সমাধানটি দেখুন - এটি লুকানো সারি, ফিল্টার, ফাঁকা স্থানগুলি পরিচালনা করে, ডিফল্টগুলি সন্ধান করে না এবং বেশ পারফর্মেন্ট হয়।

আপনি যেই সমাধান গ্রহণ করুন না কেন, সাবধান হন

  • ব্যবহারের Longপরিবর্তে Integerসারি সংখ্যা (পেয়ে এড়াতে সঞ্চয় করতে Overflowবেশি 65k সারি দিয়ে) এবং
  • আপনি যে ওয়ার্কশিটটি নিয়ে কাজ করছেন তা সর্বদা নির্দিষ্ট করার জন্য (যেমন Dim ws As Worksheet ... ws.Range(...)পরিবর্তে Range(...))
  • ব্যবহার করার সময় .Value(যা একটি Variant) অন্তর্ভুক্ত কাস্টমগুলি এড়িয়ে চলুন .Value <> ""যেমন সেগুলিতে ব্যর্থ হবে যদি ঘরে কোনও ত্রুটির মান থাকে।

4

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

{=ADDRESS(MATCH(INDEX(D:D,MAX(IF(D:D<>"",ROW(D:D)-ROW(D1)+1)),1),D:D,0),COLUMN(D:D))}

আপনার বন্ধনী ছাড়াই সূত্র প্রবেশ করতে হবে এবং তারপরে Shift+ Ctrl+ টিপুনEnter এটা একটি বিন্যাস সূত্র করা।

এটি আপনাকে ডি কলামে সর্বশেষ ব্যবহৃত কক্ষের ঠিকানা দেবে


1
আমি এই পছন্দ। আমি কেবল সারি নম্বর পেতে সামান্য পরিবর্তন করতে পারি ... '{= ম্যাচ (আইএনডিএক্স (ডি: ডি, ম্যাক্স (আইএফ (ডি: ডি <> "", র: (ডি: ডি) -আরো (ডি 1) +1))) , 1), ডি: ডি, 0)} '
পিজিসিস্টেমটেষ্টার

3
sub last_filled_cell()
msgbox range("A65536").end(xlup).row
end sub

এখানে, A65536কলাম এ এর ​​সর্বশেষ সেলটি এই কোডটি এক্সেল 2003 এ পরীক্ষা করা হয়েছিল।


আপনার কোডটি কীভাবে এই পুরানো প্রশ্নের উত্তর দেয় তা আপনি ব্যাখ্যা করতে পারেন?
shurver

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

2

আমি অনুকরণ করতে একটি উপায় খুঁজছেন ছিল CTRL+ + Shift+ + End, তাই dotNET সমাধান মহান, আমার এক্সেল 2010 সঙ্গে আমি একটি যোগ করতে হবে বৈ setআমি যদি একটি ত্রুটি এড়াতে চান:

Function GetLastCell(sh As Worksheet) As Range
  Set GetLastCell = sh.Cells(1, 1).SpecialCells(xlLastCell)
End Function

এবং কীভাবে এটি নিজের জন্য পরীক্ষা করবেন:

Sub test()
  Dim ws As Worksheet, r As Range
  Set ws = ActiveWorkbook.Sheets("Sheet1")
  Set r = GetLastCell(ws)
  MsgBox r.Column & "-" & r.Row
End Sub

1

এখানে আমার দুটি সেন্ট।

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

Findপদ্ধতি নিশ্ছিদ্র এবং আমি একটি এটি অনুমোদন করে ওয়ান স্টপ উত্তর । তবে পরিবর্তনের অপূর্ণতাFind সেটিংস বিরক্তিকর হতে পারে, বিশেষত যদি এটি কোনও ইউডিএফের অংশ হয়।

পোস্ট করা অন্য উত্তরগুলি ঠিক আছে, তবে জটিলতাটি কিছুটা অতিরিক্ত। সুতরাং এখানে নির্ভরযোগ্যতা, ন্যূনতম জটিলতা, এবং ব্যবহার না করার ভারসাম্য খুঁজে পাওয়ার জন্য আমার প্রয়াস এখানে Find

Function LastRowNumber(Optional rng As Range) As Long

If rng Is Nothing Then
    Set rng = ActiveSheet.UsedRange
Else
    Set rng = Intersect(rng.Parent.UsedRange, rng.EntireColumn)
    If rng Is Nothing Then
        LastRowNumber = 1
        Exit Function
    ElseIf isE = 0 Then
        LastRowNumber = 1
        Exit Function

    End If

End If

LastRowNumber = rng.Cells(rng.Rows.Count, 1).Row

Do While IsEmpty(Intersect(rng, _
    rng.Parent.Rows(LastRowNumber)))

    LastRowNumber = LastRowNumber - 1
Loop

End Function

কেন এটি ভাল:

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

কেন এটি খারাপ:

  • তথ্যের খুব বড় সেট এবং নির্দিষ্ট কলামগুলিতে ব্যবহৃত পরিসীমা এবং শেষ সারিটির মধ্যে একটি বিশাল ব্যবধান সহ, এটি বিরল ক্ষেত্রে স্বাক্ষরিত হবে, খুব কম ক্ষেত্রে স্বাক্ষর করবে।

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


1

গত 3+ বছর ধরে এটি হ'ল ফাংশন যা আমি নির্ধারিত কলাম (সারি জন্য) এবং সারি (কলামের জন্য) অনুসারে সর্বশেষ সারি এবং শেষ কলামটি অনুসন্ধান করার জন্য ব্যবহার করছি:

শেষ কলাম:

Function lastCol(Optional wsName As String, Optional rowToCheck As Long = 1) As Long

    Dim ws  As Worksheet

    If wsName = vbNullString Then
        Set ws = ActiveSheet
    Else
        Set ws = Worksheets(wsName)
    End If

    lastCol = ws.Cells(rowToCheck, ws.Columns.Count).End(xlToLeft).Column

End Function

শেষ সারি:

Function lastRow(Optional wsName As String, Optional columnToCheck As Long = 1) As Long

    Dim ws As Worksheet

    If wsName = vbNullString Then
        Set ws = ActiveSheet
    Else
        Set ws = Worksheets(wsName)
    End If

    lastRow = ws.Cells(ws.Rows.Count, columnToCheck).End(xlUp).Row

End Function

ওপির ক্ষেত্রে, কলামে এটি সর্বশেষ সারিটি পাওয়ার উপায় E:

Debug.Print lastRow(columnToCheck:=Range("E4:E48").Column)

শেষ সারি, ডেটা সহ খালি সারিগুলি গণনা:

এখানে আমরা সুপরিচিত এক্সেল সূত্রগুলি ব্যবহার করতে পারি , যা আমাদের ভিসিএ জড়িত না করে এক্সেলের একটি কার্যপত্রকের শেষ সারি দেয় -=IFERROR(LOOKUP(2,1/(NOT(ISBLANK(A:A))),ROW(A:A)),0)

পরের ফাংশনগুলির জন্য প্যারামিটারগুলি ব্যবহার করে এটি ভিবিএতে রাখার জন্য এবং এক্সেলে কিছু লিখতে না দেওয়ার জন্য এরকম কিছু মনে রাখতে পারে:

Public Function LastRowWithHidden(Optional wsName As String, Optional columnToCheck As Long = 1) As Long

    Dim ws As Worksheet

    If wsName = vbNullString Then
        Set ws = ActiveSheet
    Else
        Set ws = Worksheets(wsName)
    End If

    Dim letters As String
    letters = ColLettersGenerator(columnToCheck)
    LastRowWithHidden = ws.Evaluate("=IFERROR(LOOKUP(2,1/(NOT(ISBLANK(" & letters & "))),ROW(" & letters & " )),0)")

End Function

Function ColLettersGenerator(col As Long) As String

    Dim result As Variant
    result = Split(Cells(1, col).Address(True, False), "$")
    ColLettersGenerator = result(0) & ":" & result(0)

End Function

শেষ সারি / কলামটি গোপন করা থাকলে এটি একটি ভুল ফলাফল প্রদান করবে।
পিজিসিস্টেমটেষ্টার

@ পিজিসিস্টেমটেষ্টার - হ্যাঁ, তবে আমার বোঝার মধ্যে আমি যখন এটি প্রোগ্রাম করি, এটি যদি লুকানো থাকে তবে এটি প্রয়োজনীয় শেষ কলাম / সারি নয়।
ভিটিটা

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

@ পিজিসিস্টেমটেষ্টার - আমি আপনার বক্তব্যটি পেয়েছি, তবে কাঠামোর যত্ন নেওয়া এবং অদৃশ্য কোষকে মন্ত্রীর মতো কাজ করতে না দেওয়া।
ভিটিটা

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

0
Sub lastRow()

    Dim i As Long
        i = Cells(Rows.Count, 1).End(xlUp).Row
            MsgBox i

End Sub

sub LastRow()

'Paste & for better understanding of the working use F8 Key to run the code .

dim WS as worksheet
dim i as long

set ws = thisworkbook("SheetName")

ws.activate

ws.range("a1").select

ws.range("a1048576").select

activecell.end(xlup).select

i= activecell.row

msgbox "My Last Row Is " & i

End sub
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.