我在网络上存储了一个文件,其中包含零件号请求。该文件在两个部门之间共享,根据IT部门的说法,这些部门在64位版本的Excel上都是最新的。
该文件包含几个简单的用户定义函数,例如ConcatUniq。 该文件将一次打开并正常运行数周,然后随机将在打开时崩溃或在启用内容时崩溃。 然后我们从头开始重建文件,它将工作几周,然后再次崩溃。这些是广泛使用的功能,我们不认为这些功能本身是引起问题的原因。
此外,一位同事在ConcatUniq函数在某些行上返回正确值但在其他行上重新出现#value错误时遇到了问题。为此,我使用ConcatUniq UDF创建了一个单独的工作表,并创建了一个循环,该循环将单元格公式设置为ConcatUniq函数,并允许UDF逐步执行,同时打印范围内的每个值。
保存后再将其发送给同事进行测试,打开后它使Excel崩溃。我的仍然开得很好,但是在启用内容时崩溃了。这似乎是一个更大的问题,但尽管如此,有时文件崩溃,有时没有崩溃,有时UDF有效,有时却没有。
我们不确定这是否是Excel /加载项,我们的网络/防火墙参数或VBA本身存在的问题。我认为这不是任何编译器错误,因为这些函数确实可以在本地运行。用户在网络上保存这些文件后,似乎会发生此问题。
我希望获得有关在哪里寻找导致这些症状(Excel,网络/防火墙,VBA)的问题的指导。任何帮助将不胜感激!
根据要求:
Function ConcatUniq(ByRef rng As Range, _
ByVal myJoin As String) As String
Dim r As Range
Static dic As Object
If dic Is Nothing Then _
Set dic = CreateObject("Scripting.Dictionary")
For Each r In rng
dic(r.Value) = Empty
Next
ConcatUniq = Join$(dic.keys, myJoin)
dic.RemoveAll
End Function
'syntax = concatuniq(RANGE,"delimeter")
答案 0 :(得分:1)
充实我上面的评论:
Function ConcatUniq(ByRef rng As Range, ByVal myJoin As String) As String
Dim cl As Range, data, r As Long, c As Long, v
Static dic As Object
If dic Is Nothing Then Set dic = CreateObject("Scripting.Dictionary")
If rng.Areas.Count > 1 Then
For Each cl In rng.Cells
v = cl.Value
If Not IsError(v) Then dic(v) = Empty
Next
Else
data = rng.Value
For r = 1 To UBound(data, 1)
For c = 1 To UBound(data, 2)
v = data(r, c)
If Not IsError(v) Then dic(v) = Empty
Next c
Next r
End If
ConcatUniq = Join$(dic.keys, myJoin)
dic.RemoveAll
End Function
在我的单区域测试中,速度大约是以前的两倍。