Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Как правильно написать условие в Excel


Автор: darth 6.10.2006, 15:01
Здравствуйте возник вот такой вопросы  есть (небольшая  грубо говоря БД) ведется о Excele по заполнению путевых листов!!! В ней есть две ячейки “время\прибытие” и “время \убытие”(формат для этих  ячеек ДД.ММ.ГГ ч:мм), и  итоговая куда записывается разность этих двух ячеек  “время\часов”(формат ячейки ч:мм  смысл ячейки сколько времени была занята машина ).Вопрос стал как правильно написать условие ,при котором если машина была занята сутки в рейсе то получается “время\прибытие-“время \убытие то по формуле записывается 0 часов как программно написать чтобы в случае если даты разные и время двух ячеек не совпадает то записала бы время  в ячейку “время\часов” 24:00 ! Также написать второе условие, чтобы учитывался обед водителя 1:30 отнимался от полного рабочего времени тоже, если он ушел рейс в 7:00 утра, а приехал в 17:00 не записала лишне 1:30 !!! 
Для ячеек  “время \убытие” и  “время\прибытие” по умолчание генерируется текущая дата (для удобства пользователей), значит после только изменения  одной из них ручной корректировкой  (наверно при изменении в ячейке   “время\прибытие” ), должно срабатывать выше описанное условие какая именно процедура увидит это изменение и активирует условие!!! 

Автор: Тутанхамец 8.10.2006, 08:53
В программировании под офис мало понимаю, но чтоб не было нуля в разности, то имеет смысл поставить формат ячейки в "ДД.ММ.ГГ ч:мм". Имхо. А насчет обеда - не слишком внятно изложено. 

Автор: darth 8.10.2006, 12:15
Цитата(Тутанхамец @ 8.10.2006,  08:53)
В программировании под офис мало понимаю, но чтоб не было нуля в разности, то имеет смысл поставить формат ячейки в "ДД.ММ.ГГ ч:мм". Имхо. А насчет обеда - не слишком внятно изложено.

Да вот видишь, хотят, чтоб было время, а не дата и время в ячейке время \убытие(ну чтобы не было много информации, а только нужная то есть только одно только время выводилась в эту  ячейку она реально считается разность двух ячеек “время\прибытие” - “время \убытие”).На счет обеда поясняю так как рабочий день 8 часов не надо учитывать обед у нас он 1:30 ну вот и потребовалось написать условие ,которое бы если человек уехал в рейс 8:00 и приехал в 15:00 так получается время работы 7 ,а реально 5:50 ну вот и надо написать условие при котором бы это условии выполнялась то есть программно  отнимала еще 1:30.

Автор: cardinal 8.10.2006, 13:51
Перенесено из VB6.

Автор: RockClimber 8.10.2006, 17:33
Честно говоря, я ничего не понял. Пишешь в ячейку формулу: "Дата прибытия"-"дата убытия"-"время обеда" (или просто 1:30). Ставишь формат, какой нравится.

Автор: Izuver 9.10.2006, 01:08
1. Используй формулу ЕСЛИ(B1-A1>=1;ТЕКСТ(B1-A1;"дд чч:мм");B1-A1)
2. С какого и до какого времени обед?
3. А это вопче не понятно:
"Для ячеек  “время \убытие” и  “время\прибытие” по умолчание генерируется текущая дата (для удобства пользователей), значит после только изменения  одной из них ручной корректировкой  (наверно при изменении в ячейке   “время\прибытие” ), должно срабатывать выше описанное условие какая именно процедура увидит это изменение и активирует условие!!!"
Что значит "генерируется текущая дата" на оба значения "=ТДАТА()"? 

Автор: darth 9.10.2006, 13:08
Да я решил эти вопросы связанные с расчетом если человек ушел в рейс и был дальше чем обед (чтобы посчитала рабочее время не учитывая обеденное время), или был целые сутки в рейсе  обед вот кому если пригодиться :
'Если в рейсе был сутки 24 часа сравниваться даты и выводиться на экран 24:00  в нужном формате 
If DatePart("d", Target.Offset(0, 3).Value) > DatePart("d", Target.Offset(0, 2).Value) Then
Target.Offset(0, 4).Formula = "24:00"
Target.Offset(0, 4).NumberFormat = "[h]:mm"
Else

' считаем рабочий день учитывая обед если он приехал позже 12:00(сравниваем с ячейкой AM100) то отнимаем 1:30  (время берем от ячейки  AS100)
If Hour(Target.Offset(0, 3).Value) > Hour(ActiveSheet.Range("AM100")) Then
Target.Offset(0, 4).Formula = "=" & Target.Offset(0, 3).Address(False, False) & "-" & Target.Offset(0, 2).Address(False, False) & "-" & ActiveSheet.Range("AS100").Address(False, False)
Target.Offset(0, 4).NumberFormat = "[h]:mm"
'
‘ считаем рабочий день после обеда если он приехал позже 13:30(сравниваем с ячейкой
AN100 она равна 13:30)
If Hour(Target.Offset(0, 2).Value) > Hour(ActiveSheet.Range("AN100")) And Hour(Target.Offset(0, 3).Value) > Hour(ActiveSheet.Range("AN100")) Then
Target.Offset(0, 4).Formula = "=" & Target.Offset(0, 3).Address(False, False) & "-" & Target.Offset(0, 2).Address(False, False)
Target.Offset(0, 4).NumberFormat = "[h]:mm"
Else

Вот две вещи которые не решил первое как указать, чтобы программно не сравнивая с написанными( неграмотно может сори), ячейками в которых я указал время (сравниваем с ячейкой AN100 она равна 13:30), а как при видение переменных типа:
 dim LanchTime
LanchTime=#13:30 # 
If Hour(Target.Offset(0, 2).Value) > Hour(LanchTime)  и сравнивать как раз с ней а не писать на 100 ячейке это время, а программа наверно что неправильно пишу не может обработать такое выражение пишет пустое значении в чем то ошибаюсь smile !
И вторая проблема как написать процедуру ,чтобы выше описанные эти условия(где считали рабочие день с учетом обеда и послеобеденное время), срабатывали при изменение в ячейке “время/прибытие” после изменения данных?


Добавлено @ 13:14 
Цитата(Izuver @ 9.10.2006,  01:08)
3. А это вопче не понятно:
"Для ячеек  “время \убытие” и  “время\прибытие” по умолчание генерируется текущая дата (для удобства пользователей), значит после только изменения  одной из них ручной корректировкой  (наверно при изменении в ячейке   “время\прибытие” ), должно срабатывать выше описанное условие какая именно процедура увидит это изменение и активирует условие!!!"
Что значит "генерируется текущая дата" на оба значения "=ТДАТА()"?

Target.Offset(0, 2).Value = Date
Target.Offset(0, 3).Value = Date
Генерирует в эти ячейке текущую дату я пока отключил их чтобы условия не ругались такак сама панимаешь лепит 09.10.2006  0:00:00 и уже сравнивать не с чем условия уже нарушаеться!Поэтому и приходиться сначала вести нужную дату и время !!!Вот из-за этого и стал вопрос написать процедуру котрая как раз работала при изменение одной из ячеек правильнее последней то есть время\прибытие! 

Автор: Cyric 9.10.2006, 19:48
Большую часть написанного не понял.
По поводу 
Цитата
И вторая проблема как написать процедуру ,чтобы выше описанные эти условия(где считали рабочие день с учетом обеда и послеобеденное время), срабатывали при изменение в ячейке “время/прибытие” после изменения данных?


Вам нужно обрабатывать событие изменения ячейки, при возникновении этого события вызывается метод
Код
Private Sub Worksheet_Change(ByVal Target As Range)



В этом методе вы проверяя значения Target.Row и Target.Column можете определить были ли изменения осуществлены в нужной вам ячейке и в этом случае производить необходимые действия.

Автор: darth 10.10.2006, 12:41
Цитата(Cyric @ 9.10.2006,  19:48)
Большую часть написанного не понял.
По поводу 
Цитата
И вторая проблема как написать процедуру ,чтобы выше описанные эти условия(где считали рабочие день с учетом обеда и послеобеденное время), срабатывали при изменение в ячейке “время/прибытие” после изменения данных?


Вам нужно обрабатывать событие изменения ячейки, при возникновении этого события вызывается метод
Код
Private Sub Worksheet_Change(ByVal Target As Range)



В этом методе вы проверяя значения Target.Row и Target.Column можете определить были ли изменения осуществлены в нужной вам ячейке и в этом случае производить необходимые действия.

Спасибо точно этот метод   Private Sub Worksheet_Change(ByVal Target As Range) все
получилось!
Я только не смог избавиться от записей в ячейке на листе (та как ниже код правильно программой не воспрнимаеться пришлось создать в пустом  дальней ячейке на листе я выбрал AM100 написал значение 13:30 и присвоил формат Ч:мм  , на не ее я сылаюсь и сравниваю  время по условию у меня это записано так 
 If Hour(Target.Offset(0, 3).Value) > Hour(ActiveSheet.Range("AM100")) Then
   А  вот как записать это значения времени не присваивая ее ячейке на листе,а   присвоить ее переменой  и сравнить програмно я думал ,что так задам значения 
dim  timelunch
timelunch=#13:30#  но косяки иду самого начала обрабатывет эту строку как timelunch=#1:30 pm#  
If Hour(Target.Offset(0, 3).Value) > Hour(timelunch) Then тут пишет что переменная timelunch пустая ,но она ведь не пустая там задано время?!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)