Excel периодически падает при открытии сетевого файла / включении содержимого с помощью пользовательских функций - PullRequest
0 голосов
/ 06 ноября 2018

В нашей сети хранится файл, в котором хранятся запросы на номер детали. Этот файл распределяется между двумя отделами, которые, согласно ИТ, все обновляются в 64-разрядных версиях Excel.

Файл содержит несколько простых пользовательских функций, таких как ConcatUniq. Файл будет открываться и функционировать должным образом в течение нескольких недель, а затем случайно произойдет сбой при открытии или сбой при включении контента. Затем мы перестраиваем файл с нуля, он будет работать в течение нескольких недель, а затем снова выйдет из строя. Это широко используемые функции, и мы не верим, что сами функции вызывают проблемы.

Кроме того, у коллеги были проблемы с функцией ConcatUniq, которая возвращала правильные значения в некоторых строках, но возвращала ошибки #value в других строках. Для этого я создал отдельный лист с UDF ConcatUniq и цикл, который устанавливает формулы ячеек в качестве функции 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")

1 Ответ

0 голосов
/ 06 ноября 2018

Чтобы конкретизировать мои комментарии выше:

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

В моем тестировании с диапазоном одной области это примерно в два раза быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...