powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Кол-во дней между датами в двух ячейках, в месяцах и днях
24 сообщений из 24, страница 1 из 1
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33275602
Suleyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть две даты, например 12-Янв-2005 и 25-Июн-2005.
Подскажите можно ли составить формулу, чтобы в первой ячейке показывало сколько месяцев,
а во второй сколько дней между этими датами включая начальную и конечную дату.

Пример: А1=12-Янв-2005
А2=25-Июн-2005 Всего дней между ними 193

Должно быть: В1=6 (означает месяцев)
В2=13 (означает дней)
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33275663
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateDiff("m",A1,A2)
DateDiff("d",A1,A2)
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33276180
Suleyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знаю почему, но эта формула почему то не работает, ее нет даже в списке функций, выдает сообщение, что формула содержит ошибку???
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33276233
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с днями все просто
в а3 пишешь =a1-a2 и формат ячейки - числовой
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33276368
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SuleymanНе знаю почему, но эта формула почему то не работает, ее нет даже в списке функций, выдает сообщение, что формула содержит ошибку???
И в бэйсике, и в VBA эта функция нормально работает. См. примеры в MSDN.
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33276842
Вообще-то между 12-Янв-2005 и 25-Июн-2005 163 дня. На месяц ошибся.

Лови процедуру.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Sub MonthsAndDays( _
  FirstDate As Range, _
  LastDate As Range)

    Dim intMonth As Integer
    Dim intDays As Integer
      
    If Day(FirstDate) <= Day(LastDate) Then
        intMonth = DateDiff("m", FirstDate, LastDate, vbMonday)
    Else
        intMonth = DateDiff("m", FirstDate, LastDate, vbMonday) -  1 
    End If
    
    If Day(FirstDate) = Day(LastDate) Then
        intDays =  0 
    Else
        intDays = DateDiff("d", DateAdd("m", intMonth, FirstDate), _
          LastDate)
    End If
    
    Range("B1").Value = intMonth
    Range("B2").Value = intDays
End Sub

Запускаешь так.

Код: plaintext
MonthsAndDays Range("A1"), Range("A2")
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33277642
Suleyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прщения, но сам я доделать макрос не смогу. Просто я думал есть функция
которую можно исп-ть как любую другую прямо на листе, оказалось не много сложнее.
Если макрос, то мне нужно что бы он срабатывал при открытии листа.
Есть дата в ячейке В5 - это конечная дата, и есть столбик диапазоном J10-J28 с более
ранними датами, (промежуток между В5 и каждой из этих ячеек и есть цель которуюю ищем)
и после открытия листа в столбцах L и M диапазоном от 10 до 28 соотв-но должны выставляться
месяца (L10-L28) и дни (M10-M28). И все тоже самое, только деленное на 3 в столбцах N и O
диапазоном от 10 до 28. Вот и все.
Заранее спасибо если кто то возмется помочь!
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33277864
Стандартный модуль.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Public intMonth As Integer
Public intDays As Integer

Sub MonthsAndDays( _
  FirstDate As Range, _
  LastDate As Range)
      
    If Day(FirstDate) <= Day(LastDate) Then
        intMonth = DateDiff("m", FirstDate, LastDate, vbMonday)
    Else
        intMonth = DateDiff("m", FirstDate, LastDate, vbMonday) -  1 
    End If
    
    If Day(FirstDate) = Day(LastDate) Then
        intDays =  0 
    Else
        intDays = DateDiff("d", DateAdd("m", intMonth, FirstDate), _
          LastDate)
    End If
End Sub

Модуль книги.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Private Sub Workbook_Open()
    Dim rngFirstDate As Range
    Dim rngLastDate As Range
    Dim intI As Integer
    
    Set rngLastDate = ThisWorkbook.Worksheets("Лист1").Range("B5")
    
    For intI =  10  To  28 
        Set rngFirstDate = ThisWorkbook.Worksheets("Лист1").Range("J" & intI)
        Call MonthsAndDays(rngFirstDate, rngLastDate)
        With rngFirstDate
            .Offset( 0 ,  2 ).Value = intMonth
            .Offset( 0 ,  3 ).Value = intDays
            .Offset( 0 ,  4 ).Value = Round((intMonth /  3 ),  2 )
            .Offset( 0 ,  5 ).Value = Round((intDays /  3 ),  2 )
        End With
    Next
    
    Set rngFirstDate = Nothing
    Set rngLastDate = Nothing
End Sub
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33279327
Suleyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо! все работает отлично.
Последняя просьба, сразу не подумал, можно ли сделать так что бы макрос срабатывал не
при открытии книги,а при изменении данных ячейки В5. Просто по связям с этого листа
данные уходят в другие книги, а при закрытии листа данные не меняются пока его не откроешь.
А когда открываешь те связанные книги - там старые данные.
А так все супер! Реально спасибо
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33279609
Вынеси процедуру, которая стоит на Workbook_Open() в стандартный модуль, например с именем CreateDaysAndMonths.

В модуле листа запиши:

Код: plaintext
1.
2.
3.
4.
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(False, False) = "B5" Then
        Call CreateDaysAndMonths
    End If
End Sub
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33279981
Suleyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знаю, может я туплю, вроде делаю все так, добавляю к первому стандартному модую
то что было в модуле листа. Первая строка нового - Sub CreateDaysAndMonths(),
остальное как понимаю не должен менять. Добавляю в модуль листа - Private Sub Worksheet_Change
(ByVal Target As Range), жму на нем F5, но выпадает окно и нужно выбрать этот
новый CreateDaysAndMonths и потом нажать Выполнить.
А нельзя сделать, что бы автоматически при изменении данных в В5 запускался макрос?
Заранее благодарен
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33280236
Все уже автоматически.

Стандартный модуль (Module1).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
Public intMonth As Integer
Public intDays As Integer

Sub MonthsAndDays( _
  FirstDate As Range, _
  LastDate As Range)
      
    If Day(FirstDate) <= Day(LastDate) Then
        intMonth = DateDiff("m", FirstDate, LastDate, vbMonday)
    Else
        intMonth = DateDiff("m", FirstDate, LastDate, vbMonday) -  1 
    End If
    
    If Day(FirstDate) = Day(LastDate) Then
        intDays =  0 
    Else
        intDays = DateDiff("d", DateAdd("m", intMonth, FirstDate), _
          LastDate)
    End If
End Sub

Sub CreateDaysAndMonths()
    Dim rngFirstDate As Range
    Dim rngLastDate As Range
    Dim intI As Integer
    
    Set rngLastDate = ThisWorkbook.Worksheets("Ëèñò1").Range("B5")
    
    For intI =  10  To  28 
        Set rngFirstDate = ThisWorkbook.Worksheets("Ëèñò1").Range("J" & intI)
        Call MonthsAndDays(rngFirstDate, rngLastDate)
        With rngFirstDate
            .Offset( 0 ,  2 ).Value = intMonth
            .Offset( 0 ,  3 ).Value = intDays
            .Offset( 0 ,  4 ).Value = Round((intMonth /  3 ),  2 )
            .Offset( 0 ,  5 ).Value = Round((intDays /  3 ),  2 )
        End With
    Next
    
    Set rngFirstDate = Nothing
    Set rngLastDate = Nothing
End Sub

Модуль листа (Лист1).

Код: plaintext
1.
2.
3.
4.
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(False, False) = "B5" Then
        Call CreateDaysAndMonths
    End If
End Sub

Модуль книги (ЭтаКнига).

Код: plaintext
1.
2.
Public Sub Workbook_Open()
    Call CreateDaysAndMonths
End Sub

Меняешь дату в ячейке "B5" и все значения обновляются и не надо самому F5 нажимать.
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33280945
Suleyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо, все работает. Последняя проблемка всплыла.
Нужно что бы все числа округлялись до целых. Пробовал через формат ячеек, да показывает
то что нужно, но в документах куда они идут по связям, эти числа описываются другим
макросом. А если число не целое, тот макрос их не видит

Вот тот макрос:
Private Sub Workbook_Open()
Dim intI As Integer
Dim rng As Range
Dim cel As Range

For intI = 2 To 20
With Worksheets(intI)
Set rng = Worksheets(intI).Range("G40, G42")
For Each cel In rng
Select Case cel.Value
Case 0
cel.Offset(0, 1).Value = "(Ноль/Nil)"
Case 1
cel.Offset(0, 1).Value = "(Один/One)"
Case 2
cel.Offset(0, 1).Value = "(Два/Two)"
Case 3
cel.Offset(0, 1).Value = "(Три/Three)"
Case 4
cel.Offset(0, 1).Value = "(Четыре/Four)"
Case 5
cel.Offset(0, 1).Value = "(Пять/Five)"
Case 6
cel.Offset(0, 1).Value = "(Шесть/Six)"
Case 7
cel.Offset(0, 1).Value = "(Семь/Seven)"
Case 8
cel.Offset(0, 1).Value = "(Восемь/Eight)"
Case 9
cel.Offset(0, 1).Value = "(Девять/Nine)"
Case 10
cel.Offset(0, 1).Value = "(Десять/Ten)"
Case 11
cel.Offset(0, 1).Value = "(Одинадцать/Eleven)"
Case 12
cel.Offset(0, 1).Value = "(Двенадцать/Twelve)"
Case 13
cel.Offset(0, 1).Value = "(Тринадцать/Thirteen)"
Case 14
cel.Offset(0, 1).Value = "(Четырнадцать/Fourteen)"
Case 15
cel.Offset(0, 1).Value = "(Пятнадцать/Fifteen)"
Case 16
cel.Offset(0, 1).Value = "(Шестнадцать/Sixteen)"
Case 17
cel.Offset(0, 1).Value = "(Семнадцать/Seventeen)"
Case 18
cel.Offset(0, 1).Value = "(Восемнадцать/Eighteen)"
Case 19
cel.Offset(0, 1).Value = "(Девятнадцать/Nineteen)"
Case 20
cel.Offset(0, 1).Value = "(Двадцать/Twenty)"
Case 21
cel.Offset(0, 1).Value = "(Двадцать один/Twenty one)"
Case 22
cel.Offset(0, 1).Value = "(Двадцать два/Twenty two)"
Case 23
cel.Offset(0, 1).Value = "(Двадцать три/Twenty three)"
Case 24
cel.Offset(0, 1).Value = "(Двадцать четыре/Twenty four)"
Case 25
cel.Offset(0, 1).Value = "(Двадцать пять/Twenty five)"
Case 26
cel.Offset(0, 1).Value = "(Двадцать шесть/Twenty six)"
Case 27
cel.Offset(0, 1).Value = "(Двадцать семь/Twenty seven)"
Case 28
cel.Offset(0, 1).Value = "(Двадцать восемь/Twenty eight)"
Case 29
cel.Offset(0, 1).Value = "(Двадцать девять/Twenty nine)"
Case 30
cel.Offset(0, 1).Value = "(Тридцать/Thirty)"
Case 31
cel.Offset(0, 1).Value = "(Тридцать один/Thirty one)"
End Select
Next cel
End With
Next intI
End Sub
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33281009
Код: plaintext
Round((intMonth /  3 ),  0 )
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33299406
Suleyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите пожалуйста переделать макрос.
Нужно что бы работал с 1-го по 20-й листы,
Данные сравнивать между ячейками В27 и Н27, а вставлять на каждом листе:
in month - ячейка А40
in days - ячейка G40
in month/3 - ячейка А42
in days/3 - ячейка G42

Заранее благодарен
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33300564
Попробуй так.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
Public intMonth As Integer
Public intDays As Integer

Sub MonthsAndDays( _
  FirstDate As Date, _
  LastDate As Date)
      
    If Day(FirstDate) <= Day(LastDate) Then
        intMonth = DateDiff("m", FirstDate, LastDate, vbMonday)
    Else
        intMonth = DateDiff("m", FirstDate, LastDate, vbMonday) -  1 
    End If
    
    If Day(FirstDate) = Day(LastDate) Then
        intDays =  0 
    Else
        intDays = DateDiff("d", DateAdd("m", intMonth, FirstDate), _
          LastDate)
    End If
End Sub

Sub CreateDaysAndMonths()
    Dim FirstDate As Date
    Dim LastDate As Date
    Dim intI As Integer
    Dim ws As Worksheet
    
    For intI =  1  To  20 
        Set ws = Worksheets(intI)
        FirstDate = ws.Range("H27").Value
        LastDate = ws.Range("B27").Value
        Call MonthsAndDays(FirstDate, LastDate)
        With ws
            .Range("A40").Value = intMonth
            .Range("G40").Value = intDays
            .Range("A42").Value = Round((intMonth /  3 ),  0 )
            .Range("G42").Value = Round((intDays /  3 ),  0 )
        End With
    Next

    Set ws = Nothing
End Sub
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33301969
Suleyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, все работает отлично, но блин новая проблемка появилась.
В третьей и четвертой ячейке данные должны показывать реально
третью часть кол-ва дней от их общего кол-ва.
На пример если первая дата 16-мар-2005, а последняя 1-сен-2005,
то макрос считает в первую яч.-5 (мес.), во вторую яч.-16 (дней)
в третью -2(мес.) и в четвертую -5 (дней).
Ошибка появляется в 3-ей и 4-ой ячейках. Потому что долно быть: 1 (мес)
и 25 (дней)
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33302786
Сделай так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
Public intMonth As Integer
Public intDays As Integer
Public intDaysFull As Integer
Public intDays3 As Integer
Public intMonth3 As Integer

Sub MonthsAndDays( _
  FirstDate As Date, _
  LastDate As Date)

    If Day(FirstDate) <= Day(LastDate) Then
        intMonth = DateDiff("m", FirstDate, LastDate, vbMonday)
    Else
        intMonth = DateDiff("m", FirstDate, LastDate, vbMonday) -  1 
    End If
    
    If Day(FirstDate) = Day(LastDate) Then
        intDays =  0 
    Else
        intDays = DateDiff("d", DateAdd("m", intMonth, FirstDate), _
          LastDate)
    End If
    
    intDaysFull = DateDiff("d", FirstDate, LastDate, vbMonday)
    intMonth3 = Round(intDaysFull /  3 ,  0 ) \  31 
    intDays3 = Round(intDaysFull /  3 ,  0 ) Mod  31 
End Sub

Sub CreateDaysAndMonths()
    Dim FirstDate As Date
    Dim LastDate As Date
    Dim intI As Integer
    Dim ws As Worksheet
    
    For intI =  1  To  20 
        Set ws = Worksheets(intI)
        FirstDate = ws.Range("H27").Value
        LastDate = ws.Range("B27").Value
        Call MonthsAndDays(FirstDate, LastDate)
        With ws
            .Range("A40").Value = intMonth
            .Range("G40").Value = intDays
            .Range("A42").Value = intMonth3
            .Range("G42").Value = intDays3
        End With
    Next
    
    Set ws = Nothing
End Sub
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33303765
Suleyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, все работает отлично
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33303844
Ок.
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33304865
Suleyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я прошу прощения, наверное задолбал уже своими поправками, последняя просьба, реально последняя: можно ли сделать этот макрос только для работы только на листах "Master", "Office", и "Deck". Просто в этой книге появилось куча других листов, и он на них тоже пытается считать
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33305229
SuleymanЯ прошу прощения, наверное задолбал уже своими поправками, последняя просьба, реально последняя.
:)

Переделай процедуру следующим образом.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Sub CreateDaysAndMonths()
    Dim FirstDate As Date
    Dim LastDate As Date
    Dim intI As Integer
    Dim ws As Worksheet
    
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name = "Master" Or _
          ws.Name = "Office" Or _
          ws.Name = "Deck" Then
            FirstDate = ws.Range("H27").Value
            LastDate = ws.Range("B27").Value
            Call MonthsAndDays(FirstDate, LastDate)
            With ws
                .Range("A40").Value = intMonth
                .Range("G40").Value = intDays
                .Range("A42").Value = intMonth3
                .Range("G42").Value = intDays3
            End With
        End If
    Next ws
    
    Set ws = Nothing
End Sub
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33306908
Suleyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо! наконец то все заработало как надо.
...
Рейтинг: 0 / 0
Кол-во дней между датами в двух ячейках, в месяцах и днях
    #33307041
Ок. :)
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Кол-во дней между датами в двух ячейках, в месяцах и днях
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]