Как получить значение ячейки из другого листа и присвоить его возвращаемому значению UDF? - PullRequest
1 голос
/ 22 сентября 2011

Вот небольшой пример моих двух рабочих листов.

Исходный лист :

Original Sheet

Как видите, в этом рабочем листе есть две ячейки, ожидающие пересчета на более позднем этапе.(т.е. ячейки с красным маркером #Eval)

Таблица результатов :

Result Sheet

В приведенной выше таблице результатов мы получили два результата, Клубника и персик соответственно.Эти два результата подготовлены для двух ячеек #Eval и должны заменить маркер #Eval.

Обратите внимание, что #Eval фактически возвращается UDF, указывая на то, что эту ячейку необходимо пересчитать.Пересчет будет инициирован вручную нажатием кнопки или чего-то еще.

Также обратите внимание, что позиция отображается на двух листах - если #Eval находится в ячейке A3, то также будет отображаться результат вЯчейка A3 в таблице результатов также.

Итак, моя основная задача - заменить ячейку #Eval на соответствующий результат.Но у меня проблемы с передачей результатов в мой UDF - я не знаю, как программно получить ссылку / адрес ячейки, которая в настоящее время пересчитывается.

Ниже приведен код, который я получил в настоящее время, и я не думаю, что он был реализован правильно.Кто-нибудь может помочь?Или есть другой способ реализовать это?

Заранее спасибо.

//assign value from result sheet back to result variable 
private string getResultFromResultSheet(Excel.Worksheet originalSheet, Excel.Worksheet resultSheet)
{
    string DataResult = null;            

    //Excel.Range resultSheetRange = resultSheet.UsedRange;
    //string addresse = resultSheetRange.get_Address(Type.Missing, Type.Missing, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing);

    Excel.Range originalSheetRange = originalSheet.UsedRange;  //<= I think it's incorrect here
    string os_currentAddress = originalSheetRange.get_Address(Type.Missing, Type.Missing, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing);

    Excel.Range currentRRange = null;

    currentRRange = resultSheet.get_Range(os_currentAddress, Type.Missing);
    if (currentRRange != null)
    {
        DataResult = currentRRange.Text;

    }
    return DataResult;
}

Ответы [ 2 ]

2 голосов
/ 22 сентября 2011

Лично я бы переосмыслил и написал ваш UDF так, как Excel ожидает, что UDFS будет:

  • передать ВСЕ данные из ячеек в ваш UDF в качестве параметров (если вы этого не сделаете, Excel не знает, когда нужно пересчитать ваш UDF, и вам придется сделать UDF изменчивым, что является ПЛОХОЙ ИДЕЕЙ)
  • UDF должен вернуть свой результат (ы) в ячейку (и), которую он занимает
  • как говорит Говерт: если вам нужен объект диапазона для ячеек, который занимает UDF (обычно для определения размеров диапазона вызова), вы можете использовать Application.Caller
  • не используйте .Text (который дает вам отформатированный результат ячейки, который зависит от того, что пользователь делает и может содержать ###), используйте вместо него .Value2

Тогда ваш UDF на исходном листе = DataResult (ResultSheet! A1)

Если этот подход не подходит для вашей общей задачи, вам, вероятно, нужно создать макрос C #, который вызывается неким UDF, а каким-либо триггером или кнопкой события.

1 голос
/ 22 сентября 2011

Вызов Application.Caller из вашего UDF вернет объект Range для вызывающей ячейки.Ваш UDF может затем прочитать данные из соответствующего местоположения на другом листе.

...