Форум трейдеров » Торговые роботы, советники, индикаторы » Вопрос по VBA
+ Подписаться
Страница 1 из 4 123 ... ПоследняяПоследняя
  1. 13,357
    Комментарии
    62
    Темы
    18691
    Репутация Pro
    Аватар для reimin  
    Худая голова

    8 Медалей

    Вопрос по VBA

    Для ячейки AZ100 получилась такая функция в экселе =ЕСЛИ(E101-E100<$AJ$24;ЕСЛИ(AK100=1;E101-E100-$AJ$24;"");"")

    Вкратце смысл такой, что если в ячейке AK100 значение равно1, то нужно вычесть из значения ячейки E101 значение ячейки E100. Результат записать в ячейку AZ100. И так далее.

    Если значение в я чейке AK100 не равно 1 то идем дальше и проверяем значение в ячейке AK101. Если оно равно 1, то разницу значений E102 и E101 записываем в ячейку AZ101.

    $AJ$24 это постоянное значение, например равное 0,0100

    Схему алгоритма вроде себе представляю. Типа:

    If.....Then...
    ElseIf....
    Else....
    End If

    Но вот с этим синтаксисом и Offset чет совсем запутался.
    Может есть кто в этом деле рубит? Выручите!
    Недоступно! Pro 0
    Поделиться
    Просмотров: 8,514
  2. 1,069
    Комментарии
    3
    Темы
    1090
    Репутация Pro
    Аватар для SLavaLL  
    Мастер форумных наук

    3 Медалей
    А в чем проблема?

    Если E101-E100<$AJ$24, и AK100=1, то E101-E100-$AJ$24
    иначе пустая строка

    Значок доллара используется только при копировании формулы, т.е. если он стоит перед буквой, то при копировании вправо, буква адреса останется та же, иначе она будет автоматически увеличена.
    То же самое для цифры, если значок доллара перед цифрой, то при копировании формулы вниз она не увеличвается
  3. 13,357
    Комментарии
    62
    Темы
    18691
    Репутация Pro
    Аватар для reimin  
    Худая голова

    8 Медалей
    Да нет... в экселе получилась правильная формула. Но дело в том, что эта формула только проверка одного условия, а мне их нужно будет проверять несколько. А в экселе это вряд ли получится.
    А адрес $AJ$24 это абсолютный адрес в ячейке экселя. Но это ни при чем. Там смысл $ это в абсолютном адресе.
    Вобщем-то поэтому и нужно в VBA се это написать.
  4. 1,069
    Комментарии
    3
    Темы
    1090
    Репутация Pro
    Аватар для SLavaLL  
    Мастер форумных наук

    3 Медалей
    Цитата Сообщение от reimin Посмотреть сообщение
    Да нет... в экселе получилась правильная формула. Но дело в том, что эта формула только проверка одного условия, а мне их нужно будет проверять несколько. А в экселе это вряд ли получится.
    А адрес $AJ$24 это абсолютный адрес в ячейке экселя. Но это ни при чем. Там смысл $ это в абсолютном адресе.
    Вобщем-то поэтому и нужно в VBA се это написать.
    А вопрос-то в чем? Вы предлагаете кому-то реализовать Ваши проверки в VBA (кстати, VBA - это бейсик, который используется в приложениях Office, тогда не понятно, что значит в экселе вряд ли получится) или Вы пытаетесь сами это реализовать и у Вас не получается. Если второе, тогда что не получается?
  5. 13,357
    Комментарии
    62
    Темы
    18691
    Репутация Pro
    Аватар для reimin  
    Худая голова

    8 Медалей
    Цитата Сообщение от SLavaLL Посмотреть сообщение
    ...Если второе, тогда что не получается?
    Да вот я начал только этот визуал бейсик учить.
    Написал цикл проверки этого условия. Ну прям долго не мог без ошибок его написать. В конце концов он начал проверять условия по порядку, но только результаты записывал только в 2 ячейки. Потом ну никак. В очередной раз мучений он запустил бесконечный цикл и пришлось эксель с ВБА закрывать. А вся писанина моя не сохранилась. Вот, блин, придется вспоминать, чтобы снова ее исправлять. Она ведь была неправильная. Я просто не понял как правильно применять Offset.
    По смыслу назначаешь адрес для ячейки например
    x=100
    AZ100 - ("AZ", x)
    дальше x=x+1

    но чет у меня не получается.
  6. 1,069
    Комментарии
    3
    Темы
    1090
    Репутация Pro
    Аватар для SLavaLL  
    Мастер форумных наук

    3 Медалей
    Я вообще-то для адресации ячейки пользуюсь номером строки и столбца, например:

    Dim i As Integer
    Dim j As Integer
    For i = 1 To 10
    For j = 1 To 3
    Worksheets("Лист1").Cells(i, j) = i * j
    Next j
    Next i

    End Function
  7. 1,069
    Комментарии
    3
    Темы
    1090
    Репутация Pro
    Аватар для SLavaLL  
    Мастер форумных наук

    3 Медалей
    Насчет функции Offset, она возвращает ссылку на диапазон ячеек смещенный относительно указанного диапазона на указанное в параметрах количество строк и столбцов.

    Range.Offset PropertyReturns a Range object that represents a range that’s offset from the specified range.
    Syntax
    expression.Offset(RowOffset, ColumnOffset)
  8. 1,069
    Комментарии
    3
    Темы
    1090
    Репутация Pro
    Аватар для SLavaLL  
    Мастер форумных наук

    3 Медалей
    Вот еще небольшой примерчик:

    Function test()
    Dim i As Integer
    Dim j As Integer
    Dim wst As Worksheet
    Dim rng As Range
    Dim rng1 As Range
    Set wst = Worksheets("Лист1")
    Set rng = wst.Range(Cells(3, 3), Cells(10, 3))
    Set rng1 = rng.Offset(15, 5)
    wst.Cells.Clear
    wst.Cells(1, 1) = "Адрес rng = " & rng.Address(False, False)
    wst.Cells(2, 1) = "Адрес rng1 = " & rng1.Address(True, True)
    For i = 1 To 10
    For j = 1 To 3
    rng(i, j) = i * j
    rng1(i, j) = i * j * 2
    Next j
    Next i
    End Function
  9. 13,357
    Комментарии
    62
    Темы
    18691
    Репутация Pro
    Аватар для reimin  
    Худая голова

    8 Медалей
    Цитата Сообщение от SLavaLL Посмотреть сообщение
    Я вообще-то для адресации ячейки пользуюсь номером строки и столбца, например:

    Dim i As Integer
    Dim j As Integer
    For i = 1 To 10
    For j = 1 To 3
    Worksheets("Лист1").Cells(i, j) = i * j
    Next j
    Next i

    End Function
    Worksheets("Лист1").Cells(i, j) = i * j А что вот в данном случае это выражение означает? Перебор значений i и j? То есть 1,1 1,2 1,3 2,1 ....это?

    Цитата Сообщение от SLavaLL Посмотреть сообщение
    Насчет функции Offset, она возвращает ссылку на диапазон ячеек смещенный относительно указанного диапазона на указанное в параметрах количество строк и столбцов....]
    Насчет Offset я понял как это смещение работает.
    не могу только как его задать здесь..

    Dim ak As Range
    Dim e0 As Range
    Dim e1 As Range
    Dim f As Range
    Dim x As Integer

    Set ak (AK100, AK10000)
    Set e0 (E100, E10000)
    Set e1 (E101, AK10001)
    Set f (F100, F10000)

    If ak.Value = 1 , e1>= e0
    Then f.Value = e1.Value - e0Value
    x = x + 1
    " блин дальше не помню что было...)
    ak = ak.Offset (0 , 1)
    e0 = e0.Offset (0 , 1)
    e1 = e1.Offset (0 , 1)
    f = f.Offset (0 , 1)
    Else
    ..............

    End If


    Цитата Сообщение от SLavaLL Посмотреть сообщение
    Вот еще небольшой примерчик:

    Function test()
    Dim i As Integer
    Dim j As Integer
    Dim wst As Worksheet
    Dim rng As Range
    Dim rng1 As Range
    Set wst = Worksheets("Лист1")
    Set rng = wst.Range(Cells(3, 3), Cells(10, 3))
    Set rng1 = rng.Offset(15, 5)
    wst.Cells.Clear
    wst.Cells(1, 1) = "Адрес rng = " & rng.Address(False, False)
    wst.Cells(2, 1) = "Адрес rng1 = " & rng1.Address(True, True)
    For i = 1 To 10
    For j = 1 To 3
    rng(i, j) = i * j
    rng1(i, j) = i * j * 2
    Next j
    Next i
    End Function
    Вот это пытаюсь осознать.. но я только ВБА вторую неделю учу....поэтому далеко не все понимаю. Блин... чет с расстройства голова не соображает((
  10. 1,069
    Комментарии
    3
    Темы
    1090
    Репутация Pro
    Аватар для SLavaLL  
    Мастер форумных наук

    3 Медалей
    Цитата Сообщение от reimin Посмотреть сообщение
    Worksheets("Лист1").Cells(i, j) = i * j А что вот в данном случае это выражение означает? Перебор значений i и j? То есть 1,1 1,2 1,3 2,1 ....это?
    Да, это перебор значений, и кажной ячейке в строке i и столбце j присваивается значение i*j

    Попробуйте вот так например:

    Function test1()
    Dim wst As Worksheet
    Dim ak As Range
    Dim e0 As Range
    Dim e1 As Range
    Dim f As Range
    Dim i As Integer
    Set wst = Worksheets("Лист2")
    Set ak = wst.Range("AK100:AK10000")
    Set e0 = wst.Range("E100:E10000")
    Set e1 = wst.Range("E101:AK10001")
    Set f = wst.Range("F100:F10000")
    For i = 1 To ak.Cells.Count
    If ak(i, 0) = 1 And e1(i, 0) >= e0(i, 0) Then
    f(i, 0) = e1(i, 0) - e0(i, 0)
    Else
    f(i, 0) = ""
    End If
    Next i
    End Function

Вверх
РегистрацияX

чтобы писать, читать, комментировать