Совместимость .AutoFilter между Excel 2007 и Excel 2010/13, когда задействованы даты, пример включен

У меня есть макрос, который я использую, которому более 5 лет, я впервые начал использовать его в 32-битном Excel 2007, но я больше не использую Excel 2007, вместо этого я использую Excel 2013, и этот макрос больше не работает правильно...

  • Запустите его в Excel 2007 с региональными настройками, установленными на Великобританию или США = работает отлично.
  • Запустите его в Excel 2010 или Excel 2013 с региональными настройками, установленными на Великобританию = не работает
  • Запустите его в Excel 2010 или Excel 2013 с региональными настройками, установленными на США = работает отлично

Проблема в том, что я британец, поэтому мои региональные настройки установлены на Великобританию.


Главный вопрос...

Как я могу сделать свой макрос совместимым, чтобы он мог работать с любыми региональными настройками ИЛИ, как я могу заставить макрос работать только с региональными настройками Соединенного Королевства (дата)...


Предполагается, что макрос сопоставляет два столбца с помощью автофильтров, чтобы найти совпадающие строки, а затем экспортирует данные с одного листа на другой лист. Я включил лист под названием "RUSHET (CORRECT)", который содержит то, как должен выглядеть вывод.

Скачать: https://www.dropbox.com/s/8edbk8rcp3qumfd/example.xlsm?dl=1

Рассматриваемый макрос:

Sub CROSSIMPORT()

    'Optimize'
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
        .DisplayAlerts = False
    End With

    Dim wsData As Worksheet:   Set wsData = Sheets("RASHEET")
    Dim wsList As Worksheet:   Set wsList = Sheets("RUSHEET")

    'Loads data into the array from wsList, column A to column E
    'In the beginning, columns B through E may be empty, that is fine
    Dim arrListVal As Variant: arrListVal = wsList.Range("b2", wsList.Cells(Rows.Count, "b").End(xlUp).Offset(0, 43)).Value

    Dim arrIndex As Long
    Dim rngFound As Range

    'Set Range for columns to check (both columns)
    With Intersect(wsData.UsedRange, wsData.Columns("B:C"))

        'UBound(arrListVal, 1) is the upper bound of the first dimension of the array
        'In other words, its the number of rows
        'We'll use arrIndex to go through each row
        'arrIndex starts at 1 because that's the LBound, we already set the array to go from A5 though, so no worries there
        For arrIndex = 1 To UBound(arrListVal, 1)
            'Turn AutoFilter off, test
            If .AutoFilter Then .AutoFilter
            'Filter first array (matching array column 1)
            .AutoFilter 1, arrListVal(arrIndex, 1)
            'Filter second array (matching array column 2)
            .AutoFilter 2, arrListVal(arrIndex, 2)
            On Error Resume Next

            'arrListVal(arrIndex, 1) = row arrIndex in column 1 of the array
            'Attempts to find that value in wsData, column A
            Set rngFound = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
            'Set rngFound = wsData.Columns("B").Find(What:=arrListVal(arrIndex, 1), LookAt:=xlWhole)

            'If it found something, then rngFound will not be nothing
            If Not rngFound Is Nothing Then
                'Found something, fills the other columns of the array
                arrListVal(arrIndex, 36) = wsData.Range("P" & rngFound.Row).Value    'wsList column C should be wsData column I
                arrListVal(arrIndex, 37) = wsData.Range("G" & rngFound.Row).Value    'wsList column D should be wsData column O
                arrListVal(arrIndex, 38) = wsData.Range("E" & rngFound.Row).Value    'wsList column E should be wsData column K
                arrListVal(arrIndex, 39) = wsData.Range("F" & rngFound.Row).Value
                arrListVal(arrIndex, 40) = wsData.Range("X" & rngFound.Row).Value
                arrListVal(arrIndex, 43) = wsData.Range("AF" & rngFound.Row).Value
                arrListVal(arrIndex, 44) = wsData.Range("AG" & rngFound.Row).Value
                'Sets rngFound back to nothing in order to continue the loop through the array
                Set rngFound = Nothing
            Else
            End If

        Next arrIndex

        'Turning Filter Off
        .AutoFilter
    End With

    wsList.Range("B2").Resize(UBound(arrListVal, 1), UBound(arrListVal, 2)).Value = arrListVal

    'De-Optimize'
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
        .DisplayAlerts = True
    End With

End Sub

person Ryflex    schedule 23.02.2015    source источник
comment
это не работает. ‹‹ Что это значит?   -  person David Zemens    schedule 23.02.2015
comment
@DavidZemens Он не экспортирует данные, даже когда должен. Итак, есть функция (.autofilter), которая несовместима с 2010 и более поздними версиями, но совместима с 2007.   -  person Ryflex    schedule 23.02.2015
comment
Это дает вам какую-либо ошибку?   -  person David Zemens    schedule 23.02.2015
comment
@DavidZemens Нет, он запускается и завершается, но ничего не делает; как в нем не находит совпадений.   -  person Ryflex    schedule 23.02.2015
comment
Избавьтесь от On Error Resume Next, затем проверьте еще раз, возникает ли ошибка, если да, то какая ошибка и какая строка ее вызывает.   -  person David Zemens    schedule 23.02.2015
comment
@DavidZemens Он говорит, что ячейки не найдены, вот пример, который я только что приготовил, я включил лист с тем, как должен выглядеть вывод, если вы запустите макрос в Excel 2010 или более поздней версии, он не ничего не меняйте, но если вы запустите его в Excel 2007, он будет похож на лист с пометкой правильно dropbox.com/s/8edbk8rcp3qumfd/example.xlsm?dl=0   -  person Ryflex    schedule 23.02.2015
comment
Единственный способ получить эту ошибку, используя Excel 2010, - это если лист уже отфильтрован, и в этом случае дополнительные фильтры, которые вы предоставляете в макросе, вызовут проблему отсутствия ячеек. Смотрите мой ответ ниже :)   -  person David Zemens    schedule 23.02.2015


Ответы (1)


Это работает, как и ожидалось, в Excel 2010. Я меняю выходной лист, чтобы быть уверенным:

введите здесь описание изображения

ОДНАКО, я могу создать ошибку, которую вы описываете, ЕСЛИ я пренебрегаю отключением автофильтра в начале цикла.

    For arrIndex = 1 To UBound(arrListVal, 1)
        '### Turn AutoFilter off, if it's already on:
        If .AutoFilter Then .AutoFilter

Поэтому перед запуском макроса убедитесь, что фильтр листа выключен. В противном случае вы получите нежелательный вывод (никакого вывода!), замаскированный вашим неправильным использованием On Error Resume Next.

Вот как это выглядит, когда я запускаю ваш код без изменений, за исключением удаления оператора On Error Resume Next:

введите здесь описание изображения

Единственный другой мод, который я сделал для вашего кода, - это две строки, которые выбирают один из диапазонов, с которыми у вас возникли проблемы:

wsList.Активировать wsList.Range("AK:AO").Выбрать

person David Zemens    schedule 23.02.2015
comment
Да, я вижу данные в этих столбцах. Но похоже, что это другая проблема, чем вы изначально заявили: Нет, он запускается и завершается, но ничего не делает; так как в нем не находит совпадений - person David Zemens; 24.02.2015
comment
это правда, ничего не делает. Помните, что исходный макрос экспортирует его в wsList, данные просто заменяются самими собой, а не помещают данные в столбцы, которые я только что упомянул. - person Ryflex; 24.02.2015
comment
Посмотрите это видео, это то, что он делает в Excel 2010 и 2013 для меня screencast.com/t/vOgo9Xjdo - person Ryflex; 24.02.2015
comment
Я вижу данные в AK:AO и AR:AS, но нет ни в AH:AJ, ни в AP:AQ. Вам нужно отладить это, вы прошлись по своему коду, чтобы увидеть, где он может дать сбой? Я сказал тебе избавиться от этого On Error Resume Next утверждения. Вы этого не сделали... так что это говорит о том, что вы не занимаетесь отладкой самостоятельно... Я не собираюсь вам помогать, если вы не обращаете внимания... - person David Zemens; 24.02.2015
comment
Я использую Excel 2010, и при тестировании он создает ДАННЫЕ в столбцах AK:AO и AR:AS. См. дополнительный скриншот выше, в котором я использовал ваш код. - person David Zemens; 24.02.2015
comment
Я пробовал как в 2010, так и в 2013 году, и это не работает для меня, могу ли я спросить, является ли ваш Excel 64-битным или 32-битным? - person Ryflex; 24.02.2015
comment
Давайте продолжим это обсуждение в чате. - person David Zemens; 24.02.2015