Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何在Excel中生成GUI?_Vba_Excel_Guid - Fatal编程技术网

Vba 如何在Excel中生成GUI?

Vba 如何在Excel中生成GUI?,vba,excel,guid,Vba,Excel,Guid,我有一个excel文件,每行有一个订单,我希望每个订单都有一个唯一的标识符,因此将有一个唯一的ID列。每次我填写一行,我都希望Excel为我自动填充唯一ID列。我做了一些研究,并被指向了guid的方向。我找到了以下代码: Function GenGuid() As String Dim TypeLib As Object Dim Guid As String Set TypeLib = CreateObject("Scriptlet.TypeLib") Guid = TypeLib.Guid '

我有一个excel文件,每行有一个订单,我希望每个订单都有一个唯一的标识符,因此将有一个唯一的ID列。每次我填写一行,我都希望Excel为我自动填充唯一ID列。我做了一些研究,并被指向了guid的方向。我找到了以下代码:

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

但我不确定如何实施它。任何帮助都将不胜感激。提前感谢。

以下Excel表达式的计算结果为V4 GUID:

=串联(DEC2HEX(randbehen(04294967295),8),“-”,DEC2HEX(randbehen(065535),4),“-”,DEC2HEX(randbehen(163842479),4),“-”,DEC2HEX(randbehen(065535),4),DEC2HEX(randbehen(04294967295),8))

-或(取决于区域设置/十进制和列表分隔符)-

=串联(DEC2HEX(randbehen(0;4294967295);8);“-”DEC2HEX(randbehen(0;65535);4);“-”DEC2HEX(randbehen(16384;20479);4);“-”DEC2HEX(randbehen(32768;49151);4);“-”DEC2HEX(randbehen(0;65535);4);DEC2HEX(randbehen(0;4294967295);8)

请注意,根据RFC 4122第4.4节,第三组的第一个字符始终为4,表示V4(生成的伪随机数)GUID/UUID

还请注意,对于同一RFC,第四组的第一个字符始终介于8和B之间

标准免责声明:生成的guid/uuid在加密方面不强

编辑:删除不可见字符

与德语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))

我知道这个问题已经得到了回答,但我认为有问题的代码应该类似于此页面上的代码:

还没有测试过,但这段代码似乎要进入Windows API以获取其GUID——我会尝试将其放入公共模块中,并在Excel单元格中键入
=GetGUId()
,以查看得到的结果。如果它在VB6中工作,则很有可能它也在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
私有类型GUID
数据1尽可能长
数据2作为整数
数据3作为整数
数据4(7)作为字节
端型
专用声明函数CoCreateGuid Lib“OLE32.DLL”(pGuid作为GUID)的长度为
作为字符串的公共函数GetGUID()
"(c)2000 Gus Molina
将udtGUID设置为GUID
如果(CoCreateGuid(udtGUID)=0),则
GetGUID=_
字符串(8-Len(十六进制$(udtGUID.Data1)),“0”)&十六进制$(udtGUID.Data1)和_
字符串(4-Len(十六进制$(udtGUID.Data2)),“0”)&十六进制$(udtGUID.Data2)和_
字符串(4-Len(十六进制$(udtGUID.Data3)),“0”)&十六进制$(udtGUID.Data3)和_
IIf((udtGUID.Data4(0)<&H10),“0”和十六进制$(udtGUID.Data4(0))和_
IIf((udtGUID.Data4(1)<&H10),“0”和十六进制$(udtGUID.Data4(1))&_
IIf((udtGUID.Data4(2)<&H10),“0”和十六进制$(udtGUID.Data4(2))&_
IIf((udtGUID.Data4(3)<&H10),“0”和十六进制$(udtGUID.Data4(3))&_
IIf((udtGUID.Data4(4)<&H10)、“0”、“0”)&Hex$(udtGUID.Data4(4))&_
IIf((udtGUID.Data4(5)<&H10)、“0”、“0”)&Hex$(udtGUID.Data4(5))和_
IIf((udtGUID.Data4(6)<&H10)、“0”、“0”)&Hex$(udtGUID.Data4(6))和_
IIf((udtGUID.Data4(7)<&H10),“0”和十六进制$(udtGUID.Data4(7))
如果结束
端函数
谢谢Gus Molina


如果这段代码有效(我不怀疑这一点),我认为每当对函数求值时,就会得到一组新的GUID,这意味着每次计算工作表时——例如,在保存工作簿时。如果需要GUID供以后使用,请确保复制特殊值。。。这有点可能。

我在v.2013 excel vba中使用了以下函数来创建GUID,并且运行良好

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

如果要将记录插入数据库中,可以使用这种方法创建GUID

这可能是最简单、最容易实现的方法,因为在使用内置SQL函数时,不需要复杂的
VBA
函数

该语句使用
NewID()

语法如下:

INSERT INTO table_name (ID,Column1,Column2,Column3)
VALUES (NewID(),value1,value2,value3) 
strSql = "INSERT INTO table_name " _
       & "(ID,Column1,Column2,Column3) " _
       & "VALUES (NewID(),value1,value2,value3)"
VBA
语法中,它如下所示:

INSERT INTO table_name (ID,Column1,Column2,Column3)
VALUES (NewID(),value1,value2,value3) 
strSql = "INSERT INTO table_name " _
       & "(ID,Column1,Column2,Column3) " _
       & "VALUES (NewID(),value1,value2,value3)"
如果需要连接值,只需将其视为字符串,并像通常对SQL语句那样连接

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

我最近在一些vba代码中使用CreateObject(“Scriptlet.TypeLib”)时遇到了问题

因此,基于NekojiruSou excel函数编写了以下内容,这些内容应该可以在没有任何特定excel函数的情况下工作。这可用于在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://stackoverflow.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
公共函数Get_NewGUID()作为字符串
'返回长度为36个字符的GUID字符串
随机化
将r1a调暗至相同长度
将r1b调暗为长
暗r2一样长
尺寸r3与长度相同
暗r4与长r4相同
暗r5a与长r5a一样
将r5b变长
尺寸为r5c,长度为
'randomValue=CInt(数学下限((上限-下限+1)*Rnd())+lowerbound
r1a=介于(065535)之间的随机数
r1b=介于(065535)之间的随机数
r2=0,65535之间的随机数
r3=RandomBetween(1638420479)
r4=随机数(3276849151)
r5a=介于(065535)之间的随机数
r5b=介于(065535)之间的随机数
r5c=介于(065535)之间的随机数
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))
端函数
公共功能楼层(ByVal X为双精度,可选ByVal系数为双精度=1)为双精度
“发件人:http://www.tek-tips.com/faqs.cfm?fid=5031
'X是要舍入的值
'因子是要舍入的倍数
楼层=整数(X/系数)*系数
端函数
公共函数RandomBetween(ByVal StartRange为Long,ByVal EndRange为Long)为Long
"基于https://msdn.microsoft.com/en-us/library/f7s023d2(v=vs.90).aspx
'randomValue=CInt(数学下限((上限-下限+1)*Rnd())+lowerbound
RandomBeween=CLng(地板((端距-开始传输+1)*Rnd())+开始传输
端函数
公共函数PadLeft(文本作为变量,总长度作为整数,padCh
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
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
'Generates a guid, works on both mac and windows 
Function Guid() As String
    Guid = RandomHex(3) + "-" + _
        RandomHex(2) + "-" + _
        RandomHex(2) + "-" + _
        RandomHex(2) + "-" + _
        RandomHex(6)
End Function

'From: https://www.mrexcel.com/forum/excel-questions/301472-need-help-generate-hexadecimal-codes-randomly.html#post1479527
Private Function RandomHex(lngCharLength As Long)
    Dim i As Long
    Randomize
    For i = 1 To lngCharLength
        RandomHex = RandomHex & Right$("0" & Hex(Rnd() * 256), 2)
    Next
End Function
' UUID Version 4 (random)
Function GetUUID4()

    Dim guid As String
    Dim i As Integer
    Dim r As Integer
    
    guid = ""
    Randomize
    
    For i = 0 To 31
        ' random digit 0..15
        r = Rnd() * 15

        ' add dash separators
        If (i = 8) Or (i = 12) Or (i = 16) Or (i = 20) Then guid = guid & "-"

        ' uuid4 version info in 12th and 16th digits
        If (i = 12) Then r = 4
        If (i = 16) Then r = (r And 3 Or 8)

        ' add as hex digit
        guid = guid & Hex(r)
    Next i

    GetUUID4 = guid
End Function
Private Function getGUID() As String
  getGUID = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"
  getGUID = Replace(getGUID, "y", Hex(Rnd() And &H3 Or &H8))
  Dim i As Long: For i = 1 To 30
    getGUID = Replace(getGUID, "x", Hex$(CLng(Rnd() * 15.9999)), 1, 1)
  Next
End Function