Дублирование именованных диапазонов между книгами приводит к путанице в пользовательских функциях - PullRequest
0 голосов
/ 05 августа 2009

Я немного запутался в области именованных диапазонов в Excel. У меня есть две версии книги Excel. Иногда пользователям необходимо скопировать данные из более старой версии рабочей книги в более новую версию. В большинстве вычислений ячеек используются некоторые пользовательские функции VBA. Каждая из этих функций просматривает около 4-12 именованных диапазонов на листе. Казалось, это работает хорошо ... Однако недавно я обнаружил, что когда две версии файла открыты, ссылки VBA на все именованные диапазоны возвращают значения только из первого файла, который был открыт (так что, если более новая версия форма была открыта первой, тогда более старая версия будет действовать так, как будто некоторые данные получены из новой версии! Именованные диапазоны из второго файла, похоже, игнорируются вторым файлом, по крайней мере, в коде VBA, пока оба файла остаются открытыми. Если я закрою книгу, которая была открыта первой, вторая вычислится правильно.

Я нашел частичное исправление: вместо этого:

Blah = Range("valueXYZ").Value

Я делаю это вместо:

Blah = ThisWorkbook.Names("namedCellXYZ").RefersToRange.Value

Это прекрасно работает, но только на новой версии рабочей книги. Я не могу обновить код VBA в старой версии рабочей книги. Это означает, что если клиенты открывают старую версию после того, как новая версия уже открыта (то есть обе они открыты, но старая была открыта второй), старая версия будет получать значения и именованные диапазоны из более новой версии - и при этом сообщайте о неправильных числах и диапазонах. Это плохо. Мне нужен хороший способ предотвратить доступ старого листа к именованным диапазонам из нового, но я могу изменить только новый. Единственное, о чем я могу думать, это переименовать все именованные диапазоны и обновить большую часть кода VBA в новой версии - что-то, что подвержено ошибкам и звучит как чрезмерная работа.

Есть предложения? Например, можно ли хотя бы показать пользователю предупреждение при открытии второго файла? Или можно использовать VBA для ограничения области именованных диапазонов? Есть еще идеи?

Ответы [ 2 ]

1 голос
/ 05 августа 2009

Вы можете попробовать обработать событие WorkbookOpen в окне кода ThisWorkbook. Когда новая версия рабочей книги открыта, вы можете просмотреть все открытые рабочие книги и посмотреть, есть ли какие-либо старые версии в списке. Если да, предупредите пользователя, что значения в более старой версии электронной таблицы могут быть неверными, поскольку данные считываются из более новой версии.

0 голосов
/ 05 августа 2009

[Изменить]

В этом подпункте будет указано, есть ли у вас дублированные именованные диапазоны в открытых книгах. Как сказал DanThMan, вы можете обратиться к нему в объектном модуле ThisWorkbook:

Sub CheckRangeDups()
    Dim wb As Workbook
    Dim nm As Name
    Dim count As Integer, i As Integer
    Dim arrNm() As String
    Dim dup As Boolean
    Dim rngChk As Range

    ReDim arrNm(0)
    'cycle through workbooks'
    For Each wb In Workbooks
        'cycle through names in workbook'
        For Each nm In wb.Names
            'check if name refers to a range'
            On Error Resume Next
            Set rngChk = Nothing
            Set rngChk = nm.RefersToRange
            On Error GoTo 0
            If Not rngChk Is Nothing Then
                dup = False
                'check if name in array of names'
                For i = 0 To UBound(arrNm)
                    If nm.Name = arrNm(i) Then
                        MsgBox "Named range " & nm.Name & " duplicated."
                        dup = True
                        Exit For
                    End If
                Next i
                'if not then add it'
                If Not dup Then
                    arrNm(count) = nm.Name
                    count = count + 1
                    ReDim Preserve arrNm(count)
                End If
            End If
        Next nm
    Next wb
End Sub

[/ Edit]

Если я вас правильно понял, то полное уточнение ваших ссылок на диапазоны решит вашу проблему. Пример: с двумя открытыми файлами с именами file1 и file2, назовите ячейку A1 на листе 1 «arange» в обоих файлах. В file1 введите «file1» в ячейку, в file2 введите «file2» в ячейку. Теперь запустите это:

Sub whichRange()
    Dim f1 As Workbook, f2 As Workbook
    Set f1 = Workbooks("file1.xls")
    Set f2 = Workbooks("file2.xls")
    Dim s1 As Worksheet, s2 As Worksheet
    Set s1 = f1.Worksheets(1)
    Set s2 = f2.Worksheets(1)

    Dim r1 As Range, r2 As Range
    Set r1 = s1.Range("arange")
    Set r2 = s2.Range("arange")

    Debug.Print "WB: "; f1.Name; " cell: "; r1.Name; " contents: "; r1
    Debug.Print "WB: "; f2.Name; " cell: "; r2.Name; " contents: "; r2
End Sub

Полная квалификация позволяет Excel знать, на что вы ссылаетесь.

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