У меня есть макрос, который я использую, которому более 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
On Error Resume Next
, затем проверьте еще раз, возникает ли ошибка, если да, то какая ошибка и какая строка ее вызывает. - person David Zemens   schedule 23.02.2015