Пользовательская функция Excel оценивается как ноль, если открыта другая книга

Я создал пользовательскую функцию (UDF) в Excel VBA, которая извлекает содержимое из двух столбцов и оценивает результат. Пользовательская функция вычисляется правильно, если другие рабочие книги не открыты, но изменяется на ноль, когда одновременно открываются любые другие рабочие книги. Я думаю, что проблема в первых нескольких шагах, где я прочитал ввод:

Set Sheet = ThisWorkbook.Worksheets(inputSheet)
For i = 0 To numrows
    array_multi(i, 0) = Cells(inputRow1 + i, inputCol1)
    array_multi(i, 1) = Cells(inputRow2 + i, inputCol2)
Next

Может ли кто-нибудь помочь мне решить проблему здесь? Дайте мне знать, если вам нужна дополнительная информация.


person umm    schedule 03.07.2016    source источник
comment
Разместите полностью UDF.   -  person chris neilsen    schedule 03.07.2016
comment
Cells() должны быть указаны на листе, где они должны быть, иначе значения будут считаны в файле Activesheet.   -  person Patrick Lepelletier    schedule 04.07.2016


Ответы (2)


В своем коде вы используете Лист, который вы никогда не используете при присвоении значений вашему массиву.

Set Sheet = ThisWorkbook.Worksheets(inputSheet)
array_multi(i, 0) = Cells(inputRow1 + i, inputCol1)
array_multi(i, 1) = Cells(inputRow2 + i, inputCol2)

Попробуйте использовать Sht.Cells, чтобы убедиться, что ваш массив считывает значения из правильного листа и книги.

Set Sht = ThisWorkbook.Worksheets(inputSheet)
For i = 0 To numrows
    array_multi(i, 0) = Sht.Cells(inputRow1 + i, inputCol1)
    array_multi(i, 1) = Sht.Cells(inputRow2 + i, inputCol2)
Next
person Shai Rado    schedule 03.07.2016
comment
Я думал, что ThisWorkbook предназначен специально для того, чтобы не принимать разные значения, но всегда быть рабочей книгой, в которой находится код. - person arcadeprecinct; 03.07.2016
comment
@arcadeprecinct вы правы, просто нужно исправить ссылку на объект Sht - person Shai Rado; 03.07.2016
comment
ах, я пропустил отсутствующую ссылку на лист в следующих строках. Итак, проблема в том, что ActiveSheet, который используется Cells, меняется. - person arcadeprecinct; 03.07.2016
comment
@arcadeprecinct не стесняйтесь +1 :) - person Shai Rado; 03.07.2016
comment
Ваше решение, вероятно, правильное решение, но меня не убеждает объяснение - person arcadeprecinct; 03.07.2016
comment
@arcadeprecinct Если объявлению Cells() не назначен конкретный справочный лист (например, Sht.Cells()), он будет автоматически назначен активному листу, что может вызвать любое количество проблем. Эта проблема чаще всего возникает при использовании команды Worksheet.Range(), где диапазон заполняется ячейками. Несмотря на то, что диапазон был назначен рабочему листу, последующие объявления ячеек будут назначены активному листу, что приведет к ошибке, поскольку диапазон не может быть определен ячейками на другом листе. - person RGA; 04.07.2016
comment
@RGA да, я знаю, моя проблема заключалась в том, что изначально говорилось, что ThisWorkbook меняется в зависимости от того, что активно. - person arcadeprecinct; 04.07.2016

Объект Cells ссылается на ActiveWorkbook.ActiveSheet, если не указано иное. Вы могли бы использовать

With ThisWorkbook.Worksheets(inputSheet)
    For i = 0 To numrows
        array_multi(i, 0) = .Cells(inputRow1 + i, inputCol1)
        array_multi(i, 1) = .Cells(inputRow2 + i, inputCol2)
    Next i
End With  

Поскольку ответ Шая на 100% правильный, пожалуйста, примите его ответ и поддержите его.

person user1016274    schedule 03.07.2016