【问题标题】:VBA Find Function That Does Not Return Values of ZeroVBA查找不返回零值的函数
【发布时间】:2019-02-01 20:52:00
【问题描述】:

我有一张表,上面有股票代码 (A)、一年中的工作日 (B)、开盘价 (C)、高价 (D)、低价 (E)、收盘价 (F) 和卷 (E)。数据按工作日按时间顺序排列,按股票代码按字母顺序排列(是的,它与我之前提交的问题有关)。

我正在尝试运行一个子例程,该例程将查找出现股票代码的第一行号(该年的开盘值)。使用对应的行号和列号,拉取开盘值。然后使用该值根据我在单独列中创建的年度增量创建一个百分比。

以下代码可以正常工作,直到表格的一部分以 0 作为开始值。相关的股票代码直到稍后在表格中才会出现非零价格(例如,股票代码的 IPO 发生在年中......)。我希望会有一个简单的 IF 语句来解释这一点,并为正在查找的股票代码提取第一个非零值。

从其他在线问题中,我只找到了索引或匹配列中不等于零的值的解决方案。但是我发现是否有 0 的方式是引用第一个行号出现一个代码...我还没有找到将任何其他解决方案合并到我的代码中的方法。

Sub Percent()
'Column Header
Cells(1, 11).Value = "Percent Change"

'Set dims
Dim Summary_Table_Row3 As Integer
Summary_Table_Row3 = 2
LastRow3 = Cells(Rows.Count, 10).End(xlUp).Row

'Find start row with unique Ticker
Dim TickStartRow As Double

'Loop through all unique tickers
For I = 2 To LastRow3

  'Find start row
  TickStartRow = Range("A:A").Find(what:=Cells(I, 9), after:=Range("A1"), 
  LookAt:=xlWhole).Row

    'If the yearly change is 0, set percentage to 0
    If Cells(I, 10) = 0 Then
    Cells(I, 11) = 0

    '''ElseIf statement to find first non-zero value if opening value = 0 ?

    'Create percentage for all other non-zero percentages
    Else
    Cells(I, 11) = Cells(I, 10) / Cells(TickStartRow, 3)

    End If

  Cells(I, 11).NumberFormat = "0.00%"

  'Add one to the summary table row
  Summary_Table_Row1 = Summary_Table_Row1 + 1

Next I

End Sub

【问题讨论】:

    标签: excel vba find


    【解决方案1】:

    .Find 仅适用于可见单元格,因此对于您的情况,在您触发 .Find 函数之前以编程方式应用 .AutoFilter 并过滤掉带有 0 的值可能更容易。

    类似

    If Worksheets(1).AutoFilterMode = False Then 'Replace Worksheets(1) with a reference to your sheet
        Worksheets(1).Cells.AutoFilter
    End If
    
    Worksheets(1).Range("A:Z").AutoFilter Field:=10, Criteria1:="<>0" 'Again, replace Worksheets(1) and Range("A:Z") with applicable values
    

    就在您的For-Next 循环开始工作之前。然后只需取下过滤器

    Cells.AutoFilter
    

    在循环结束之外。

    编辑:

    如果您以前没有使用过.AutoFilter,值得注意的是.AutoFilterField 条件是基于指定范围的相对索引。也就是说,Field:=1 for Range("A:B") 将在 A 列上应用过滤器,但 Field:=1 for Range("F:G") 将在 F 列上应用过滤器。

    【讨论】:

    • 简单而有效。再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多