[英]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.