ExecuteExcel4Macro Error 2023 VBA
Function GetValueFromClosed(temp, temp2)
Dim arg, temp6 As String
Dim r As Byte
Worksheets("bd").Activate
m = m + 2
temp6 = Cells(m, 1).Value
Application.ScreenUpdating = False
For r = 1 To 9
a = Cells(r, 1).Address
arg = "'" & temp & "\[MIS." & temp6 & "." & temp2 & ".xls]Teller1'!" & _
Range(a).Range("A1").Address(, , xlR1C1)
GetValueFromClosed = ExecuteExcel4Macro(arg) 'Error2023
Next r
End Function
Помогите, пожалуйста. За 2 дня ...
Никакие мои манипуляции с Вашим кодом не заставили Excel выдать сообщение об ошибке с указанным номером (экспериментировал с Excel 2000). Макрос работает. В связи с этим хотелось бы увидеть текст сообщения об ошибке и узнать версию Вашего офиса.
Поиск по базе Microsoft тоже не дал ничего утешительного: описание ошибки с таким кодом нашлось для Visual FoxPro, но не для VBA. Впрочем, ошибка с таким же кодом характерна и для Windows. Так что может быть не офис виноват, а именно ОС.
Мои советы:
- упростите имя файла-донора (ошибка FoxPro, например, связана с невозможностью сопоставить расширение файла какому-либо приложению, а у Вас в имени файла целых 3 точки);
- попробуйте макрос на другой машине и/или другом офисе.
Кроме того, предлагаю некоторые сображения по поводу кода макроса:
1. Dim r As Byte заменил бы на Dim r As Integer;
2. Выражение Range(a).Range("A1").Address(, , xlR1C1) явно избыточно. Судя по контексту нужно Range(a).Address(, , xlR1C1).
3. Если значения расположены в одной строке, то Cells(r, 1) нужно заменить на Cells(1, r).
4. Если нужна сумма значений, то GetValueFromClosed = ExecuteExcel4Macro(arg) надо заменить на GetValueFromClosed = GetValueFromClosed + ExecuteExcel4Macro(arg). В противном случае функция вернёт только последнее значение, а не сумму.
Никакие мои манипуляции с Вашим кодом не заставили Excel выдать сообщение об ошибке с указанным номером (экспериментировал с Excel 2000). Макрос работает. В связи с этим хотелось бы увидеть текст сообщения об ошибке и узнать версию Вашего офиса.
Поиск по базе Microsoft тоже не дал ничего утешительного: описание ошибки с таким кодом нашлось для Visual FoxPro, но не для VBA. Впрочем, ошибка с таким же кодом характерна и для Windows. Так что может быть не офис виноват, а именно ОС.
Мои советы:
- упростите имя файла-донора (ошибка FoxPro, например, связана с невозможностью сопоставить расширение файла какому-либо приложению, а у Вас в имени файла целых 3 точки);
- попробуйте макрос на другой машине и/или другом офисе.
Кроме того, предлагаю некоторые сображения по поводу кода макроса:
1. Dim r As Byte заменил бы на Dim r As Integer;
2. Выражение Range(a).Range("A1").Address(, , xlR1C1) явно избыточно. Судя по контексту нужно Range(a).Address(, , xlR1C1).
3. Если значения расположены в одной строке, то Cells(r, 1) нужно заменить на Cells(1, r).
4. Если нужна сумма значений, то GetValueFromClosed = ExecuteExcel4Macro(arg) надо заменить на GetValueFromClosed = GetValueFromClosed + ExecuteExcel4Macro(arg). В противном случае функция вернёт только последнее значение, а не сумму.
Операционная система - Windows 2000, Офис тот же. К сожалению, версию поменять не могу, здесь все такие =)
Пробовала с точками, без точек - не помогает. С помощью Watches увидела, что значение переменной GetValueFromClosed = Error 2023, а в соответствующей ячейке высвечивается #Ref.Не ссумировала, GetValueFromClosed = GetValueFromClosed + ExecuteExcel4Macro(arg), выскакивает ошибка Type mismatch, а потому пыталась вначале хоть какое-то значение получить.
Вот список ошибок и их коды :
#ПУСТО! - 2000
#ДЕЛ/0! -2007
#ЗНАЧ! - 2015
#ССЫЛКА! - 2023
#ИМЯ! - 2029
#ЧИСЛО! - 2036
#Н/Д! - 2042
Однако если в некоторых ячейках всё же находятся числовые значения, то Вы можете воспользоваться нижеприведённым кодом :
Range(a).Address(, , xlR1C1)
iTemp = ExecuteExcel4Macro(arg)
If Not IsError(iTemp) Then
If IsNumeric(iTemp) Then
GetValueFromClosed = GetValueFromClosed + iTemp
End If
End If
Советы :
1) Уберите из Вашей пользовательской функции метод Activate. А вместо активации рабочего листа используйте инструкцию With или создайте об'ектную переменную с помощью инструкции Set
2) В начале программы поместите инструкцию On Error Resume Next
Примечание :
Я бы ещё добавил, что вот эта часть кода, довольно странная, так как в Вашем случае при запуске функции m всегда будет равно 2, во всяком случае если исходить из текста Вашей пользовательской функции. Конечно можно предположить, что переменная m у Вас об'явлена на уровне модуля, но повторюсь, ничто в коде на это не указывает.
m = m + 2
temp6 = Cells(m, 1).Value