guids generar generador genera example claves aleatorio excel vba excel-vba guid

generador - ¿Cómo puedo generar GUID en Excel?



guid example (10)

Tengo un archivo de Excel con un pedido en cada fila, y quiero que cada orden tenga un identificador único, por lo que habrá una columna de identificación única. Cada vez que llene una fila, quiero que Excel ingrese automáticamente la columna ID única para mí. Investigué un poco y apunté en dirección a los GUID. Encontré el siguiente código:

Function GenGuid() As String Dim TypeLib As Object Dim Guid As String Set TypeLib = CreateObject("Scriptlet.TypeLib") Guid = TypeLib.Guid '' format is {24DD18D4-C902-497F-A64B-28B2FA741661} Guid = Replace(Guid, "{", "") Guid = Replace(Guid, "}", "") Guid = Replace(Guid, "-", "") GenGuid = Guid End Function

pero no estoy seguro de cómo puedo implementarlo. Cualquier ayuda sería muy apreciada. Gracias de antemano.


Desde la actualización de Windows eliminada "Scriptlet.TypeLib", intente lo siguiente:

Declare Function CoCreateGuid Lib "ole32" (ByRef GUID As Byte) As Long Public Function GenerateGUID() As String Dim ID(0 To 15) As Byte Dim N As Long Dim GUID As String Dim Res As Long Res = CoCreateGuid(ID(0)) For N = 0 To 15 GUID = GUID & IIf(ID(N) < 16, "0", "") & Hex$(ID(N)) If Len(GUID) = 8 Or Len(GUID) = 13 Or Len(GUID) = 18 Or Len(GUID) = 23 Then GUID = GUID & "-" End If Next N GenerateGUID = GUID End Function

Alternativamente,

si se conecta a SQL Server 2008 o superior, intente utilizar la función SQL NEWID () en su lugar.


Encontré una buena solución aquí:
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=751237&msg=8634441

Option Explicit Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type Private Declare Function CoCreateGuid Lib "ole32" (pguid As GUID) As Long Private Declare Function StringFromGUID2 Lib "ole32" ( _ rguid As GUID, ByVal lpsz As Long, ByVal cchMax As Long) As Long Public Function CreateGUID() As String Dim NewGUID As GUID CoCreateGuid NewGUID CreateGUID = Space$(38) StringFromGUID2 NewGUID, StrPtr(CreateGUID), 39 End Function


La siguiente expresión de Excel se evalúa como un GUID de V4:

=CONCATENATE(DEC2HEX(RANDBETWEEN(0,4294967295),8),"-",DEC2HEX(RANDBETWEEN(0,6553‌​5),4),"-",DEC2HEX(RANDBETWEEN(16384,20479),4),"-",DEC2HEX(RANDBETWEEN(32768,49151‌​),4),"-",DEC2HEX(RANDBETWEEN(0,65535),4),DEC2HEX(RANDBETWEEN(0,4294967295),8))

-o (dependiendo de la configuración regional / separadores de decimales y listas) -

=CONCATENATE(DEC2HEX(RANDBETWEEN(0;4294967295);8);"-";DEC2HEX(RANDBETWEEN(0;65535);4);"-";DEC2HEX(RANDBETWEEN(16384;20479);4);"-";DEC2HEX(RANDBETWEEN(32768;49151);4);"-";DEC2HEX(RANDBETWEEN(0;65535);4);DEC2HEX(RANDBETWEEN(0;4294967295);8))

Tenga en cuenta que el primer carácter del tercer grupo siempre es 4 para indicar un GUID / UUID de V4 (número pseudoaleatorio generado) según RFC 4122 sección 4.4.

También tenga en cuenta que el primer carácter del cuarto grupo siempre está entre 8 y B por el mismo RFC.

Descargo de responsabilidad estándar: los GUID / UUID resultantes no son criptográficamente fuertes.


Lo mismo ocurre con la versión alemana de Excel:

=VERKETTEN(DEZINHEX(ZUFALLSBEREICH(0;4294967295);8);"-";DEZINHEX(ZUFALLSBEREICH(0;65535);4);"-";DEZINHEX(ZUFALLSBEREICH(16384;20479);4);"-";DEZINHEX(ZUFALLSBEREICH(32768;49151);4);"-";DEZINHEX(ZUFALLSBEREICH(0;65535);4);DEZINHEX(ZUFALLSBEREICH(0;4294967295);8))


Recientemente me encontré con problemas al usar CreateObject ("Scriptlet.TypeLib") en algún código vba.

Por lo tanto, basado en las funciones de Excel de NekojiruSou, escribió lo siguiente que debería funcionar sin ninguna función de Excel específica. Esto se puede usar para desarrollar una función definida por el usuario en Excel.

Public Function Get_NewGUID() As String ''Returns GUID as string 36 characters long Randomize Dim r1a As Long Dim r1b As Long Dim r2 As Long Dim r3 As Long Dim r4 As Long Dim r5a As Long Dim r5b As Long Dim r5c As Long ''randomValue = CInt(Math.Floor((upperbound - lowerbound + 1) * Rnd())) + lowerbound r1a = RandomBetween(0, 65535) r1b = RandomBetween(0, 65535) r2 = RandomBetween(0, 65535) r3 = RandomBetween(16384, 20479) r4 = RandomBetween(32768, 49151) r5a = RandomBetween(0, 65535) r5b = RandomBetween(0, 65535) r5c = RandomBetween(0, 65535) Get_NewGUID = (PadHex(r1a, 4) & PadHex(r1b, 4) & "-" & PadHex(r2, 4) & "-" & PadHex(r3, 4) & "-" & PadHex(r4, 4) & "-" & PadHex(r5a, 4) & PadHex(r5b, 4) & PadHex(r5c, 4)) End Function Public Function Floor(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double ''From: http://www.tek-tips.com/faqs.cfm?fid=5031 '' X is the value you want to round '' Factor is the multiple to which you want to round Floor = Int(X / Factor) * Factor End Function Public Function RandomBetween(ByVal StartRange As Long, ByVal EndRange As Long) As Long ''Based on https://msdn.microsoft.com/en-us/library/f7s023d2(v=vs.90).aspx '' randomValue = CInt(Math.Floor((upperbound - lowerbound + 1) * Rnd())) + lowerbound RandomBetween = CLng(Floor((EndRange - StartRange + 1) * Rnd())) + StartRange End Function Public Function PadLeft(text As Variant, totalLength As Integer, padCharacter As String) As String ''Based on https://.com/questions/12060347/any-method-equivalent-to-padleft-padright '' with a little more checking of inputs Dim s As String Dim inputLength As Integer s = CStr(text) inputLength = Len(s) If padCharacter = "" Then padCharacter = " " ElseIf Len(padCharacter) > 1 Then padCharacter = Left(padCharacter, 1) End If If inputLength < totalLength Then PadLeft = String(totalLength - inputLength, padCharacter) & s Else PadLeft = s End If End Function Public Function PadHex(number As Long, length As Integer) As String PadHex = PadLeft(Hex(number), 4, "0") End Function


Sé que se responde a esta pregunta, pero creo que el código en cuestión debería parecerse a lo que está en esta página: http://snipplr.com/view/37940/

No lo he probado, pero este código parece aprovechar la API de Windows para obtener su GUID. Intentaría ponerlo en un módulo público y escribiré =GetGUId() en una celda de Excel para ver lo que obtendría. Si funciona en VB6, tienes muchas posibilidades de que también funcione en VBA:

Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(7) As Byte End Type Private Declare Function CoCreateGuid Lib "OLE32.DLL" (pGuid As GUID) As Long Public Function GetGUID() As String ''(c) 2000 Gus Molina Dim udtGUID As GUID If (CoCreateGuid(udtGUID) = 0) Then GetGUID = _ String(8 - Len(Hex$(udtGUID.Data1)), "0") & Hex$(udtGUID.Data1) & _ String(4 - Len(Hex$(udtGUID.Data2)), "0") & Hex$(udtGUID.Data2) & _ String(4 - Len(Hex$(udtGUID.Data3)), "0") & Hex$(udtGUID.Data3) & _ IIf((udtGUID.Data4(0) < &H10), "0", "") & Hex$(udtGUID.Data4(0)) & _ IIf((udtGUID.Data4(1) < &H10), "0", "") & Hex$(udtGUID.Data4(1)) & _ IIf((udtGUID.Data4(2) < &H10), "0", "") & Hex$(udtGUID.Data4(2)) & _ IIf((udtGUID.Data4(3) < &H10), "0", "") & Hex$(udtGUID.Data4(3)) & _ IIf((udtGUID.Data4(4) < &H10), "0", "") & Hex$(udtGUID.Data4(4)) & _ IIf((udtGUID.Data4(5) < &H10), "0", "") & Hex$(udtGUID.Data4(5)) & _ IIf((udtGUID.Data4(6) < &H10), "0", "") & Hex$(udtGUID.Data4(6)) & _ IIf((udtGUID.Data4(7) < &H10), "0", "") & Hex$(udtGUID.Data4(7)) End If End Function

Gracias Gus Molina!

Si este código funciona (cosa que no dudo), creo que obtendría un nuevo conjunto de GUID cada vez que se evalúe la función, lo que significa que cada vez que se calcula la hoja, por ejemplo, cuando está guardando el libro de trabajo. Asegúrese de copiar-pasesespeciales-valores si necesita los GUID para su uso posterior ... lo cual es bastante probable.


Si está insertando registros en una base de datos, puede usarlos de esta forma para crear un GUID.

Es probablemente la forma más simple y fácil de implementar ya que no necesita una función VBA compleja ya que usa la función SQL incorporada.

La declaración usa NewID() ,

La sintaxis es la siguiente,

INSERT INTO table_name (ID,Column1,Column2,Column3) VALUES (NewID(),value1,value2,value3)

En la sintaxis de VBA es lo siguiente,

strSql = "INSERT INTO table_name " _ & "(ID,Column1,Column2,Column3) " _ & "VALUES (NewID(),value1,value2,value3)"

Y si necesita concatenar valores, simplemente trátelo como una cadena y concatene como lo haría normalmente para una instrucción SQL,

strSql = "INSERT INTO table_name " _ & "(ID,Column1,Column2,Column3) " _ & "VALUES (" & "NewID()" & "," & "value1" & "," & "value2" & "," & "value3" & ")"


Un enfoque VBA basado en la generación de números aleatorios utilizando la función Rnd() , y no en llamadas API externas o Scriptlet.TypeLib :

Public Function CreateGUID() As String Do While Len(CreateGUID) < 32 If Len(CreateGUID) = 16 Then ''17th character holds version information CreateGUID = CreateGUID & Hex$(8 + CInt(Rnd * 3)) End If CreateGUID = CreateGUID & Hex$(CInt(Rnd * 15)) Loop CreateGUID = "{" & Mid(CreateGUID, 1, 8) & "-" & Mid(CreateGUID, 9, 4) & "-" & Mid(CreateGUID, 13, 4) & "-" & Mid(CreateGUID, 17, 4) & "-" & Mid(CreateGUID, 21, 12) & "}" End Function

Básicamente, se trata de una implementación de VBA de la respuesta de NekojiruSou (también genera un GUID v4) y tiene las mismas limitaciones, pero funcionará en VBA y podría ser más fácil de implementar.

Tenga en cuenta que puede omitir la última línea para no devolver los guiones y las llaves en el resultado.


Utilicé la siguiente función en v.2013 excel vba para crear un GUID y está funcionando bien ...

Public Function GetGUID() As String GetGUID = Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36) End Function


Function funGetGuid() As String Const URL As String = "http://www.guidgen.com/" Const strMask As String = "value=" Dim l As Long Dim txt As String With CreateObject("MSXML2.XMLHTTP") .Open "GET", URL, False .send txt = .responseText End With Do l = InStr(l + 1, txt, strMask) If l = 0 Then Exit Do funGetGuid = Mid$(txt, l + Len(strMask) + 1, 36) Loop End Function