Вопрос по Excel
Так вот вопрос. Как сделать так чтобы при появлении 1 в 7 ячейке, во второй лист писалась полная строка из первого листа(в 7 ячейке которого соббсно и стоит 1)? Причем не перезаписывала предыдущую строку, а писала дальше.
В Екселе 2 листа. На 1 лист поступает инфа. При поступлении инфы происходит сравнение в пятой и шестой ячейках. Если значение в 5 ячейке равняется значению в 6, то в 7 ячейку ставится 1. Если нет, то пустая строка.
Так вот вопрос. Как сделать так чтобы при появлении 1 в 7 ячейке, во второй лист писалась полная строка из первого листа(в 7 ячейке которого соббсно и стоит 1)? Причем не перезаписывала предыдущую строку, а писала дальше.
Это тебе надо обработчик событий сделать.
В твоем случае подойдет
Worksheets_Change
Если тебе надобно, я тебе объясню все поподробнее, ты только сообщи, насколько ты владеешь Экселем (типа, на каком уровне объяснять) и поподробней задание.
Такие вопросы возникают сразу:
1. Откуда берется инфа в 5-й и 6-й ячейках?
(ее юзер вносит или программа какая?)
2. Давай приведем твой лексикон к принятому экселевскому. У тебя на Листе 1 есть куча строк, и в 5-6-м столбцах какой-либо из строк появляются изменения? А потом ты хочешь, чтобы вся строка с изменением попадала на Лист 2 в конец имеющегося там списка? Так все?
Если тебе надобно, я тебе объясню все поподробнее, ты только сообщи, насколько ты владеешь Экселем (типа, на каком уровне объяснять) и поподробней задание.
Такие вопросы возникают сразу:
1. Откуда берется инфа в 5-й и 6-й ячейках?
(ее юзер вносит или программа какая?)
2. Давай приведем твой лексикон к принятому экселевскому. У тебя на Листе 1 есть куча строк, и в 5-6-м столбцах какой-либо из строк появляются изменения? А потом ты хочешь, чтобы вся строка с изменением попадала на Лист 2 в конец имеющегося там списка? Так все?
Кхм, насколько я владею Экселем. Скорее, надо спрашивать насколько я владею VB. Экселем я владею на среднем уровне. А вот ВБ - я только начал изучать.
В 5 ячейке забито определенное число - стоимость 1 акции за которую я хочу купить. В 6 ячейку поступает цена акции на данный момент(поступает с периодичностью 1 минута).
Как только число из 6 ячейки достигнет числа из 5 ячейки, то акция будет куплена.
А чтобы проконтролировать сделку, я добавил в 7 ячейку. Как только в 7 ячейке появляется 1, это означает что сделка возможна и будет совершенна, а данные по этой акции(они расположены вдоль одной строки) будут переписаны на 2 Лист.
Я просто хочу облегчить труд трейдеров написав на Экселе такой опус.
Ага, понятно. Остался еще один важный вопрос: откуда берется цена в 6 ячейке? Это важно для выбора обработчика событий.
Цена в 6 ячейке берется из буржуйской проги Омега посредством запроса к онной базе данных.
Цена в 6 ячейке берется из буржуйской проги Омега посредством запроса к онной базе данных.
Ну что ж. Давай проведем первую пробу.
Заходишь в VBA (Alt+F11),
Находишь Окно проекта (Ctrl+R)
В нем находишь лист, на который поступает цена, щелкаешь два раза и в открывшееся окошко копируешь это:
Dim w1 As Worksheet, w2 As Worksheet
Dim i As Long
Set w1 = ThisWorkbook.Worksheets("Лист1") 'Nazvanie lista, na kotory prihodyat dannye
Set w2 = ThisWorkbook.Worksheets("Лист2") 'Nazvanie lista, kuda budem kopirovat'
If Target.Row <> 5 Or Target.Column <> 3 Then Exit Sub 'Zdes' nomer stroki i stolbtsa yacheyki s tsenoy is vneshney programmy
If w1.Range("D5").Value <> 1 Then Exit Sub 'Zdes' adres yacheyki s proverochnoy formuloy
Application.ScreenUpdating = False
i = 1
While w2.Cells(i, 3).Value <> "" 'Zdes' nomer stolbtsa tochno nepustoy yacheyki (naprimer, yacheyki s tsenoy is vneshney programmy)
i = i + 1
Wend
w1.Range("5:5").Copy 'Nomer stroki so vsemi dannymi otkuda kopiruem
w2.Cells(i, 1).PasteSpecial Paste:=xlPasteValues
w2.Cells(i, 1).PasteSpecial Paste:=xlPasteFormats
Application.Calculate
Application.ScreenUpdating = True
End Sub
Дальше вносишь необходимые изменения во всех строках с комментариями (в других ничего не надо менять).
Пробуешь. О замеченных недостатках пишешь сюда.
Ну что ж. Давай проведем первую пробу.
Заходишь в VBA (Alt+F11),
Находишь Окно проекта (Ctrl+R)
В нем находишь лист, на который поступает цена, щелкаешь два раза и в открывшееся окошко копируешь это:
-skip-
Дальше вносишь необходимые изменения во всех строках с комментариями (в других ничего не надо менять).
Пробуешь. О замеченных недостатках пишешь сюда.
Может я чтото не так делаю, но при запуске макроса, появляется табличка Macros, ву которой предлагается создать новый макрос.
Может я чтото не так делаю, но при запуске макроса, появляется табличка Macros, ву которой предлагается создать новый макрос.
Его не надо запускать. Он должен сам запускаться, когда цена будет обновлена твоей Омегой. Попробуй для начала выступить сам в роли Омеги и забить "ручками" туда разные цены (которые удовлетворяют условию и не удовлетворяют). Если результат устраивает, пробуй с Омегой. Надеюсь, будет работать.
Его не надо запускать. Он должен сам запускаться, когда цена будет обновлена твоей Омегой. Попробуй для начала выступить сам в роли Омеги и забить "ручками" туда разные цены (которые удовлетворяют условию и не удовлетворяют). Если результат устраивает, пробуй с Омегой. Надеюсь, будет работать.
Что-то не выходит каменный цветок. Я руками меняю в 6 ячейке цифру. В 7 ячейке появляется 1, так условие "значение в 6 ячейке"<="значение в 5 ячейке". Смотрю в Лист 2 а там пусто.
У меня возникли некоторые вопросы по макросу:
1. While w2.Cells(i, 3).Value <> "" 'Zdes' nomer stolbtsa tochno nepustoy yacheyki (naprimer, yacheyki s tsenoy is vneshney programmy)
i = i + 1
Wend
Я так понимаю: Пока ячейка(i,3) листа w2 не будет пустое, то i = i+1. Суть понял. То есть пока не будет пустой строки, то идем дальше и пишем в ближайшую пустую строчку. Но меня смутили твой комент "naprimer, yacheyki s tsenoy is vneshney programmy". Причем здесь Лист2 и ячейка из Листа1.
2. w1.Range("5:5").Copy - я правильно понял что первая цифра - строка, а вторая - столбец?
3. Хотел посмотреть пошагово как работает скрипт (кажется это называется трассировка?), пищит противный звук и ничего не происходит.
Блин, как же паскаль в этои отношении легок.
Что-то не выходит каменный цветок. Я руками меняю в 6 ячейке цифру. В 7 ячейке появляется 1, так условие "значение в 6 ячейке"<="значение в 5 ячейке". Смотрю в Лист 2 а там пусто.
У меня возникли некоторые вопросы по макросу:
1. While w2.Cells(i, 3).Value <> "" 'Zdes' nomer stolbtsa tochno nepustoy yacheyki (naprimer, yacheyki s tsenoy is vneshney programmy)
i = i + 1
Wend
Я так понимаю: Пока ячейка(i,3) листа w2 не будет пустое, то i = i+1. Суть понял. То есть пока не будет пустой строки, то идем дальше и пишем в ближайшую пустую строчку. Но меня смутили твой комент "naprimer, yacheyki s tsenoy is vneshney programmy". Причем здесь Лист2 и ячейка из Листа1.
Конечно, здесь имеется в виду номер непустого столбца на Листе2. Но поскольку на Лист2 копируются целиковые строчки с Листа1, то номер столбца с непустой ячейкой на Листе1 останется номером столбца с непустой ячейкой на Листе2
2. w1.Range("5:5").Copy - я правильно понял что первая цифра - строка, а вторая - столбец?
Нет. "5:5" - это обозначение пятой строки.
"5:10" - это обозначение диапазона с 5-й строки по 10-ю включительно.
Столбцы в Экселе обозначаются буквами: "A:A"
3. Хотел посмотреть пошагово как работает скрипт (кажется это называется трассировка?), пищит противный звук и ничего не происходит.
Блин, как же паскаль в этои отношении легок.
Тут вопрос привычки. В Паскале ты привык, а в ВБА - еще нет. Ставишь точку останова в процедуре. (например, на первой строчке с Set).
Для этого надо щелкнуть в левое поле редактора напротив этой строчки (она станет коричневой, снимать - щелкнешь еще раз). Потом в экселе сымитируешь изменение цены. Макрос запустится и остановится на твоей строке. F8 - один шаг, F5 - окончательный запуск. Раз уже писал сам программы, хоть и на другом языке, разберешься.
Жду дальнейших отчетов.
:D
Вот код.
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim w1 As Worksheet, w2 As Worksheet
Dim i As Integer
Dim z As Integer
Set w1 = ThisWorkbook.Worksheets("Limits") 'Nazvanie lista, na kotory prihodyat dannye'
Set w2 = ThisWorkbook.Worksheets("k") 'Nazvanie lista, kuda budem kopirovat'
Sheets("Limits").Select
For i = 2 To 101 Step 1
If w1.Cells(RC10) = 1 Then
Range("RC1:RC10").Select
Selection.Copy
z = 1
While w2.Cells(z, 1).Value <> ""
z = z + 1
Wend
Sheets("k").Select
Range("R[z]C1").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=Fals
End If
Next i
End Sub
Что я здесь написал: Выделяем область листа Limits, i - строка. Делаем цикл for. У меня 100 строк, на которые валится инфа от Омеги. В каждой строке по инфе об одной акции. Если значение ячейки i,10 столбца = 1, то копируем i строку от 1 столбца до 10. Затем включем цикл while для листа k, для нахождения последней свободной строки. Как только k="", тогда выбираем этот лист, выделяем ячейку строки z, столбца 1. Вставляем инфу из листа Limits. И так по циклу пока i не достигнет последней строки.
Пока ексель ругается на этот макрос.
Range("R[z]C1").Select - неправильно (причем совсем :D )
В ВБА в Range ссылки должны быть в формате A1, а не в формате R1C1
Во-вторых, я тебе предложил рабочий макрос. Поверь мне. Единственное, в чем я сомневаюсь - так это в том, что он будет запускаться, когда цена в 6-ю ячейку будет вбита не тобой, а Омегой. При ручном изменении цены он ОБЯЗАН работать. Так что давай разбераться, что у тебя не выходит.
Первый вопрос:
Он запускается? (проверяется установкой стопа на первой строчке)
Не должно ничего пищать.
И еще мне непонятно, что там пищит.
Не должно ничего пищать.
Хз. Насчет твоего кода. Может он работает, но у меня он что-то не заработал. Вот к чему я пришел путем модифицирования твоего и прочтения кипы книг по ВБ.
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim w1 As Worksheet, w2 As Worksheet, w3 As Worksheet, w4 As Worksheet
Dim i As Integer
Dim n As Integer
Dim k As Integer
Dim z As Integer
Set w1 = ThisWorkbook.Worksheets("Limits")
Set w2 = ThisWorkbook.Worksheets("Orders")
Set w3 = ThisWorkbook.Worksheets("OmegaOrders")
Set w4 = ThisWorkbook.Worksheets("OmegaPositions")
Application.ScreenUpdating = False
For i = 2 To 101 Step 1
If w1.Cells(i, 8) = "" Then
w2.Cells(i, 16) = 0
End If
If w1.Cells(i, 10) = 1 And w2.Cells(i, 16) = 0 And w1.Cells(i, 8) <> "" Then
w1.Cells(i, 7).Copy
w2.Cells(1, 3).PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
w1.Cells(i, 13).Copy
w2.Cells(1, 8).PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
w1.Cells(i, 14).Copy
w2.Cells(1, 9).PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
w1.Cells(i, 9).Copy
w2.Cells(1, 11).PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
w1.Cells(i, 8).Copy
w2.Cells(1, 10).PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
w2.Cells(1, 1) = w2.Cells(1, 1) + 1
z = 4
While w2.Cells(z, 2).Value <> ""
z = z + 1
Wend
For k = 1 To 14 Step 1
w1.Cells(i, k).Copy
w2.Cells(z, k + 1).PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Next k
w2.Cells(i, 16) = 1
End If
Next i
w3.Cells(1, 1).QueryTable.Refresh BackgroundQuery:=False
w4.Cells(1, 1).QueryTable.Refresh BackgroundQuery:=False
Application.Calculate
Application.ScreenUpdating = True '
End Sub
На данный момент, это неполноценный работающий макрос. От человека требуется только выставить свою стратегию по которой он собирается играть. Так что этот макрос не решает все проблемы трейдеров, а лишь помогает можно сказать в реальном времени оценить рынок и не прозевать момент.
Почему не полноценный - да потому что нужно настроить автоматические построения формочек, почти все операции по заполнению листов построенны с помощью функций - надо перегнать в макрос, и прочая, прочая.
Заниматься этим я буду через месяц, так как ухожу в отпуск. Так что, СПАСИБО тебе,Cutty Sark, за помощь. Надеюсь,что через месяц, мы опять поговорим об этом макросе. Кстати, пришли мне на ящик [email]pantera@e-corp.ru[/email] свои данные как то: ФИО,емейл.
Возвращайся, поотлаживаем.
НО МАКРОС У МЕНЯ РАБОЧИЙ!!! :!!!: :!!!: :!!!:
Ну что ж, в отпуск - так в отпуск.
Возвращайся, поотлаживаем.
НО МАКРОС У МЕНЯ РАБОЧИЙ!!! :!!!: :!!!: :!!!:
Вопрос возник, можно ли привязать к ячейке макрос? То есть, если в ячейке выполняется условие, которое проверяется при помощи функции, можно ли вызвать макрос?
В Екселе 2 листа. На 1 лист поступает инфа. При поступлении инфы происходит сравнение в пятой и шестой ячейках. Если значение в 5 ячейке равняется значению в 6, то в 7 ячейку ставится 1. Если нет, то пустая строка.
Так вот вопрос. Как сделать так чтобы при появлении 1 в 7 ячейке, во второй лист писалась полная строка из первого листа(в 7 ячейке которого соббсно и стоит 1)? Причем не перезаписывала предыдущую строку, а писала дальше.
Приятного отдыха, pantera.
Возможно, данную проблему можно вообще решить без использования (или с минимальным использованием) VBA.
Если речь идет об ограниченном (пусть и большом) количестве строк на первом листе, то в соответствующих ячейках на втором листе можно подготовить нужные функции, которые выведут нужные значения из первого листа.
В том случае, если речь идет о бесконечном (или наперед не известном) количестве строк на листе, то придется использовать VBA как минимум для копирования (добавление/удаление) строк на втором листе.
Так как я сам очень мало знаком с VBA, то я предпочитаю искать (пусть более сложные) пути обхода.
Знатоки Екселля, подскажите как просуммировать данные диапозона подходящие по двум и более критериям, типа "СУММЕСЛИ()"
Наверняка это можно просто сделать при помощи VBA.
Мне проще использовать встроенные возможности Excel - формулы массива (для ввода формулы массива в ячейку нужно нажать Shift+Enter. Сама формула в строке просмотра будет заключена в фигурные скобки).
Если речь идет о более сложных операциях со значениями, например, операции с текстовыми значениями, то может понадобиться использование функций: Индекс, Поискпоз, Смещ.
Удачи!
В Екселе 2 листа. На 1 лист поступает инфа. При поступлении инфы происходит сравнение в пятой и шестой ячейках. Если значение в 5 ячейке равняется значению в 6, то в 7 ячейку ставится 1. Если нет, то пустая строка.
Так вот вопрос. Как сделать так чтобы при появлении 1 в 7 ячейке, во второй лист писалась полная строка из первого листа(в 7 ячейке которого соббсно и стоит 1)? Причем не перезаписывала предыдущую строку, а писала дальше. !
возможно я опоздал, но я обычно делаю так
Private Sub Worksheet_Change(ByVal Target As Range)
Sheets("Лист1").Select
Columns("A:A").Select 'столбец где появляется 1
Selection.AutoFilter
Selection.AutoFilter Field:=1, Criteria1:="1"
Rows("1:101").Select
Selection.Copy
Sheets("Лист2").Select
строка = Application.CountA(Sheets("лист2").Columns(1)) + 1
Cells(строка, 1).Select
ActiveSheet.Paste
Sheets("Лист1").Select
Selection.AutoFilter
End Sub