Динамическая область печати MS Excel

#vba #excel

#vba #excel

Вопрос:

Я хочу создать динамическую область печати в Excel 2010, которая будет состоять из двух диапазонов ячеек.

Например, первый диапазон ячеек A1:J50 равен, а второй диапазон равен A100:J150 . Они должны печататься на двух страницах, игнорируя ячейки, которые находятся между этими двумя диапазонами.

Четыре ячейки, показанные в приведенных выше примерах диапазонов, должны быть динамическими, а не жестко запрограммированными как простые диапазоны Print_Area. Поэтому в моем рабочем листе я использовал ячейки AA1 , AB1 , AC1 и AD1 для хранения значений "A1" , "J50" , "A100" и "J150" соответственно.

(Ячейки AA1, AB1, AC1 и AD1 фактически используют формулы для определения того, какой адрес ячейки будет использоваться, но для этого вопроса давайте просто предположим, что значения установлены, как указано выше).

Затем я использовал диспетчер имен и ввел следующую формулу в поле Print_Area:

 =INDIRECT(Sheet1!$AA$1):INDIRECT(Sheet1!$AB$1);INDIRECT(Sheet1!$AC$1):INDIRECT(Sheet1!$AD$1)
  

Результат этой формулы — это именно то, что мне нужно, и он действительно работает при первой печати диапазонов. Однако, как только я это сделал, Excel автоматически заменяет формулу фактическим диапазоном ячеек, который был вычислен. Поэтому, когда я проверяю область печати в диспетчере имен после печати один раз, она содержит что-то вроде:

 =Sheet1!$A$1:$J$50,Sheet1!$A$100:$J$150
  

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

Ответ №1:

Я протестировал это, и, похоже, это сработало.

Создайте новое имя с именем Test и установите его значение равным (обратите внимание, что я использовал запятую, а не точку с запятой, которая у вас была. У меня установлен язык США)

 =INDIRECT(Sheet1!$AA$1):INDIRECT(Sheet1!$AA$2),INDIRECT(Sheet1!$AA$3):INDIRECT(Sheet1!$AA$4)  
  

Задайте для вашего имени Print_Area значение

 =TEST
  

Удачи!

Редактировать

Для меня это работает, но кажется ненужным. Я просто попытался воспроизвести проблему и не смог. Когда у меня для Print_Area установлена формула с КОСВЕННЫМ, она не заменяется после печати.

Посмотрите этот связанный файл. https://www.dropbox.com/s/pgm0iv19u6igdm5/Book1.xlsx

Комментарии:

1. Вы тоже пытались выполнить печать во второй раз? Я действительно попробовал именно то, что вы предложили мне, но с тем же результатом. Это сработало только один раз, а затем формула (в данном случае тест имени) заменяется фактическим диапазоном, который был вычислен.

2. Да, сделал. Я напечатал, изменил значения ячеек, визуально увидел, что диапазон изменился, напечатал снова, и он захватил новый диапазон. «ТЕСТ» по-прежнему имеет КОСВЕННУЮ формулу. (Запуск Excel 2010, все исправлено)

3. Спасибо, у ТЕСТА тоже есть КОСВЕННАЯ формула с моей стороны, но имеет ли ваша область печати ТЕСТ, установленный после второго раза? Я бы предположил, что, поскольку вы увидели, что диапазон визуально изменился, ответ будет «да», что указывает на то, что с моей установкой Excel 2010 что-то не так (хотя я попробовал это с Excel 2007 и получил ту же проблему).).

4. Спасибо за отправку файла. Я немного поиграл с диапазонами, вводящими разные значения ячеек, и получил несколько неоднозначных результатов. Я попытаюсь разобраться в этом и вернусь со своими выводами. Хотя мне все еще кажется, что это какая-то проблема с установкой.

5. Что ж, загруженный мной рабочий лист работал безупречно с различными диапазонами, которые я ввел, оставив меня в некотором замешательстве. Единственное различие, которое я смог найти (между вашим листом и моим), заключалось в том, что содержимое для печати было на листе, а ячейки, используемые в формуле, на другом (в моем случае все было на одном листе). Так что, я думаю, сейчас я просто буду использовать ячейки на другом листе для моей формулы Print_Area. У меня мало времени, поэтому, к сожалению, я не могу продолжать экспериментировать с воссозданием проблемы. Еще раз спасибо, Кен, ты спасаешь жизнь!