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

» Excel VBA

Автор: Troitsky
Дата сообщения: 08.11.2006 16:50
razhev

Цитата:
Дело в том что у меня в єтой ячейке автосумма
и мне надо проверять, если пересчиталась ячейка то делать проверку и
просить ввести коментарии.

Если правильно понял задачу, то можно попробовать выкрутиться следующим образом. Присвоить переменной текущее значение контролируемой ячейки и при пересчете листа проверять не изменилось ли значение этой ячейки (сравниваем с переменной). В случае если изменилось, просим ввести коментарий и присваиваем переменной новое значение.
Код примерно такой:
Код: Dim mSum As Double

Private Sub Worksheet_Activate()
mSum = Worksheets(1).Cells(3, 3).Value
End Sub

Private Sub Worksheet_Calculate()
If Worksheets(1).Cells(3, 3).Value <> mSum Then
MsgBox "просим ввести коментарии"
mSum = Worksheets(1).Cells(3, 3).Value
End If
End Sub
Автор: SERGE_BLIZNUK
Дата сообщения: 08.11.2006 19:03
Troitsky
Цитата:
В случае если изменилось, просим ввести коментарий и присваиваем переменной новое значение.
Красивое решение! А ещё можно вместо переменной использовать ячейку в таблице (можно в скрытом стобце или цвет букв = белый) сравнивать с автосуммой...
Но с переменной, разумеется, красивее!
Автор: alin
Дата сообщения: 08.11.2006 19:15
Планировщик WinXP открывает в определенное время книгу, выполняется макрос – заносятся данные, книга закрывается.
Возможно ли открытие книги в фоновом режиме или в каком-либо другом, чтобы не мешало работать?
Автор: Ilyansk
Дата сообщения: 09.11.2006 05:24
alin,
может быть в ВАТ или CMD попробовать start /minimize <книга.xls>? Ну и в auto_open навтыкать что-нить вроде Application.ScreenUpdating = False

А кто-нить может скажет почему "Поиск-Замена" вызванная вручную и она же, вызванная из макроса, дают разные результаты?
Автор: kramrus
Дата сообщения: 09.11.2006 10:34
SERGE_BLIZNUK
Может не правильно понял, может объяснил, но не работает.
Привожу пример из своей книги.....
Чтобы не терять изменения в начале месяца берем таблицу прошлого месяца, копирум, переименовуем. В ячейке AT8=ноябрь, в ячейкеСА8="D:\["&AT8-1&".xls]лист20!"=D:\[Октябрь]лист20.
в ячейке CA19 пишем такую формулу =ИНДЕКС('D:\[Октябрь.xls]лист20'!$F$19:$BY$418;ПОИСКПОЗ(F19;'D:\[Октябрь 2006.xls]лист20'!$F$19:$F$418;0)+2;57) (берем значение из ячейки F19 ищем в книге Октябрь такое же, спускаемся на 2 строки вниз и берм значение из 57 столба.)
Все работает. Но! В запарке забываю переписать ручками название книги. Можно что то сделать что бы при изменени А8 или СА8 в ячеке СА 19 автоматически менялось название книги?????
И еще формула в СА19 копирутся через три строки в этом столбике 56 раз.
Автор: razhev
Дата сообщения: 09.11.2006 10:47
Troitsky

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

но геморно
Автор: xmm2005
Дата сообщения: 09.11.2006 13:34
Подскажите как в поле формы VBA в Екселе поставить шаблон на ввод определенного типа число/дата например такое вообще реально ???
Автор: SERGE_BLIZNUK
Дата сообщения: 10.11.2006 00:32
kramrus

Цитата:
Можно что то сделать что бы при изменени А8 или СА8 в ячеке СА 19 автоматически менялось название книги?????

можно. Тут главная проблема - но, решаемая ;-))) -
на какое событие можно повесить контроль. на Workbook.Change - самое надёжное, но самое малоэффективное (на любое изменение любой ячейки мы будем выполнять свой код.) Конечно, там видно, какую ячейку поменяли, но это не прибавит быстродействия - хотя, если устроит скорость - это самый подходящий вариант.
Можно повеситься на Workbook.Open (при открытии книги будут проверяться все формулы и они будут автоматически корректироваться.
Ещё - оригинал формулы C19 для алгоритма корректировки очень желательно сохранить в виде шаблона где-нибудь в невидимой ячейки например, в виде следующего текста:
Код: ИНДЕКС('D:\[$$$]лист20'!$F$19:$BY$418;ПОИСКПОЗ(F34;'D:\[$$$]лист20'!$F$19:$F$418;0)+2;57)
Автор: reiki
Дата сообщения: 10.11.2006 01:00
Кто знает как открыть запороленный VBAProject?
Автор: SERGE_BLIZNUK
Дата сообщения: 10.11.2006 01:02
kramrus
Цитата:
Можно что то сделать что бы при изменени А8 или СА8 в ячеке СА 19 автоматически менялось название книги?????
[more=вот пример автоматической коррекции формулы в С19]
пусть месяц в ячейке A1, а шаблон ссылки в G1
тогда можно в C19 получить ссылку так :
Код:
Sub MonthLinkCorrective()
sMonth = UCase(Range("A1").Value)

Select Case sMonth
Case "СЕНТЯБРЬ"
NewName = "[Август.xls]"
Case "ОКТЯБРЬ"
NewName = "[Сентябрь.xls]"
Case "НОЯБРЬ"
NewName = "[Октябрь.xls]"
Case Else
Exit Sub
End Select

sFormula = Range("G1").Value2
sFormula = "=" & Replace(sFormula, "[$$$]", NewName, 1, 2)
Range("C19").Formula = sFormula
Автор: Troitsky
Дата сообщения: 10.11.2006 08:41
razhev

Цитата:
У меня біла такая идея, но она улитучелась в связи с большим количеством проверяеміх ячеек.

А легкого выхода быть и не может. Ну допустим тебе удалось
Цитата:
получить адрес ячейки которая пересчиталась
и теперь тебе нужно
Цитата:
делать проверку и просить ввести коментарии
Как ты хочешь указать excel'ю с чем производить сравнение? А как укажешь ему все те ячейки, возможные изменения в которых тебя интересуют? Если таких ячеек много и расположены они на листе неупорядоченно, то в любом случае получится
Цитата:
геморно

Выход - действовать описанным выше способом. Только вместо одной объявить массив переменных и адресов ячеек, нуждающихся в контроле (а то и пользовательский тип ввести - кстати, с ним ни разу в VBA работать не приходилось - возможно ли?). Далее - перебирая все ячейки, соответствующие адресам из массива, проверять их значения.
Автор: kramrus
Дата сообщения: 10.11.2006 11:42
SERGE_BLIZNUK
Спасбо за подсказки!!!!
Вобщето правильно Октябрь 2006.xls, для простоты понимани янисал без 2006.
строка - фамилия, под ней дополнительно 3 пустых, в них заносятся комментарии.
Всего 56 человек поэтому повтор 56 раз. При этом нужно получить: "месяц-1" "строка-2", а "месяц-2" "строка-3". Дома работает и так, поэтому я привел пример расчета "строка-1".
Качну по ссылке то что есть а вечером или завтра опишу результат.
Автор: PavelO
Дата сообщения: 11.11.2006 14:47
Здраствуйте уважаемые знатоки VBA.
Вопрос такого хар-ра:
Как при нажатии на CommandButton имитировать двойное нажатие на год в объекте calendar (одним нажатием открывает список, вторым закрывает)? цель: оставить фокус в списке с годом
Увидел такие решения:
1. Программно переместить курсор в те координаты, в которых нах-ся год и имитировать doubleclick или click 2 раза. (искал в нете, не нашел ничего).
2. Поместить фокус на год объекта calendar (получается только на сам объект, а на год не выходит ничего)
Подскажите пожалуйста как можно это сделать?
Автор: tserna
Дата сообщения: 11.11.2006 19:33
Кто можеть помочь написать небольшую программку?

Необходимо ежедневно записывать определенное количество номеров, и Excel автоматом подсчитывал общее количество символов, количество каждого символа (0-9), чтобы это можно было распечатывать по дням и затем делать анализ за определенный промежуток времени (с использованием диаграм).

Очень был бы признателен за оказанную помощь. С меня на работе требуют, а как самому сделать мозги не доходят.

Заранее огромное спасибо.
Автор: RUSKIE
Дата сообщения: 12.11.2006 13:19
Привет всем!!!
Я в VBA новичок и поэтому очень бы был благодарен кто мне бы помог с этой задачкой.
Суть вот в чем:
клиенты приходят в магазин согласно экспоненц. распределению дальше в зависимости от того сколько у них items в корзине считается их shopping time и дальше они направляются к кассам (checkout arrival time). Только кто первый пришел тот первый и обслуживается поэтому может получиться что кто первый зашел в магазин может подойти к кассе а там уже клиент 2 обслуживается например и т.д.
Мне же нужно с помощью массивов(вот где у меня засада - я в них не шарю) записать каждый раз если клиент ждет больше 3 минут у кассы до того как его обслужат.
И в конце надо сказать какова вероятность того что клиент будет ждать больше 3 минут (все кто ждали больше трех минут / общее число клиентов).
Требуется сделать 1000 раз по часу симуляции. Т.е. там есть эта RS и если она больше 3600 (60 сек * 60 мин) то остановить цикл и запустить по новому и так 1000 раз.

Вот какой год я сам сотворил но он далек от окончания. У меня рамс с массивами а также там надо как то отсеивать кто пришел к кассе первым и т.д.
ПОМОГИТЕ плииизз!!!


Option Base 1
Sub ProblemA()
Dim AT, NI, ST, CT, SFT, IT, WT, RS As Integer
'AT - customer arrival time
'NI - number of items in the basket
'ST - shopping time
'CT - checkout time
'SFT - server free time
'IT - idle time
'WT - wait time
'RS - running sum of total time
Dim WaitTime0(100), WaitTime1(100), WaitTime3(100) As Variant
Dim ArrivalTime(1 To 40), ShoppingTime(1 To 40), CAT(1 To 40) As Variant
Dim CheckoutTime(1 To 40), TBA(1 To 40) As Variant
'WaitTime0 - array where noone waited before checking out
'WaitTime1 - array where people had to wait less than 3 minute to be checked out
'WaitTime3 - array where people had to wait more than 3 minute to be checked out
'CAT - array with checkout arrival time
'TBA - time between arrivals

AT = 0
SFT = 0
RS = 0
L = 10000 'just some number which is bigger than 3600
Randomize

i = 1
While RS < 3600 'running sum of total time 60sec*60min = 1 hour

'Arrival Time
mean = 120 'mean of 120 seconds
TBA(i) = Application.WorksheetFunction.roundup(invexp(mean), 0)
ArrivalTime(i) = ArrivalTime(i) + TBA(i)

'Number of Items in the basket
ri = Rnd()
NI = NumberOfItems(ri)

'Shopping Time
ST = Application.WorksheetFunction.roundup(Application.WorksheetFunction.norminv(Rnd(), 20 * NI / 5, 0.2 * 20), 0)
ShoppingTime(i) = ST

'Checkout Arrival Time
CAT(i) = ArrivalTime(i) + ShoppingTime(i)

'Checker Availability and Checkout Time
CT = 15 * NI / 5 'Checkout time calculation
If SFT < CAT(i) Then 'If server free time is less than checkout arrival time
WaitTime0(i) = WaitTime0(i) + 1 'then there is an idle time for a checker and no wait time
IT = CAT(i) - SFT 'Idle Time calculation
SFT = CAT(i) + CT 'New SFT is the sum of CAT and checkout time
Else
WT = SFT - CAT(i) 'ortherwise there is a wait time
If WT > 180 Then
WaitTime3(i) = WaitTime3(i) + 1
Else
WaitTime1(i) = WaitTime1(i) + 1
End If
SFT = SFT + CT 'New SFT
End If
CheckoutTime(i) = CT

x = ArrivalTime(i) + ShoppingTime(i) + CheckoutTime(i)
RS = RS + x

i = i + 1

Wend

If WaitTime3 > 0 Then
MsgBox WaitTime3 & " People Waited Over 3 Minutes"
Else
MsgBox "No One Waited Over 3 Minutes"
End If

End Sub

Function NumberOfItems(ri)
Select Case ri
Case 0 To 0.05
NumberOfItems = 5
Case 0.05 To 0.15
NumberOfItems = 10
Case 0.15 To 0.35
NumberOfItems = 15
Case 0.35 To 0.55
NumberOfItems = 20
Case 0.55 To 0.8
NumberOfItems = 25
Case 0.8 To 0.9
NumberOfItems = 30
Case 0.9 To 0.95
NumberOfItems = 35
Case 0.95 To 0.97
NumberOfItems = 40
Case 0.97 To 0.99
NumberOfItems = 45
Case 0.99 To 1
NumberOfItems = 50
End Select

End Function

' Inverse of the exponential distribution function
Public Function invexp(mean)
invexp = -mean * Log(1 - Rnd)
End Function
Автор: ylipsh
Дата сообщения: 13.11.2006 14:17
А может кто-нибудь подсказать, где можно найти описания формата вызова функций MySQL из VBA? С SELECT кое-как разобрался, а вот с INSERT что-то никак. Получить информацию из базы могу, а вот загнать ее туда не получается. Требуется что-то такое, где описаны методы Execute (это минимум необходимый прямо сейчас). Но лучше, конечно, полное описание. MySQL. Описание языка - имеется. Но там ничегошеньки о способах вызова из VBA. Может, кто подскажет где посмотреть? Заранее благодарен.

Добавлено:
А может кто-нибудь подсказать, где можно найти описания формата вызова функций MySQL из VBA? С SELECT кое-как разобрался, а вот с INSERT что-то никак. Получить информацию из базы могу, а вот загнать ее туда не получается. Требуется что-то такое, где описаны методы Execute (это минимум необходимый прямо сейчас). Но лучше, конечно, полное описание. MySQL. Описание языка - имеется. Но там ничегошеньки о способах вызова из VBA. Может, кто подскажет где посмотреть? Заранее благодарен.
Автор: jONES1979
Дата сообщения: 14.11.2006 15:34
ylipsh

Пользуй ADO. Там будет без разницы "с какой базой работаешь"
Автор: ivcnod3
Дата сообщения: 15.11.2006 13:50
Привет ALL.
Помогите решить следующую проблему:
при программном копировании данных (текст) в объединенные ячейки Excel иногда возникают ситуации, когда данные не помещаются в ячейку. Как в Excele отследить данную ситуацию? AutoFit объедененной ячейки не помогает. Можно ли как нибудь тогда хоть цветом выделять такую ячйку?
Автор: NPC
Дата сообщения: 15.11.2006 14:02
нужно доработать макрос:
ActiveCell.FormulaR1C1 = _
"=ДЕС.В.ШЕСТН('[Базовые Станции МегаФон-Москва.xls]База'!R37C1,4)"
Range("B1").Select
ActiveCell.FormulaR1C1 = _
"=ДЕС.В.ШЕСТН('[Базовые Станции МегаФон-Москва.xls]База'!R37C2)"
Range("C1").Select
ActiveCell.FormulaR1C1 = "25002"
Range("A2").Select
в одном файле в столбце А и В пытался преобразовать числа в шеснатеричный формат в другой файл
потом в том файле куда преобразовал с первого объеденить 2 колонки, и дописать 25002
и так далее в каждой строчке.
Автор: kramrus
Дата сообщения: 16.11.2006 13:57
Всем привет! Спасибо за советы, но неработает!
Понял что такое макрос, и решил перебрать то что Вы мне прислали.
Есть проблема, помогите решить:
В EXEL пишем формулу =ИНДЕКС('D:\Ljuda\[Октябрь 2006.xls]DC №37'!$F$19:$BY$418;ПОИСКПОЗ(A19;'D:\Ljuda\[Октябрь 2006.xls]DC №37'!$F$19:$F$418;0)+2;71)
РАБОТАЕТ.
Пишу макрос

Sub Макрос303()
Range("C19").Formula = "=ИНДЕКС('D:\Ljuda\[Октябрь 2006.xls]DC №37'!$F$19:$BY$418;ПОИСКПОЗ(A19;'D:\Ljuda\[Октябрь 2006.xls]DC №37'!$F$19:$F$418;0)+2;71)"
End Sub

НЕ РАБОТАЕТ.
Почему????

И еще. В ячейке А1 пишу ='D:\Ljuda\[C1]DC №37'!F19, где С1 ячейка в которой название книги. При расчете формулы EXEL задает вопрос: где книга С1. Как избавиться от этого вопроса, что бы EXEL сам искал книгу.
Автор: Yuk
Дата сообщения: 16.11.2006 14:36
kramrus
Вместо одинарной кавычки (') подставь Chr(39).
"..." & Chr(39) & "..."
Автор: The okk
Дата сообщения: 16.11.2006 14:42
По первому вопросу: попробуй то же самое, только вместо Formula пиши FormulaR1C1
Автор: kramrus
Дата сообщения: 16.11.2006 15:16
Yuk
Не понял где (') 1 или 2 вопрос?
The okk
причем здесь R1C1, если мне надо в С19
Автор: Yuk
Дата сообщения: 16.11.2006 15:45
kramrus
1-й
Автор: kramrus
Дата сообщения: 16.11.2006 15:57
Yuk
А что это даст? только в двух словах (есть exel, а макросы тулько учу)
Автор: Yuk
Дата сообщения: 16.11.2006 17:15
kramrus

Цитата:
А что это даст?

Скажем так, выручало не раз. Не любит вроде эксель кавычки в строках.
Автор: Troitsky
Дата сообщения: 16.11.2006 21:21
kramrus

Цитата:
В EXEL пишем формулу =ИНДЕКС('D:\Ljuda\[Октябрь 2006.xls]DC №37'!$F$19:$BY$418;ПОИСКПОЗ(A19;'D:\Ljuda\[Октябрь 2006.xls]DC №37'!$F$19:$F$418;0)+2;71)
РАБОТАЕТ.
Пишу макрос

Sub Макрос303()
Range("C19").Formula = "=ИНДЕКС('D:\Ljuda\[Октябрь 2006.xls]DC №37'!$F$19:$BY$418;ПОИСКПОЗ(A19;'D:\Ljuda\[Октябрь 2006.xls]DC №37'!$F$19:$F$418;0)+2;71)"
End Sub

НЕ РАБОТАЕТ.
Почему????

Попробуй заменить русские наименования функций на их английские аналоги. (список соответствия)


Добавлено:
Yuk
Цитата:
Вместо одинарной кавычки (') подставь Chr(39)
kramrus
Цитата:
А что это даст? только в двух словах
Суть в том, что одинарная кавычка - служебный символ VB, символ начала комментария. В доках везде написано, что сразу после такого символа начинается комментарий, однако если этот символ заключен в кавычки, то, по всей вероятности , он уже началом комментария не считается (проверка это подтверждает).
Автор: SERGE_BLIZNUK
Дата сообщения: 17.11.2006 04:09
kramrus
Цитата:

Цитата: только вместо Formula пиши FormulaR1C1

причем здесь R1C1, если мне надо в С19
Автор: omikron
Дата сообщения: 17.11.2006 06:39
Подскажите пожалуйста,
проблема такая:
пытаюсь открыть книгу которая точно есть
Set myBook = Workbooks.Open(Filename:="С:\test.xls")

выдает ошибку:
1004
Не удалось найти 'M:\test.xls'. Проверьте задание имени и местоположение файла.
Автор: The okk
Дата сообщения: 17.11.2006 07:32

Цитата:
Set myBook = Workbooks.Open(Filename:="С:\test.xls")

Workbooks.Open "С:\test" - вот таким макаром можно открыть файл.
Почему он у тебя к диску М обращается - этого не знаю.
Ну а если уж надо Set использовать (зачем?), то Set mybook = Workbooks.Open(Filename:="C:\test").

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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