Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Excel VBA

Автор: kiVAR
Дата сообщения: 28.03.2007 16:13
Пишу следующее:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim i As Integer
For i = 2 To 10
If IsNumeric(Cells(i, 3&).Value) And IsNumeric(Cells(i, 1&).Value) And IsNumeric(Cells(i, 2&).Value) Then
Application.EnableEvents = False
Cells(i, 3&).Formula = "=" & CStr(Cells(i, 3&).Value) & "+" & _
Cells(i, 1&).Address & "-" & Cells(i, 2&).Address
Application.EnableEvents = True
End If
Next i
End Sub
Каждый раз когда начинаю вводит данные в ячейки все значения пересчитываются заново, причём как-то косячно. Как сделать, чтобы в результирующей ячейки(например С2) данные хранились пока не будут изменены ячейки этой строки(А2 и В2). И при изменении добавлялось или отнималось только то значение, которое было введено.(если ввели в В2 то отнимаем от текущего значения В2, а А2 не учитываем )
Автор: SERGE_BLIZNUK
Дата сообщения: 28.03.2007 16:17
Oyger
Цитата:
Так что если есть еще пердложения - как научить shell понимать русский под 98 виндой - буду рад услышать.

а можно ещё раз конкретно привести команды, которые НЕ работают?
Может Вам проще всё таки обойтись БЕЗ русского языка?

Цитата:
Да к тому же, я сторонник такой методики: если пользоваться только тем, что знаешь, то не будешь расти. Постоянно ищи новые пути решения.
И это говорит человек, использующий Win98... может вам хотя бы на Windows2000 перейти?! (это линейка NT - она намного лучше и устойчивей, чем Win 9x)

и вообще, хоть убейте меня, я не понимаю, при чём здесь Excel...



Добавлено:
kiVAR
Цитата:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)

можно в лоб:
If Target.Address = "$B$2" Then
изменилось значение в B2
....
end if
If Target.Address = "$A$2" Then
изменилось значение в A2
....
end if
Автор: Oyger
Дата сообщения: 28.03.2007 16:25
AndVGri
SERGE_BLIZNUK

Цитата:
Может хотя бы Win2k поставить?


Это уже не ко мне, а к службе обеспечения - что поставили, на том и работаю.
Может скоро и XP поставят =)
Автор: Yuk
Дата сообщения: 28.03.2007 20:13
kiVAR
Перенеси строки с Application.EnableEvents ис цикла в самое начало функции и в самый конец.
Добавь в начало
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
с восстановлением в конце.
Автор: FotIG
Дата сообщения: 29.03.2007 09:19
как можно реализовать выборку из результатов футбольного календаря, расположенного на одном листе и распределения на другом листе с определенным набором символов (типа кода) в зависимости от значения результата игры ?
средствами самого EXCEL пытался что-то сделать несколько десятков раз, в конечном итоге создавал путаницу и .....
в литературе подобного найти не смог .... в примерах финансовых выборок и по работе с базами данных аналогий то же не нашлось ....

прикрепил файл Excel с примером двух листов - НО как наладить взаимосвязь из первого листа во второй - может кто сможет помочь?

hxxp://fotig.stsland.ru/football.xls (94 Kb)

буду признателен даже за совет в каком направлении можно реализовать эту задачу ...
Автор: Oyger
Дата сообщения: 29.03.2007 09:41
Как запустить командную строку (то, что называется "выполнить...") в Винде 98? Какой файл за нее отвечает?
Автор: AndVGri
Дата сообщения: 29.03.2007 11:06
FotIG
В принципе, сделал при помощи формул и расширенного фильтра. Подробнее на "Лист3".
Выложил здесь
Автор: SERGE_BLIZNUK
Дата сообщения: 29.03.2007 12:50
Oyger
Цитата:
Как запустить командную строку (то, что называется "выполнить...") в Винде 98? Какой файл за нее отвечает?
ну вообще от темы (в оффтоп) ушли...
command.com
например,
C:\WIN95\command.com /C COPY C:\TP\PAS\file1.exe C:\TT\filecopy.exe
Автор: FotIG
Дата сообщения: 29.03.2007 13:03
AndVGri !!!!!!!!!!!!!!!

СПАси тебя БОг !!!!!!!!!!!

))))))))))

все просто отлично !!!
Автор: filemoto
Дата сообщения: 29.03.2007 15:21
есть книга, в ней выполняется определённый макрос, подсчитывающий опредённые значения, и выводящий результат в определённую ячейку.
кто подскажет, как сохранить её (книгу), чтобы макрос который внутри книги не сохранялся?
Автор: SERGE_BLIZNUK
Дата сообщения: 29.03.2007 15:58
filemoto
Цитата:
как сохранить её (книгу), чтобы макрос который внутри книги не сохранялся?
если макрос уже совсем не нужен - зайти в редактор Visual Basic (Alt-F11) открыть тело макроса и удалить макрос.
Если в дальнейшем он может понадобится - кинуть его в Персональную книгу макросов (но это не выполнимо для тех макросов, которые завязаны на событиях книги...).
Автор: jiurasic84
Дата сообщения: 29.03.2007 16:09
ВОПРОС:
Хочу отследить изменение в какой-либо ячейке в Листе Excel. Почему, если я пишу код:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
If Target = Range("E5") Then
Cells(5, 7).Value = Range("E5").Value
End If
End Sub

то все нормально, но стоит мне добавить отслеживани изменений еще одной ячейки:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
If Target = Range("E5") Then
Cells(5, 7).Value = Range("E5").Value
Cells(5, 8).Value = Range("E5").Value
End If
End Sub

как программа при изменениии ячейки зависает. Почему это происходит и как все-таки отслежить зменение ячейки без зависания?
Автор: SERGE_BLIZNUK
Дата сообщения: 29.03.2007 16:14
jiurasic84
Цитата:
программа при изменениии ячейки зависает

Может процедура сама себя вызывает (когда изменяет ячейку). Попробуйте так:
Application.EnableEvents = False
Cells(5, 7).Value = Range("E5").Value
Cells(5, 8).Value = Range("E5").Value
Application.EnableEvents = True
Автор: jiurasic84
Дата сообщения: 29.03.2007 16:20
SERGE_BLIZNUK


Автор: AndVGri
Дата сообщения: 29.03.2007 16:28
SERGE_BLIZNUK
jiurasic84

Помоему проще так If Target.Address = Range("E5").Address Then
А возникает ситуация потому, что свойство по умолчанию Value
Автор: jiurasic84
Дата сообщения: 29.03.2007 17:12
Обьясните пожалуйста как сделать так чтобы при добавлении сторонних контролов на лист (кнопочек и прочих компонентов НЕ Microsoft) при открытии EXCEL не задавал вопросов по поводу безопасности: мол ActiveX может содержать вирусы и прочее.... Снижение уровни безопасности до минимумма не помогает....все равно спрашивает. а кнопки стандартные - очень некрасивые...
Автор: filemoto
Дата сообщения: 29.03.2007 17:48
SERGE_BLIZNUK

Цитата:
Если в дальнейшем он может понадобится - кинуть его в Персональную книгу макросов (но это не выполнимо для тех макросов, которые завязаны на событиях книги...).


пожалуйста, скажите поподробнее...
суть такая, что редакторша клепает таблицу, пользуется разными макросами, потом этот файл отдаёт юзеру и у узера постоянно траблы с открытием документа в связи с безопасностью. ладно если б юзер один был. а так каждый раз новый...
скажите, как работать с макросами в документе и при этом сохранять документ без какого-либо кода?


Добавлено:
или может както внешне можно выполнять такой макрос:
1. в автофильтре ставит все значегия в (ВСЕ) т.е. показывать всё что есть в столбцах
2. делает активной ячейку "А2"
Автор: AndVGri
Дата сообщения: 29.03.2007 18:05
filemoto
Собери все макросы в отдельную новую книгу. Подключи их к кнопкам новой панели инструментов. Вложи панель в эту книгу и сохрани как надстройку Excel. Потом эту надстройку можно будет подключить у секретарши, а все остальные макросы у неё удалить. Тогда все остальные документы будут без макросов, а функциональность работы не измениться
Автор: kiVAR
Дата сообщения: 29.03.2007 19:55
SERGE_BLIZNUK
Yuk
Следуя вашим советам вот что у меня в итоге получилось:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Dim i As Integer
For i = 2 To 10

If Target.Column = "2" Then
If IsNumeric(Cells(i, 3&).Value) And IsNumeric(Cells(i, 2&).Value) Then

Cells(i, 3&).Formula = "=" & Cells(i, 3&).Value & "-" & Cells(i, 2&).Address

End If
End If

If Target.Column = "1" Then
If IsNumeric(Cells(i, 3&).Value) And IsNumeric(Cells(i, 1&).Value) Then

Cells(i, 3&).Formula = "=" & Cells(i, 3&).Value & "+" & Cells(i, 1&).Address

End If
End If


Next i
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

И всё бы хорошо, но многоуважаемый Excel почемуто пересчитывает значение в С каждый раз когда изменяю данные в любой из строк колонок А или В. мне же надо чтобы он изменял значение в С тогда и только тогда, когда изменены данные в соответствующей строке А или В.
Автор: AndVGri
Дата сообщения: 30.03.2007 03:13
kiVAR
Глубокоуважаемейший, Вы внимательно посмотрели на свой код? При любом вводе в диапазон ячеек столбца А или В (в 2007, например, 1 до 2 миллионов) у Вас будут изменяться формулы в столбце С со 2 строки по 10. Поэтому Вам в коде и указали на блокировки обработки событий и обновления экрана. Проще же всё это написать было так

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim iRow As Long

iRow = Target.Row 'получаем строку ввода и только для неё проводим изменения

If Target.Column = 1& Then
If IsNumeric(Cells(iRow, 1&).Value) And IsNumeric(Cells(iRow, 2&) Then _
Cells(iRow, 3&).Formula = "=" & Cells(iRow, 3&).Value & "-" & Cells(iRow, 2&).Addres
ElseIf Target.Column = 2& Then
If IsNumeric(Cells(iRow, 1&).Value) And IsNumeric(Cells(iRow, 2&) Then _
Cells(iRow, 3&).Formula = "=" & Cells(iRow, 3&).Value & "+" & Cells(iRow, 1&).Address
End If
End Sub

Дополнительно, если необходимо, ввести проверку - находится ли iRow в требуемом диапазоне строк?
И ещё. Вы проверяете на числовые значения ячейки Cells(iRow, 1&) и Cells(iRow, 2&), а почему не проверяете Cells(iRow, 3&)? Далее, может имеет смысл добавить и проверку на формулу в ячейке Cell(iRow, 3&)?
Автор: filemoto
Дата сообщения: 30.03.2007 10:44
AndVGri

Цитата:
Собери все макросы в отдельную новую книгу. Подключи их к кнопкам новой панели инструментов. Вложи панель в эту книгу и сохрани как надстройку Excel. Потом эту надстройку можно будет подключить у секретарши, а все остальные макросы у неё удалить. Тогда все остальные документы будут без макросов, а функциональность работы не измениться


а как это правильно сделать?
я создал новую книгу. закинул туда макрос.
привязал к кнопке на панели.
сохранил как надстройка, получился файл с расширением *.xla, (myMcro.xla)
потом открываю файл, тот к которому нужно применить код макроса, нажимаю кнопку,
и выскакивает ошибка файл Книга1.xls не найден.

Автор: Olive77
Дата сообщения: 30.03.2007 11:01
filemoto
кнопки привязаны к первоначальному файлу.
Надо их по новой переопределить (щелкаем правой кнопкой мышки и просматриваем меню (у меня меню, к сожалению, не русифицировано))
Автор: filemoto
Дата сообщения: 30.03.2007 11:47
Olive77
всё равно не получается,
пишу путь к файлу xla жму свою настраиваемую кнопку, и тогда выскакивает ошибка 400. без каких-либо объяснений. а как дебаг заюзать между двумя файлами незнаю.
напиши хоть на английском как ты это делаешь
Автор: AndVGri
Дата сообщения: 30.03.2007 11:58
filemoto
Перед тем как сохранять в xla. На созданной панели инструментов, щёлкаешь правой клавишей, выбираешь в контекстном меню "Настройка". В диалоге щёлкаешь кнопку "вложить", выбираешь свою панель слева и нажимаешь копировать.
После того как сохранил в xla и закрытия исходной книги (или, если вышел без сохранения). В настройках панели удали вновь созданную панель, чтобы она не вызывалась из файла xls. Надстройка xla добавляется затем: меню Сервис/надстройки в диалоге кнопка "обзор". После подключения xla панелька появиться и будет связана с xla
Автор: Farest
Дата сообщения: 30.03.2007 12:48
Подскажите как создать кнопку в Ехселе
тоесть нужно если нажал на неё то в другом поле он пересчитал значение
Автор: AndVGri
Дата сообщения: 30.03.2007 12:51
Farest
В строке поиска справки Excel так и набери "создать кнопку" и будет счастье
Автор: filemoto
Дата сообщения: 30.03.2007 12:58
AndVGri
SERGE_BLIZNUK
Olive77

Ребята, большое спасибо.
Всё получилось.
Чёрт, столько знаком с екселем, а этого момента никогда незнал.
Автор: Farest
Дата сообщения: 30.03.2007 13:31
AndVGri

Цитата:
В строке поиска справки Excel так и набери "создать кнопку" и будет счастье

Чесно сказать не нашёл
у меня офис 2007
Автор: kiVAR
Дата сообщения: 30.03.2007 14:13

AndVGri

Цитата:
Вам в коде и указали на блокировки обработки событий и обновления экрана

ну так я вроде как их и вставил

Цитата:
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False



Цитата:
Проще же всё это написать было так

написал, блокировки в самое начало поставил.
ну всё равно, ввожу я в другую строку, а он мне все значения пересчитывает
Автор: AndVGri
Дата сообщения: 30.03.2007 14:21
kiVAR

Цитата:
написал, блокировки в самое начало поставил.

Приведите окончательный код, пожалуйста.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Стоит ли переходить с Билдера на Делфи?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.