Страницы: 1
RSS
Генерация GUID в Excel
 
Добрый день!
Столкнулся с необходимостью генерации GUID. Пока генерю так:
Код
=СЦЕПИТЬ(ДЕС.В.ШЕСТН(СЛУЧМЕЖДУ(0;4294967295);8);"-";ДЕС.В.ШЕСТН(СЛУЧМЕЖДУ(0;65535);4);"-";ДЕС.В.ШЕСТН(СЛУЧМЕЖДУ(0;65535);4);"-";ДЕС.В.ШЕСТН(СЛУЧМЕЖДУ(0;65535);4);"-";ДЕС.В.ШЕСТН(СЛУЧМЕЖДУ(0;4294967295);8);ДЕС.В.ШЕСТН(СЛУЧМЕЖДУ(0;65535);4))
А есть ли еще способы генерации GUID в Excel? Интересны другие варианты.
 
Конечно, текст из #1 не генерирует GUID.
Еще несколько лет назад для генерации GUID разработчики пользовались объектом “Scriptlet.TypeLib”. Однако, после обновления Windows в 2017 году на многих компьютерах обращение к этому объекту вызывает ошибку “Run-time error ‘70’ permission denied”.
Microsoft рекомендует следующий путь (операторы Declare дополнены для совместимости с версиями до 2007):
Код
Option Explicit
Private Type GUID_TYPE
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
End Type

#If VBA7 Then
  Private Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" (Guid As GUID_TYPE) As LongPtr
  Private Declare PtrSafe Function StringFromGUID2 Lib "ole32.dll" (Guid As GUID_TYPE, ByVal lpStrGuid As LongPtr, ByVal cbMax As Long) As LongPtr
#Else
  Private Declare Function CoCreateGuid Lib "ole32.dll" (Guid As GUID_TYPE) As Long
  Private Declare Function StringFromGUID2 Lib "ole32.dll" (Guid As GUID_TYPE, ByVal lpStrGuid As Long, ByVal cbMax As Long) As Long
#End If

Function CreateGuidString()
    Dim Guid As GUID_TYPE
    Dim strGuid As String
    Dim retValue

    Const guidLength As Long = 39 'registry GUID format with null terminator {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
    retValue = CoCreateGuid(Guid)

    If retValue = 0 Then
        strGuid = String$(guidLength, vbNullChar)
        retValue = StringFromGUID2(Guid, StrPtr(strGuid), guidLength)
        If retValue = guidLength Then ' valid GUID as a string
            CreateGuidString = strGuid
        End If
    End If
End Function

Sub testGuid()
    Debug.Print CreateGuidString()
End Sub
Владимир
 
sokol92,и как это работает?
запустил макрос - тишина...
 
jeka-irbis, в Immegiate смотрите (в VBE Ctrl+G)
 
Андрей Лящук,посмотрел - там тоже пусто.
 
а если выполнить testGuid и посмотреть?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
А почему не добавить явный вывод, например в А1
Код
        If retValue = guidLength Then ' valid GUID as a string
            CreateGuidString = strGuid
            Range("A1") = strGuid
        End If
 
Цитата
sokol92 написал:
для генерации GUID
ух, Владимир здорово! Я не знал что так можно и набросал для себя в XLL функцию, оказалась очень похожая).
Все те же API
Если кому нужно будет писать для Excel на Си, то вот (очень простая. под спойлером)
Скрытый текст

Кому лень писать самим, могут просто бесплатно качнуть BedvitXLL и пользоваться (функция "CoCreateGuidXLL"), начиная с версии 4.10:
Изменено: bedvit - 22.09.2023 17:48:04
«Бритва Оккама» или «Принцип Калашникова»?
 
sokol92, приветствую и спасибо!
    Забрал себе  :)
Сделал под себя с выводом сообщений в случае неполадок
sokol92, а почему у меня даже, если Data4(7) As Byte (то есть от 1 до 7) — работает?
Изменено: Jack Famous - 22.09.2023 18:17:09 (Добавил тест скорости и сравнение с библой от BedVit'а)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Здравствуйте, коллеги!  Виталий, спасибо за очередную "суперфункцию"!
Владимир
 
Цитата
Jack Famous написал:
а почему у меня даже, если Data4(7) As Byte (то есть от 1 до 7) — работает?
Алексей, не знаю, я не видел исходников Win32 API.  :)
Владимир
 
Цитата
Jack Famous написал:
если Data4(7) As Byte (то есть от 1 до 7) — работает?
думаю не стоит так делать. Не факт что у тебя все символы сохраняются в структуру.
Просто сохраняешь 7 и потом читаешь 8 один лишний-может из какой либо другой программы) но так это только чтения прога не крашится. До момента пока не попадешь в кусок памяти залоченный.

Структура GUID
«Бритва Оккама» или «Принцип Калашникова»?
 
можно отключить вообще последний элемент в структуре, ты отключаешь последний символ.

Код
Private Type GUID_TYPE
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    'Data4(0 To 0) As Byte
End Type


Это только мои предположения, как Владимир пояснил кода мы не видим апишного.

Может он в любои случае пишет 8 байт, и не крашится по тому же сценарию (память на залоченная и не критически важная) Но может у тебя в другой макросе всплывут эти символы в какой нить строке).
Это, конечно навряд ли, но каков сюжет?)
Изменено: bedvit - 22.09.2023 18:14:21
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: думаю не стоит так делать
так я и не делал. У меня ж Option Base 1 стоит везде — заметил и изменил размерности в соответствии с вариантом Владимира уже после первого теста. И возник вопрос, почему всё не крашнулось  :)
Цитата
bedvit: Структура GUID
получается, я могу 1 To 8 объявить…
Изменено: Jack Famous - 22.09.2023 18:12:10
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
получается, я могу 1 To 8 объявить
Да, там главное, что бы 8 байт влезло.
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, спасибо!
    Изменил листинг и добавил тест скорости. Библа в 15 раз быстрее   :idea:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
А как мне у себя проверить код, вставляю код и ругается на строку
Цитата
'        s = BV.CoCreateGuid()              ' 0.2
Изменено: Senaki - 15.01.2024 08:28:17
 
Senaki, думаю у вас старая версия xll. Посмотрите какая.
«Бритва Оккама» или «Принцип Калашникова»?
 
4.11b.231219.110540
Сама функция есть в excel, а в ВБА выдает ошибку
Изменено: Senaki - 15.01.2024 09:04:41
 
Senaki, возможно у вас не подключена СОМ-библиотека. Работают ли другие функции?
«Бритва Оккама» или «Принцип Калашникова»?
 
Проверил, COM подключена и я могу видеть свойства и методы в ВБА, но функции CoCreateGuidXLL нету в ВБА, только в excel
Перезашел в excel и появилась, спасибо за помощь
Изменено: Senaki - 15.01.2024 09:24:30
Страницы: 1
Наверх