Using the Find Function in VBA

一笑奈何 提交于 2020-07-08 20:33:27

问题


1
2
3
4  
.
.

So I have a sequence of numbers running from 1-20. I have the number "1" on top selected and I would like to search the entire column and find the number "9". The code works when I don't name the range "rng"; it finds the number and selects. But the code stops working when I name the range of number. What's wrong with the range function? could it be that if I define Dim rng as Range that when I later define the "Set rng=" I cannot have the ".Select" or ".Copy" extension on the end?

Sub macro2()

Dim rng As Range
Set rng = Range(ActiveCell, ActiveCell.End(xlDown)).Select
rng.Find(10).Select

End Sub

Also, If I want to sum the entire column from 1-20, on the last cell below the number "20" should I use the following code? because the application object doesn't seem to do it. Thank you!

rng.End(xlDown).Offset(1, 0).Select
Application.WorksheetFunction.Sum (rng.Value)

回答1:


To look for 10 in the active column you could try this (which ends up selecting the first 10 - although Select in vba isn't normally needed other than taken the user to location at code end)

  • test that the found range exists (ie you can find 10 before proceeding)
  • you should also use xlWhole to avoid matching 100 if the current default for [lookAt] is xlPart
  • using search [After] as Cells(1, ActiveCell.Column , and [Search Direction] as xlNext finds the first value looking down.

code

Sub QuickFind()
Dim rng1 As Range
Set rng1 = ActiveCell.EntireColumn.Find(10, Cells(1, ActiveCell.Column), xlFormulas, xlWhole, , xlNext)
If Not rng1 Is Nothing Then
Application.Goto rng1
Else
MsgBox "10 not found"
End If
End Sub

Part 2

Sub Other()
Dim rng1 As Range
Set rng1 = Range(Cells(1, ActiveCell.Column), Cells(Rows.Count, ActiveCell.Column).End(xlUp))
rng1.Cells(rng1.Cells.Count).Offset(1, 0) = Application.WorksheetFunction.Sum(rng1.Value)
End Sub



回答2:


Try this, I hope this will help u to find the specific row no as well as column name too. In code you can use

strRw = FindColumn(Sheet name, "Value which need to be found", True, "Cell Name",Row number)
sourceCOL = colname(FindColumn(Shee Name, "Value which need to be found", False, , 4))

Below is main function of find

Public Function FindColumn(colnocountWS As Worksheet, srcstr As String, Optional rowflag As Boolean, Optional bycol As String, Optional strw As Integer, Optional stcol As Integer) As Integer
            Dim srcrng      As Range     'range of search text
            Dim srcAddr     As String  'address of search text
            Dim stcolnm     As String

            colnocountWS.Activate
            If stcol <> 0 Then stcolnm = colname(stcol)
            If stcol = 0 Then stcolnm = "A"
            If strw = 0 Then strw = 1


            colnocountWS.Range(stcolnm & strw).Select

            If ActiveSheet.Range(stcolnm & strw) = srcstr Then
                ActiveSheet.Range(stcolnm & strw).Select
                FindColumn = 1
            Else
            If bycol = "" Then
                Set srcrng = colnocountWS.Cells.Find(Trim(srcstr), after:=ActiveCell, LookIn:=xlValues _
                , LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                MatchCase:=False, SearchFormat:=False)
            Else
                Set srcrng = colnocountWS.Cells.Find(Trim(srcstr), after:=ActiveCell, LookIn:=xlValues _
                , LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
                MatchCase:=False, SearchFormat:=False)
            End If
            'ByPart
            If srcrng Is Nothing Then
                If bycol = "" Then
                    Set srcrng = colnocountWS.Cells.Find(Trim(srcstr), after:=ActiveCell, LookIn:=xlValues _
                    , LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                    MatchCase:=False, SearchFormat:=False)
                Else
                    Set srcrng = colnocountWS.Cells.Find(Trim(srcstr), after:=ActiveCell, LookIn:=xlValues _
                    , LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
                    MatchCase:=False, SearchFormat:=False)
                End If
            End If

                If srcrng Is Nothing Then
                FindColumn = 0
                 Exit Function
                Else
                    srcAddr = srcrng.Address
                    colnocountWS.Range(srcAddr).Select
                    FindColumn = ActiveCell.Column
                    If rowflag = True Then FindColumn = ActiveCell.Row
                End If

            End If
        End Function

        'this function find column name
        Public Function colname(iFinalCol1 As Integer) As String
        Dim colnm As String
        On Error GoTo gg
        If Mid(Cells(1, iFinalCol1).Address, 3, 1) = "$" Then
                colnm = Mid(Cells(1, iFinalCol1).Address, 2, 1)
          Else
                colnm = Mid(Cells(1, iFinalCol1).Address, 2, 2)
        End If
        gg: colname = colnm

        End Function


来源:https://stackoverflow.com/questions/13328395/using-the-find-function-in-vba

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!