Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос по Excel

3.8K
21 июля 2003 года
pantera
10 / / 21.07.2003
В Екселе 2 листа. На 1 лист поступает инфа. При поступлении инфы происходит сравнение в пятой и шестой ячейках. Если значение в 5 ячейке равняется значению в 6, то в 7 ячейку ставится 1. Если нет, то пустая строка.
Так вот вопрос. Как сделать так чтобы при появлении 1 в 7 ячейке, во второй лист писалась полная строка из первого листа(в 7 ячейке которого соббсно и стоит 1)? Причем не перезаписывала предыдущую строку, а писала дальше.
267
21 июля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by pantera
В Екселе 2 листа. На 1 лист поступает инфа. При поступлении инфы происходит сравнение в пятой и шестой ячейках. Если значение в 5 ячейке равняется значению в 6, то в 7 ячейку ставится 1. Если нет, то пустая строка.
Так вот вопрос. Как сделать так чтобы при появлении 1 в 7 ячейке, во второй лист писалась полная строка из первого листа(в 7 ячейке которого соббсно и стоит 1)? Причем не перезаписывала предыдущую строку, а писала дальше.



Это тебе надо обработчик событий сделать.
В твоем случае подойдет
Worksheets_Change

Если тебе надобно, я тебе объясню все поподробнее, ты только сообщи, насколько ты владеешь Экселем (типа, на каком уровне объяснять) и поподробней задание.

Такие вопросы возникают сразу:
1. Откуда берется инфа в 5-й и 6-й ячейках?
(ее юзер вносит или программа какая?)

2. Давай приведем твой лексикон к принятому экселевскому. У тебя на Листе 1 есть куча строк, и в 5-6-м столбцах какой-либо из строк появляются изменения? А потом ты хочешь, чтобы вся строка с изменением попадала на Лист 2 в конец имеющегося там списка? Так все?

3.8K
21 июля 2003 года
pantera
10 / / 21.07.2003
Цитата:
Originally posted by Cutty Sark


Если тебе надобно, я тебе объясню все поподробнее, ты только сообщи, насколько ты владеешь Экселем (типа, на каком уровне объяснять) и поподробней задание.

Такие вопросы возникают сразу:
1. Откуда берется инфа в 5-й и 6-й ячейках?
(ее юзер вносит или программа какая?)

2. Давай приведем твой лексикон к принятому экселевскому. У тебя на Листе 1 есть куча строк, и в 5-6-м столбцах какой-либо из строк появляются изменения? А потом ты хочешь, чтобы вся строка с изменением попадала на Лист 2 в конец имеющегося там списка? Так все?



Кхм, насколько я владею Экселем. Скорее, надо спрашивать насколько я владею VB. Экселем я владею на среднем уровне. А вот ВБ - я только начал изучать.
В 5 ячейке забито определенное число - стоимость 1 акции за которую я хочу купить. В 6 ячейку поступает цена акции на данный момент(поступает с периодичностью 1 минута).
Как только число из 6 ячейки достигнет числа из 5 ячейки, то акция будет куплена.
А чтобы проконтролировать сделку, я добавил в 7 ячейку. Как только в 7 ячейке появляется 1, это означает что сделка возможна и будет совершенна, а данные по этой акции(они расположены вдоль одной строки) будут переписаны на 2 Лист.
Я просто хочу облегчить труд трейдеров написав на Экселе такой опус.

267
21 июля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Ага, понятно. Остался еще один важный вопрос: откуда берется цена в 6 ячейке? Это важно для выбора обработчика событий.
3.8K
22 июля 2003 года
pantera
10 / / 21.07.2003
Цитата:
Originally posted by Cutty Sark
Ага, понятно. Остался еще один важный вопрос: откуда берется цена в 6 ячейке? Это важно для выбора обработчика событий.


Цена в 6 ячейке берется из буржуйской проги Омега посредством запроса к онной базе данных.

267
22 июля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by pantera

Цена в 6 ячейке берется из буржуйской проги Омега посредством запроса к онной базе данных.



Ну что ж. Давай проведем первую пробу.
Заходишь в VBA (Alt+F11),
Находишь Окно проекта (Ctrl+R)
В нем находишь лист, на который поступает цена, щелкаешь два раза и в открывшееся окошко копируешь это:

Код:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
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


Дальше вносишь необходимые изменения во всех строках с комментариями (в других ничего не надо менять).
Пробуешь. О замеченных недостатках пишешь сюда.
3.8K
22 июля 2003 года
pantera
10 / / 21.07.2003
Цитата:
Originally posted by Cutty Sark


Ну что ж. Давай проведем первую пробу.
Заходишь в VBA (Alt+F11),
Находишь Окно проекта (Ctrl+R)
В нем находишь лист, на который поступает цена, щелкаешь два раза и в открывшееся окошко копируешь это:
-skip-
Дальше вносишь необходимые изменения во всех строках с комментариями (в других ничего не надо менять).
Пробуешь. О замеченных недостатках пишешь сюда.


Может я чтото не так делаю, но при запуске макроса, появляется табличка Macros, ву которой предлагается создать новый макрос.

267
22 июля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by pantera

Может я чтото не так делаю, но при запуске макроса, появляется табличка Macros, ву которой предлагается создать новый макрос.



Его не надо запускать. Он должен сам запускаться, когда цена будет обновлена твоей Омегой. Попробуй для начала выступить сам в роли Омеги и забить "ручками" туда разные цены (которые удовлетворяют условию и не удовлетворяют). Если результат устраивает, пробуй с Омегой. Надеюсь, будет работать.

3.8K
22 июля 2003 года
pantera
10 / / 21.07.2003
Цитата:
Originally posted by Cutty Sark


Его не надо запускать. Он должен сам запускаться, когда цена будет обновлена твоей Омегой. Попробуй для начала выступить сам в роли Омеги и забить "ручками" туда разные цены (которые удовлетворяют условию и не удовлетворяют). Если результат устраивает, пробуй с Омегой. Надеюсь, будет работать.


Что-то не выходит каменный цветок. Я руками меняю в 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. Хотел посмотреть пошагово как работает скрипт (кажется это называется трассировка?), пищит противный звук и ничего не происходит.
Блин, как же паскаль в этои отношении легок.

267
22 июля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by pantera

Что-то не выходит каменный цветок. Я руками меняю в 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

3.8K
22 июля 2003 года
pantera
10 / / 21.07.2003
У меня твой макрос так и не заработал, поэтому я решил его немного модифицировать. Кстати, дебуг всеравно не пашет. Коричневая строка появляется, но дальше не идет, а противно пищет спикер.
Вот код.
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 не достигнет последней строки.
Пока ексель ругается на этот макрос.
267
23 июля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Во-первых, в твоем макросе ошибка:
Range("R[z]C1").Select - неправильно (причем совсем :D )
В ВБА в Range ссылки должны быть в формате A1, а не в формате R1C1

Во-вторых, я тебе предложил рабочий макрос. Поверь мне. Единственное, в чем я сомневаюсь - так это в том, что он будет запускаться, когда цена в 6-ю ячейку будет вбита не тобой, а Омегой. При ручном изменении цены он ОБЯЗАН работать. Так что давай разбераться, что у тебя не выходит.

Первый вопрос:
Он запускается? (проверяется установкой стопа на первой строчке)
267
23 июля 2003 года
Cutty Sark
1.2K / / 17.10.2002
И еще мне непонятно, что там пищит.
Не должно ничего пищать.
3.8K
23 июля 2003 года
pantera
10 / / 21.07.2003
Цитата:
Originally posted by Cutty Sark
И еще мне непонятно, что там пищит.
Не должно ничего пищать.


Хз. Насчет твоего кода. Может он работает, но у меня он что-то не заработал. Вот к чему я пришел путем модифицирования твоего и прочтения кипы книг по ВБ.

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] свои данные как то: ФИО,емейл.

267
23 июля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Ну что ж, в отпуск - так в отпуск.
Возвращайся, поотлаживаем.
НО МАКРОС У МЕНЯ РАБОЧИЙ!!! :!!!: :!!!: :!!!:
3.8K
24 июля 2003 года
pantera
10 / / 21.07.2003
Цитата:
Originally posted by Cutty Sark
Ну что ж, в отпуск - так в отпуск.
Возвращайся, поотлаживаем.
НО МАКРОС У МЕНЯ РАБОЧИЙ!!! :!!!: :!!!: :!!!:


Вопрос возник, можно ли привязать к ячейке макрос? То есть, если в ячейке выполняется условие, которое проверяется при помощи функции, можно ли вызвать макрос?

258
24 июля 2003 года
SergeySV
1.5K / / 19.03.2003
Почитай здесь, по сути то что тебе нужно http://forum.codenet.ru/showthread.php?s=&threadid=11646
1.3K
04 августа 2003 года
IKor
116 / / 04.12.2002
Цитата:
Originally posted by pantera
В Екселе 2 листа. На 1 лист поступает инфа. При поступлении инфы происходит сравнение в пятой и шестой ячейках. Если значение в 5 ячейке равняется значению в 6, то в 7 ячейку ставится 1. Если нет, то пустая строка.
Так вот вопрос. Как сделать так чтобы при появлении 1 в 7 ячейке, во второй лист писалась полная строка из первого листа(в 7 ячейке которого соббсно и стоит 1)? Причем не перезаписывала предыдущую строку, а писала дальше.



Приятного отдыха, pantera.

Возможно, данную проблему можно вообще решить без использования (или с минимальным использованием) VBA.
Если речь идет об ограниченном (пусть и большом) количестве строк на первом листе, то в соответствующих ячейках на втором листе можно подготовить нужные функции, которые выведут нужные значения из первого листа.
В том случае, если речь идет о бесконечном (или наперед не известном) количестве строк на листе, то придется использовать VBA как минимум для копирования (добавление/удаление) строк на втором листе.
Так как я сам очень мало знаком с VBA, то я предпочитаю искать (пусть более сложные) пути обхода.

4.6K
10 августа 2003 года
555
9 / / 10.08.2003
Знатоки Екселля, подскажите как просуммировать данные диапозона подходящие по двум и более критериям, типа "СУММЕСЛИ()"
1.3K
11 августа 2003 года
IKor
116 / / 04.12.2002
Цитата:
Originally posted by 555
Знатоки Екселля, подскажите как просуммировать данные диапозона подходящие по двум и более критериям, типа "СУММЕСЛИ()"



Наверняка это можно просто сделать при помощи VBA.
Мне проще использовать встроенные возможности Excel - формулы массива (для ввода формулы массива в ячейку нужно нажать Shift+Enter. Сама формула в строке просмотра будет заключена в фигурные скобки).
Если речь идет о более сложных операциях со значениями, например, операции с текстовыми значениями, то может понадобиться использование функций: Индекс, Поискпоз, Смещ.
Удачи!

1.2K
11 августа 2003 года
Штурман
147 / / 01.08.2003
Цитата:
Originally posted by IKor


В Екселе 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

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог