excel - ভিবিএতে শেষ ব্যবহৃত সেল খুঁজে পেতে ত্রুটি




vba excel-vba (8)

যখন আমি শেষ ব্যবহৃত সেল মানটি সন্ধান করতে চাই, তখন আমি ব্যবহার করি:

Dim LastRow As Long

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

Debug.Print LastRow

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


আমি CTRL + Shift + End অনুকরণ করার উপায় খুঁজছিলাম, তাই ডটনেট সমাধানটি দুর্দান্ত, আমার এক্সেল 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

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

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

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

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


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

আমি sancho.s দ্বারা উত্তরের উপর সম্প্রসারিত করে শুরু করব এবং গ্লেনফ্রোমোয়ায় মন্তব্যটি আরো বিস্তারিতভাবে যুক্ত করব:

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

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

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

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

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

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

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

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

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

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

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

আপনি যাই হোক না কেন সমাধান, সাবধান হতে হবে

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

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

{=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 টিপুন

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


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

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

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

Dim LastRow as Long

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

এই আমার encapsulated ফাংশন যে আমি বিভিন্ন কোড ব্যবহার ড্রপ।

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

শেষ ব্যবহৃত কোষটি খোঁজার সঠিক পদ্ধতি হিসাবে, কোনটিকে প্রথমে কী বিবেচনা করা হয় তা নির্ধারণ করতে হবে এবং তারপরে একটি উপযুক্ত পদ্ধতি নির্বাচন করুন । আমি কমপক্ষে তিনটি অর্থ অনুভব করি:

  1. ব্যবহৃত = নন-ফাঁকা, অর্থাৎ, তথ্য থাকা

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

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

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

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

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

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

আপনার নির্দিষ্ট প্রশ্নঃ এর পেছনে কি কারণ?

End(xlDown) সাথে জাম্পিং করার জন্য আপনার কোডটি আপনার পরিসীমা E4: E48 এ ট্রামপোলাইন হিসাবে প্রথম ঘরটি ব্যবহার করে।

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

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

  1. যদি আপনার পরিসরের মধ্যে অ-অসম্পূর্ণ অ-ফাঁকা কোষ রয়েছে তবে এটি একটি ভুল ফলাফলও দেবে।

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


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




excel-formula