Распечатка функции Excel выберите диапазон, если он не пуст (не печатается)

#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 Я отредактировал свой ответ, чтобы показать, как функция может быть вызвана в результате изменения значения в ячейке. К счастью, это невозможно сделать с помощью пользовательской функции в ячейке, если бы вы могли это сделать, она печаталась бы каждый раз, когда функция обновлялась.