Функция поиска VBA, которая не возвращает нулевые значения - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть таблица с символами тикера (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

1 Ответ

0 голосов
/ 02 февраля 2019

.Find будет работать только с видимыми ячейками, поэтому для вашего случая может быть проще просто программно применить .AutoFilter и отфильтровать значения с 0, прежде чем вы запустите свои функции .Find.

Что-то вроде

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 ранее стоит отметить, что критерий Field для .AutoFilter является относительным показателем, основанным на указанном диапазоне.Это значит, что Field:=1 для Range("A:B") применил бы фильтр к столбцу A, но Field:=1 для Range("F:G") применил бы фильтр к столбцу F.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...