Как установить значение для диапазона, используя функцию из модуля в Excel VBA? - PullRequest
0 голосов
/ 23 апреля 2010

я хочу сделать простую функцию в модуле в Excel VBA, так что я могу использовать его в качестве пользовательской функции в Excel. (я использую Excel 2003 или 2007, это не имеет значения)

Я создаю функцию (!) В новой книге, и она выглядит так:

Function a()
    Sheets(1).Range("A1").Value = 4
end function

но когда я пытаюсь использовать его на листе1, это не сработает! Я перепробовал много вещей.

как я могу заставить это работать (без обходных путей, я хочу использовать это как пользовательскую функцию)?

пожалуйста, помогите. Спасибо, gadym

Ответы [ 3 ]

4 голосов
/ 23 апреля 2010

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

Вот простая функция, добавленная к модулю в VBA:

Public Function testFunction(inputValue As Integer) As Integer

    testFunction = inputValue * 2

End Function

Это можно использовать в любой формуле ячейки.Например, =testFunction(4) или =testFunction(A5).

РЕДАКТИРОВАТЬ

Хорошо, просмотрите комментарий, который вы сделали против ответа гитариста.Формула может отправить ответ только в ячейку, в которой она находится, - она ​​не может отправить ответ в другую ячейку.Поэтому, если формула является вашим единственным выбором, в ячейке A1 должна быть формула, которая считывает входные данные из C1 .

Формула в A1:

=a(C1)

Функция в модуле:

   Public Function a(string col)
       a = iif(col = "ok", "1", "2")
   End Function

Однако, если возникла проблема с вводом формулы в A1 , у вас останется процесс, управляемый вручную (кнопка листа,кнопка на панели инструментов и т. д., чтобы выдвинуть эти значения) или событие изменения ячейки рабочего листа.Недостатком события рабочего листа является то, что оно запускает каждое изменение ячейки, поэтому вам нужно держать код легким и не выполнять какую-либо тяжелую работу - или, если вы это сделаете, делать это редко.

Вы бы добавилиновая подпрограмма к рабочему листу:

Private Sub Worksheet_Change(ByVal Target As Range)

Запускается при изменении ячеек;измененные ячейки обозначены диапазоном Target.Ваш код обновит ячейки столбца A, если в Target содержатся ячейки столбца C.Это больше работы, чем подход на основе формул, но он делает процесс полностью автоматическим.У меня нет доступа к Excel прямо сейчас, поэтому следующее только из памяти и фрагментов Googled, не проверенных:

For Each cCell In Application.Intersect(Target, Me.Range("C1:C5"))
   cCell.Offset(, -2).Value = iif(cCell.Value = "ok", "1", "2")

Я бы предпочел не использовать явные диапазоны, а именованный диапазон, так как это делает ваш код менеехрупкий, чтобы измениться.Но это сделало бы поиск соответствующей ячейки столбца A более сложным для определения, и я не собираюсь пытаться использовать этот код без Excel =)

1 голос
/ 23 апреля 2010

Похоже, вы пытаетесь программно изменить значение ячейки в вашей электронной таблице. Это можно сделать, но, как отметил Джоэл Гудвин, этого нельзя сделать с помощью «определяемой пользователем функции». Однако вы можете сделать это с помощью макроса или добавив кнопку на лист и поместив код в кнопку.

Например, добавьте кнопку на лист, перейдя в меню «Просмотр»> «Панели инструментов»> «Панель инструментов управления» (это будет отличаться для более новых версий Excel), выбрав элемент управления кнопки и добавив его на свой лист. Как только кнопка добавлена, дважды щелкните по ней. Это должно вызвать редактор Visual Basic. Поместите ваш код в тело Sub, которое он предоставляет, например:

Private Sub CommandButton1_Click()
  Sheets(1).Range("A1").Value = 4
End Sub

Вернитесь на свой рабочий лист и отключите режим дизайна на панели инструментов управления (это значок с голубым треугольником внутри). При отключенном режиме дизайна нажмите кнопку, и значение ячейки A1 изменится на 4.

0 голосов
/ 23 апреля 2010

Если ячейка A1 содержит формулу = a (), и вы хотите, чтобы A1 отображал 4 (или любую другую ячейку с формулой = a () в ней), вам нужно изменить код на:

Function a()
    a = 4
End Function
...