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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2012, 21:14   #11
Wer666
 
Регистрация: 20.08.2012
Сообщений: 7
По умолчанию

EducatedFool, спасибо огромное за ответ!
А можно по подробнее? Как воспользоваться вашим макросом?
Не ругайте сильно - я не сильно разбираюсь в программировании.
Wer666 вне форума Ответить с цитированием
Старый 21.08.2012, 08:51   #12
AndVGri
Форумчанин
 
Регистрация: 10.02.2012
Сообщений: 109
По умолчанию

Прочитать можно с конвертированием в Double, для примера - чтение числа из Long64
Код:
Public Sub readLong64()
    Dim b8(0 To 7) As Byte
    Dim fNum As Integer
    Dim i As Long
    Dim vResult As Double, vPower As Double
    
    fNum = FreeFile
    Open "c:\temp\1.1" For Binary Access Read As #fNum Len = 8
    vResult = 0#: vPower = 1#
    Get #fNum, , b8
    For i = 0 To 7
        vResult = vResult + vPower * CDbl(b8(i))
        vPower = vPower * 256#
    Next i

    Debug.Print vResult
    Close #fNum
End Sub
А для работы лучше объявить структуру
Код:
Type binData
    vDate(0 To 7) As Byte
    Volume1 As Double
    Volume2 As Double
    Price1 As Double
    Price2 As Double
End Type
И читать переменной такой структуры, задав Len=40
AndVGri вне форума Ответить с цитированием
Старый 21.08.2012, 12:15   #13
Wer666
 
Регистрация: 20.08.2012
Сообщений: 7
По умолчанию

Попробовал выполнить вышеуказанный макрос, но результатов не получил(((
Что мог сделать не так?(
Wer666 вне форума Ответить с цитированием
Старый 21.08.2012, 14:59   #14
AndVGri
Форумчанин
 
Регистрация: 10.02.2012
Сообщений: 109
По умолчанию

Wer66 процедура readLong64 считывает из файла 1.1 в папке c:\temp первых 8 байт и преобразовывает их в число типа Double. Вы можете поменять путь и имя к вашему bin файлу, чтобы проверить корректность вычисления такого преобразования. Я привёл лишь пример. Что конкретно у вас «никаких результатов» дало? Что-то же Debug.Print должен же был выдать в панели Immediate или, хотя бы, должно было появиться сообщение об ошибке.
AndVGri вне форума Ответить с цитированием
Старый 21.08.2012, 15:43   #15
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Уважаемый AndVGri,

а Вас не смущает, что при преобразовании целого в дробное теряется некоторая часть точности. Например, для приведенного здесь примера, число:
3806576592579264512 (34 D3 AD 3E 2B 01 00 00h), значение после преобразования станет: 3806576592579260000

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

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

з.ы. при правильном подходе можно заменить Long64 строкой, но неясно как планируется его дальше обрабатывать...
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 21.08.2012, 16:10   #16
AndVGri
Форумчанин
 
Регистрация: 10.02.2012
Сообщений: 109
По умолчанию

Все в наших руках. можно сделать и преобразование в текс т- завтра подумаю. Но у автора 13 знаков всего в примере, не подскажете алгоритм записи даты и времени в целое 64 число?
AndVGri вне форума Ответить с цитированием
Старый 21.08.2012, 16:20   #17
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
не подскажете алгоритм записи даты и времени в целое 64 число?
А зачем? Double сам по себе 64-х разрядное число с плавающей точкой, т.е. в условия вписывается вполне. В Excel нет поддержки только целочисленных значений такой длины.

Цитата:
Но у автора 13 знаков всего в примере
Смотря в каком порядке считывать байты - в прямом или обратном. Да и в любом случае, со временем количество цифр может достигнуть критического уровня.
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 21.08.2012 в 16:22.
DiemonStar вне форума Ответить с цитированием
Старый 21.08.2012, 17:16   #18
AndVGri
Форумчанин
 
Регистрация: 10.02.2012
Сообщений: 109
По умолчанию

Хм, уважаемый DiemonStar, порядок байтов для Long64, предполагаю, стандартный – слева младший байт, справа старший. По поводу перспективы, я не зря спросил про алгоритм вычисления даты, представленной *типом Long64. Предположим, он предполагает за 1 принимать одну сотую секунды от начала нашей эры, тогда имеем для 2100 года 2100*366*24*3600*100=6 640 704 000 000 – как раз 13 знаков. Думаю, вы согласитесь, что до 2100 года макрос вряд ли будет использоваться. Потеря точности идёт с 256^6, 256^7, можно их, используя VS получить в текстовом виде и умножать и складывать поразрядно с значениями 6 и 7 байтов, работая с текстом (неспешно будет, но результат…). Далее, разбиваем полученный результат на части, так чтобы сумма младшей части с остальным значением (с 0 по 5 байт) не имела переноса разряда. Младшую часть складываем со значением с 0 по 5 байт и как текст добавляем к старшей текстовой части. Если бы был алгоритм представления даты в целочисленном виде, то можно было бы и конвертер написать. Только будет ли этим заниматься ТС? Алгоритм то набросать можно, но судя по вопросам ТС – возьмётся ли он его реализовывать?
AndVGri вне форума Ответить с цитированием
Старый 21.08.2012, 17:18   #19
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Даты в файле нет.исходные данные по дате в файле INI.
1 байт =номер устройства,3 байта =показания прибора
Но у меня количество данных в 3 раза меньше чем в окне программы.
Надо алгоритм программы знать
привожу выдержки
Получил для 2х устройств

2 -2,9521
3 0,0052
2 -2,9501
3 0,0057
2 -2,9501
3 0,0046
2 -2,8463
3 0,0046
2 -2,8874
3 0,0046
2 -2,9521
3 0,0077
2 -2,9943
3 0,0057

Для 8 устройств.

0 0,0011
3 -0,0253
6 -0,0052
1 -0,0271
4 -0,0155
7 0,0099
2 -0,0059
5 0,248
0 0,0004
3 -0,0275
6 -0,0059
1 -0,0256
4 -0,0155
7 0,0092
2 -0,0059
5 0,2484
0 0,0015
3 -0,0238
6 -0,0059
1 -0,0263
4 -0,0155
7 0,0095
2 -0,0051
5 0,3431
Анализ,обработка данных Недорого

Последний раз редактировалось doober; 21.08.2012 в 17:23.
doober вне форума Ответить с цитированием
Старый 21.08.2012, 17:30   #20
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
По поводу перспективы, я не зря спросил про алгоритм вычисления даты, представленной *типом Long64.
Дата практически во всех языках программирования представлена числами с плавающей точкой (но никак не целочисленными), где целая часть числа = количеству дней, а дробная = части суток на текущий момент. И такое число очень даже просто преобразовывается в дату.
в условии написано:
Цитата:
Время - 64-bit Long
т.е. либо автор ошибается с форматом записи, либо используется нестандартный способ хранения, а это само по себе вызывает некоторые проблемы, основная из которых - отсутствие информации.
Цитата:
порядок байтов для Long64, предполагаю, стандартный – слева младший байт, справа старший.
ну так именно в этом порядке я и сделал преобразование, а не как это сделал автор: http://programmersforum.ru/showpost....06&postcount=2
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Повреждение данных при записи в середину бинарного файла Aerial Общие вопросы C/C++ 2 01.12.2011 19:32
Чтение данных из бинарного файла Faramir02 Общие вопросы C/C++ 3 22.12.2010 22:43
Поиск-извлечение блока данных из бинарного файла Alter Общие вопросы Delphi 6 28.11.2009 23:12
Импорт данных в Excel mMAg Microsoft Office Excel 2 20.08.2009 17:50
Импорт из текстового файла в Excel (DBF) Slava БД в Delphi 3 22.07.2009 20:28