Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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 这个代码会重复一个值吗?我需要一个永远不会重复并且不需要存储变量的数字_Vba_Excel - Fatal编程技术网

Vba 这个代码会重复一个值吗?我需要一个永远不会重复并且不需要存储变量的数字

Vba 这个代码会重复一个值吗?我需要一个永远不会重复并且不需要存储变量的数字,vba,excel,Vba,Excel,希望生成一个唯一的值来保存报价订单,从而方便召回。除了在1秒内单击外,此数字还会重复吗 idNumber = Application.Worksheetfunction.Roundup(DateValue(Now) * TimeValue(Now),0) 你的公式是多余的。您只需要: idNumber=Application.Worksheetfunction.Roundup(日期*时间,0) 是的,有可能会重演。日期是长整数;1899年12月31日后每天1次。时间是日期的小数部分;e、 中午

希望生成一个唯一的值来保存报价订单,从而方便召回。除了在1秒内单击外,此数字还会重复吗

idNumber = Application.Worksheetfunction.Roundup(DateValue(Now) * TimeValue(Now),0)
你的公式是多余的。您只需要:
idNumber=Application.Worksheetfunction.Roundup(日期*时间,0)

是的,有可能会重演。日期是长整数;1899年12月31日后每天1次。时间是日期的小数部分;e、 中午是0.5。今天(2018年8月31日)下午4:00是43343.667

因此,如果你将一个整数乘以一个小数,然后四舍五入到最接近的整数,那么明天就会有一个时间(即小数点)可以乘以匹配的日期

'today at noon (rounded up)
43343 * 0.5 = 21671.5 = 21672
'tomorrow at noon (rounded up)
43344 * 0.5 = 21672 = 21672
即使没有四舍五入,日期*时间也有可能重复;单面四舍五入的可能性要大得多


除了基本十进制数乘以整数复制数之外,更改公式返回的值似乎需要大约2秒钟的时间。2秒内的任何两个事件都有产生重复事件的高风险。

是的,由于舍入,该数字可能会重复。
TimeValue
始终是一个浮点数,小数点右侧为0(小数日)。因此,你基本上是把一天除以时间。值接近午夜时,开始接近除数1。例如,
23:55:55
.9971643519
。今天的
DateValue
43343
。如果将两个值相乘并四舍五入,将得到
43220
,即2018年4月30日的
23:59:59

如果您需要从“timestamp”中获取唯一的整数值,最好只需获取基础日期\时间值,并按适当的精度对其进行缩放。VBA
Date
只是一个
Double
,其中“DateValue”部分为整数部分,“TimeValue”位于小数点右侧。如果您的唯一值需要高水平的精度,您可能希望偏移到新的纪元日期,这样您就不会冒着快速溢出的风险。例如,2018年1月1日是43101,因此您可以通过减去43101将“内部纪元”设置为:

Public Function GetNumberFromTimestamp() As Long
    Dim current As Double
    current = CDbl(Now())
    'Set to a custom epoch
    current = current - 43101
    'Scale by whatever precision you need.
    GetNumberFromTimestamp = current * 1000000
End Function

根据您的实际需要,唯一值可能不需要是
Long
整数;如果是这样,那么最好知道Windows有一种生成它们的内置方式(在OLE32.DLL中),您可以利用它生成全局唯一标识符:

私有类型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))
如果结束
端函数


如果两个值发生碰撞

我使用字符串作为ID而不是数字,因为您不需要对ID进行算术运算

然而,一种简单的基于时间的ID方法是科学的反向日期方法。精度级别取决于您的需要。对于以下示例,今天是2018年9月1日,时间是1655(24小时制)35秒

  • (1) 一天只有一天:年、月、日(例如180901,因为今天是九月一日)。如果你想让这些ID持续一个世纪以上,那么使用4位数的年份(2018年而不是18年)
  • (2) 每小时最多一次:(1)和小时(例如18090116)
  • (3) 每分钟最多一次:(2)和分钟(例如1809011655)
  • (4) 每秒最多一次:(3)秒(例如180901165535)
  • (5+)是的,你可以到几分之一秒

上述方案的优点是,ID可以按字母和数字顺序排序(只要与数据中ID的长度保持一致)。为了使粒度降低到一秒钟,您只需使用
格式(Now(),“yymddhhnss”)
命令来生成
字符串。如果您真的需要一个数字,您可以将其转换为长的,确信您只使用了数字。

谢谢您的输入。下面是我打算使用的唯一号码。这将达到我的目的。这个数字将每100年重复一次,或者在1秒之内重复一次,但这不应该成为我如何使用它的问题。sheetName位于userform的顶部

    If sheetName <> "" Then
Workbooks.Open "C:\Users\jschu\Desktop\price test\Quote_Database.xlsx"
Workbooks("Quote_Database.xlsx").Sheets(sheetName).Select

Else
Workbooks.Open "C:\Users\jschu\Desktop\price test\Quote_Database.xlsx" ' Open Quote Database file

idNumber = Format(Now, "YYMMDDHHSS") ' Generate unique #
sheetName = idNumber & " " & UserForm3.nameText
    With Workbooks("Quote_Database.xlsx") ' Finds the last sheet then adds a new sheet with the idnumber and customer name
        .Sheets.Add(After:=.Sheets(.Sheets.count)).Name = sheetName
    End With
End If
如果sheetName为“”,则
工作簿。打开“C:\Users\jschu\Desktop\price test\Quote\u Database.xlsx”
工作簿(“Quote_Database.xlsx”)。工作表(sheetName)。选择
其他的
工作簿。打开“C:\Users\jschu\Desktop\price test\Quote_Database.xlsx”'打开报价数据库文件
idNumber=格式(现在为“YYMMDDHHSS”)'生成唯一#
sheetName=idNumber&&&UserForm3.nameText
使用工作簿(“Quote_Database.xlsx”)查找最后一张工作表,然后添加一张带有ID号和客户名称的新工作表
.Sheets.Add(之后:=.Sheets(.Sheets.count)).Name=工作表
    If sheetName <> "" Then
Workbooks.Open "C:\Users\jschu\Desktop\price test\Quote_Database.xlsx"
Workbooks("Quote_Database.xlsx").Sheets(sheetName).Select

Else
Workbooks.Open "C:\Users\jschu\Desktop\price test\Quote_Database.xlsx" ' Open Quote Database file

idNumber = Format(Now, "YYMMDDHHSS") ' Generate unique #
sheetName = idNumber & " " & UserForm3.nameText
    With Workbooks("Quote_Database.xlsx") ' Finds the last sheet then adds a new sheet with the idnumber and customer name
        .Sheets.Add(After:=.Sheets(.Sheets.count)).Name = sheetName
    End With
End If