#excel #vba #function
Вопрос:
Здравствуйте, я очень новичок в VBA, поэтому, пожалуйста, простите мое невежество. Я пытаюсь создать функцию, которая, если ячейка не пуста, напечатает(на принтере) выбранный диапазон. Он не будет распечатан на принтере, но вернет мое окно сообщения и строку. Я что-то здесь упускаю?
- Ячейка a1 = ‘88888’
- Ячейка b1 = PrintSelectedArea1(A1) ; возвращает «Напечатанная метка» и поле msg, но не печатает выделенный элемент.
- Ячейка a2 = пуста
- ячейка b2= PrintSelectedArea1(A2) ; возвращает «Не напечатано»
Я добавил этот код в новый модуль:
Public Function PrintSelectedArea1(r As Range) As String If Not IsEmpty(r.Value) Then Worksheets("Label").Range("A1:F13").PrintOut PrintSelectedArea1 = "Label Printed" MsgBox ("Printed") Else PrintSelectedArea1 = "Not Printed" End If End Function
Комментарии:
1. Как вы называете свою функцию?
2. Обратите внимание, что его невозможно использовать
.PrintOut
в пользовательской функции (UDF), которая используется в качестве формулы в ячейке. Это не поддерживается Excel! UDFS не могут манипулировать другими ячейками, не могут создавать окна сообщений и не могут печатать. Единственное, что может сделать UDF, — это принять параметры в качестве входных данных и вернуть значение в ячейку, которая его вызвала.
Ответ №1:
Для выполнения действий вам необходимо использовать a Sub
. вы можете передавать аргументы вспомогательному элементу, но у него нет возвращаемого значения.
Sub PrintSelectedArea1() Worksheets("Label").Range("A1:F13").PrintOut End Sub
Следующее будет искать изменение значения в ячейке B2 Если B2 изменится на значение 1, PrintSelectedArea()
будет вызван вызов. Вставьте этот код в рабочий лист, который вы используете.
Private Sub Worksheet_Change(ByVal Target As Range) If Not Application.Intersect(Target, Range("B2")) Is Nothing Then If Sheets("Label").Range("B2").Value = 1 Then Call PrintSelectedArea() Else MsgBox ("Not printed") End If End If End Sub
Комментарии:
1. Разве эта строка кода не та же самая, которую уже использует операция?
2. @braX Да, но в подстроке это работает, в функции-нет.
3. Хорошо, может быть, вы также можете объяснить, почему в своем ответе?
4. Могу ли я вызвать суб в виде формулы ячейки? Я хочу распечатать выделение, если ячейка, на которую я ссылаюсь (пример PrintSelectedArea1(A2)), не пуста.
5. @aconti74 Я отредактировал свой ответ, чтобы показать, как функция может быть вызвана в результате изменения значения в ячейке. К счастью, это невозможно сделать с помощью пользовательской функции в ячейке, если бы вы могли это сделать, она печаталась бы каждый раз, когда функция обновлялась.