繁体   English   中英

Excel VBA:将变量分配给AdvancedFilter结果中的第一个单元格的值

[英]Excel VBA: Assigning a variable to the value of the first cell from results of an AdvancedFilter

我正在尝试获取列C中第一个过滤器结果的值。标头在A5到J5上,然后结果在下面。 指向C6可以得到未过滤的数据库第一行的值。 我已经在线阅读了使用

Range("C" & .Offset(1, 0).SpecialCells(xlCellTypeVisible)(1).Row).Value

将返回该值,因为考虑到某些行被过滤掉了,但这对我不起作用。 我尝试将其放在设置了FilteredData Range变量的GetNextResult子例程中,并提示编译错误,无效或不合格的引用。

为了清楚起见,第一个子例程FilterData实际上是过滤数据的子例程。 第二个子例程GetNextResult调用FilterData(),但此子例程的目的是在每次执行此宏时将每个结果的值一个接一个地插入到文本框中。

并不是说它与问题特别相关,但是如果它很重要,那么我想要过滤时第一个结果的值的原因是出于计数器的目的。 我希望这样做,以便每次GetNextResult宏将下一个结果发送到文本框时,计数器都会增加一个,从而使用户可以跟踪经过了多少次循环,而不会到达终点他们没有意识到他们一遍又一遍地看到相同的结果。 我想,如果我可以得到第一个过滤行的值,那么我可以做一个if语句,说如果文本框包含该值,那么请确保计数器为1,这就是重置点。

Public Sub FilterData()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Database")

    Dim LastRow As Long
    LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row


    Dim CriteriaRange As Range
    Set CriteriaRange = ws.Range("A2", "C3")

    If Range("C3").Value = "Any" Then
    Set CriteriaRange = ws.Range("A2", "B3")
    End If

    Dim DataRange As Range
    Set DataRange = ws.Range("A5", "J" & LastRow)



    DataRange.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=CriteriaRange, Unique:=False

    Call last_used_sort

    If Not DataRange.Columns(1).Rows.SpecialCells(xlCellTypeVisible).Count > 1 Then

        Call ShowAll
        MsgBox "No Results"        

        Exit Sub

    End If


End Sub
Public Sub GetNextResult()


    FilterData


    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Database")

    Dim header As String
    header = "Cards"

    Dim LastRow As Long
    LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row


    Dim DataRange As Range
    Set DataRange = ws.Range("A5", "J" & LastRow)

    Dim FilteredData As Range
    Set FilteredData = DataRange.Resize(ColumnSize:=1).SpecialCells(xlCellTypeVisible)


    If CurrentRow + 1 > FilteredData.Cells.Count Then
        CurrentRow = 1
    End If


    CurrentRow = CurrentRow + 1

    With FilteredData
    first_row = Range("C" & .Offset(1, 0).SpecialCells(xlCellTypeVisible)(1).Row).Value
    End With
    Debug.Print first_row


    Dim i As Long
    Dim cell As Variant
    Static counter As Long

    counter = counter + 1

    If counter = Quick_Insert_Range Then
    counter = 1
    End If

    ActiveSheet.Shapes("Cardcounter").TextFrame.Characters.Text = counter


    For Each cell In FilteredData

        i = i + 1
        If i = CurrentRow Then
            Call ShowAll


            TextboxName = "txt1"
            ActiveSheet.Shapes(TextboxName).DrawingObject.Text = cell.Offset(0, 2)

            TextboxName2 = "txt2"
            ActiveSheet.Shapes(TextboxName2).DrawingObject.Text = cell.Offset(0, 3)

            TextboxName3 = "txt3"
            ActiveSheet.Shapes(TextboxName3).DrawingObject.Text = cell.Offset(0, 4)


            If ActiveSheet.Shapes(TextboxName).DrawingObject.Text = header Then

                Call GetNextResult
            End If

            Call quick_artwork


        Else
            Call ShowAll

        End If


    Next cell


End Sub

在第二个代码中,您没有调用过滤数据。 您的前两行代码应为

Public Sub GetNextResult()    

    Call FilterData

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM