Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2012, 15:31   #21
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Код:
h%,
проблема тут. замените на h& и всё будет работать - при количестве часов, большем 9, получается переполнение обычного двухбайтного знакового целого числа.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 03.10.2012, 16:14   #22
tvitaly1
Заблокирован
 
Регистрация: 02.10.2012
Сообщений: 28
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
проблема тут. замените на h& и всё будет работать - при количестве часов, большем 9, получается переполнение обычного двухбайтного знакового целого числа.
Верно. Переполнение было по указанной вами причине.
tvitaly1 вне форума Ответить с цитированием
Старый 03.10.2012, 16:57   #23
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Код:
'Приходится делать так:
For i& = 1 To 3600
 t = t - h
Next i&
Нет, так не надо
Достаточно указать, что константа типа Long:
Код:
t = t - h * 3600&
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 03.10.2012, 19:27   #24
tvitaly1
Заблокирован
 
Регистрация: 02.10.2012
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
Код:
'Приходится делать так:
For i& = 1 To 3600
 t = t - h
Next i&
Нет, так не надо
Достаточно указать, что константа типа Long:
Код:
t = t - h * 3600&
Спасибо большое, Казанский, за все, хорошая инфа
И вам большое спасибо, DiemonStar, за инфу и God, все вышло.

Люди добрые, подскажите пожалуйста, как нати из числа месяц и день.
И еще подскажите пожалуйста, почему 1461?

Код:
God = ((D - 2) \ 1461) * 4 + ((D - 2) Mod 1461) \ 365 + 1900

Последний раз редактировалось tvitaly1; 03.10.2012 в 19:31.
tvitaly1 вне форума Ответить с цитированием
Старый 03.10.2012, 19:50   #25
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
И еще подскажите пожалуйста, почему 1461?
видите-ли, сутки - это время полного оборота Земли вокруг своей оси, а год - это время за которое Земля делает полный оборот вокруг Солнца. к сожалению это не кратные величины. Оборот вокруг Солнца длится 365 дней 6 часов и несколько минут и секунд.
поэтому 1461 = 365*4 + 1 - каждые 4 года случается высокосный год и 29 февраля.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 03.10.2012, 20:37   #26
tvitaly1
Заблокирован
 
Регистрация: 02.10.2012
Сообщений: 28
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
Код:
И еще подскажите пожалуйста, почему 1461?
видите-ли, сутки - это время полного оборота Земли вокруг своей оси, а год - это время за которое Земля делает полный оборот вокруг Солнца. к сожалению это не кратные величины. Оборот вокруг Солнца длится 365 дней 6 часов и несколько минут и секунд.
поэтому 1461 = 365*4 + 1 - каждые 4 года случается высокосный год и 29 февраля.
спасибо, сейчас буду делать
tvitaly1 вне форума Ответить с цитированием
Старый 04.10.2012, 00:06   #27
tvitaly1
Заблокирован
 
Регистрация: 02.10.2012
Сообщений: 28
По умолчанию

Чего-то меня все на сложности тянет. Думаю сильно осудите меня за такое решение. Но проще придумать не могу. Увы, не каждые четыре года високосный год встречается, 1900 не високосный.
Код:
Public Function god(ByVal cislo As Double) As Long
  
  cislo = Int(cislo)
  god = 1900
   While cislo - 1 > 365 - VG(god)
   n = CInt(VG(god))
   cislo = cislo - 365 + VG(god)
   god = god + 1
  Wend
  
End Function

Private Function VG(ByVal I) As Boolean
 'Ãîä äîëæåí äåëèòüñÿ íà ÷åòûðå.
 'Ãîä íå äîëæåí äåëèòüñÿ íà 100, åñëè òîëüêî îí íå äåëèòñÿ è íà 400.
     VG = I = (I \ 4) * 4 And (I <> (I \ 100) * 100 Or I = (I \ 400) * 400)
End Function

Public Function DfromGod(cislo As Double) As Long
 
  DfromGod = 1
   For I = 1900 To god(cislo) - 1
    If VG(I) Then
     DfromGod = DfromGod + 366
    Else
     DfromGod = DfromGod + 365
    End If
  Next I
 
End Function



Public Function MM(ByVal cislo As Double) As Long
 Dim I As Long, n As Long, k As Long
 
 n = Int(cislo) - DfromGod(cislo)
 
 M = Array(31, 28 - VG(god(cislo)), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
 
 k = 0
 For I = 0 To 11
  k = k + M(I)
  If n <= k Then
   MM = I + 1
   Exit For
  End If
 Next I
 
  
End Function


Public Function Den(cislo As Double) As Long
 Dim I As Long, n As Long, n1 As Long, k As Long
 
 n = Int(cislo) - DfromGod(cislo)
 
 M = Array(31, 28 - VG(god(cislo)), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)

 k = 0
 For I = 0 To MM(cislo) - 2
  k = k + M(I)
 Next I
 
 Den = n - k
 
End Function

Последний раз редактировалось tvitaly1; 04.10.2012 в 22:08.
tvitaly1 вне форума Ответить с цитированием
Старый 04.10.2012, 20:44   #28
tvitaly1
Заблокирован
 
Регистрация: 02.10.2012
Сообщений: 28
По умолчанию

Всем, принявшим участия в решение моей задачи, большое спасибо. Вы мне очень помогли! Корректное преобразование целой части числа в переменной date в топике выше. Проблема 2101 года успешно решена. А я, помимо всего прочего узнал о том, что в общепринятом календаре високосный код встречается не каждые четыре года.
tvitaly1 вне форума Ответить с цитированием
Старый 04.10.2012, 21:17   #29
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
что в общепринятом календаре високосный код встречается не каждые четыре года
факт не новый. я давно определился на моем веку все года кратные 4 - будут высокосными, поэтому этот замечательный факт могу игнорировать.
и смысл темы остался загадочным...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 04.10.2012, 21:39   #30
tvitaly1
Заблокирован
 
Регистрация: 02.10.2012
Сообщений: 28
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
факт не новый. я давно определился на моем веку все года кратные 4 - будут высокосными, поэтому этот замечательный факт могу игнорировать.
и смысл темы остался загадочным...
Я не думаю, что надо решать задачу с той позиции, что на наш век хватит. Все же, с моей точки зрения, лучше попытаться решить задачу правильно.
Для чего все мне это было нужно, вообще, повторяю, что я делал модель хранения переменных в памяти компьютер, по которой можно изучать оное. И хотелось выяснить, как осуществить преобразование непосредственно из числа. Даю поясняющую картинку.
Я не думаю, что надо решать задачу с той позиции, что на наш век хватит. Все же, с моей точки зрения, лучше попытаться решить задачу правильно.
tvitaly1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VBA Word,VBA Excel решить 2 задачи fafolo4ka Фриланс 6 05.03.2012 01:15
Обнуление глобальных переменных в VBA Arkasha69 Microsoft Office Excel 1 06.09.2010 15:06
vba+excel Анна Рожкова Microsoft Office Excel 18 28.05.2010 21:41
сезонная адаптивная модель в VBA Kudoh Microsoft Office Excel 0 18.06.2009 19:31
Как запретить запуск программы на VBA Excel 2003 в Excel 2007 kovalevskivf Microsoft Office Excel 2 15.05.2009 16:47