Всем чмоки в этом чатике Для экономии бумаги программно меняю ориентацию с альбомной на портретную и обратно. В портретной выходит 1 страница на печать, в альбомной - 2. Желательно печатать в альбомной, если одна страница, если их две - портрет.
Код
Sub pbreaks()
Dim sh As Worksheet
Set sh = Workbooks.Open("D:\АктСверки № 336 от 31-03-2022.xls", False, False).ActiveSheet
yyy = sh.VPageBreaks.Count
zzz = sh.HPageBreaks.Count
xxx = sh.PageSetup.Pages.Count
uuu = countp(sh.Name)
With sh.PageSetup
.Orientation = xlLandscape
.FitToPagesWide = 1
End With
yyy = sh.VPageBreaks.Count
zzz = sh.HPageBreaks.Count
xxx = sh.PageSetup.Pages.Count
uuu = countp(sh.Name)
sh.Parent.Close False
End Sub
Public Function countp(Tabx As String) As Long
countp = ExecuteExcel4Macro("Get.Document(50,""" & Tabx & """)")
End Function
Ни одна из величин xxx, yyy, zzz, uuu не меняется после поворота в xlLandscape. Если сделать превью печати или Файл - Печать, то величины обновляются. Application.PrintCommunication = False/True пробовал, принудительный пересчет Application.Calculate пробовал. Подскажите, куда копать?
Дано: 1) 24 значения некоторой величины (в строке 2 приложенного файла) - на каждый час. 2) Некоторый набор отчетных часов (в строке 5 файла). Значения могут повторяться, количество от 10 до 30.
Среди них интересуют уникальные, которые я получаю в строке 7. Уникальных может быть сколько угодно, от 1 до тех же 30 Для них в строке 8 подтягиваю значения из строки 2 и в ячейке Z8 нахожу максимум этих значений.
Хотелось бы сделать не так громоздко. Наверняка же можно какой-нить формулой массива без промежуточных вычислений? В приложенном файле расчет для одних суток, а этих суток на самом деле много. ЗЫ подписка на Office 365 не ожидается, поэтому МАКСЕСЛИМН непригодна от слова совсем. Сейчас стоит офис 2010, в скором будущем ожидается переход на 2016.
Всем привет! Наткнулся на хитровызащищенный файл. При обращении к проекту вылезает такое сообщение Запрос на ввод пароля к проекту не выдается. Как такое реализовано? Нашел файл тут: https://cloud.mail.ru/public/6eyi/xdu5Ynb2M
Привет всем! Есть таблица из 15 столбцов. Некоторые данные в таблице могут отсутствовать.Задача вытащить в отдельный столбец самое левое число. Что должно получиться - в столбце R (желтым) Вроде ПОИСКПОЗ должен справиться, но туплю что-то.
В разное время разные макросы открывают книгу, пишут туда данные и сохраняют ее. Запуск макросов зависит от времени суток, прихода почты, фаз луны и прочая. В процессе появляются следующие окошки:
Окошки отбирают фокус на себя, можно случайно нажать отмена, что собьет выполнение макроса. Размер книги 16 метров. Только данные, без формул. Уже стоит: Application.Visible = False Application.DisplayAlerts = False
Офис 2010. Книга с паролем на запись. Сделан пароль для того, чтобы разные макросы могли туда писать в любое время, а люди и другие макросы только читать. То бишь, чтобы книга была доступна на запись всегда. Если открывать с паролем - все ОК. Если открывать "только для чтения", то "Обнаружено содержимое которое не удалось прочитать". Если ответить "Да", то пытается открыть раз 5, но так и не открывает. Аналогично происходит с книгами, которые открываю из сообщений в аутлуке. Напрямую не открываются - "Обнаружено ...", стоит их вытащить (любым способом на любой диск) - нет проблем.
На другом компе, с таким же железом и софтом книги открываются хоть так, хоть так.
Дано: Офис 2010. В аутлук приходит письмо, по факту прихода запускается макрос, у которого есть строчка: Set WbIn = XLApp.Workbooks.Open(fName, False, True) На ней макрос говорит Runtime error 1004, метод Workbooks.Open Failed Если написать так: Set WbIn = XLApp.Workbooks.Open(fName) то все работает. О_о. Если написать так: Set WbIn = XLApp.Workbooks.Open(fName, UpdateLinks:=False, ReadOnly:=True), тоже валится. Внимание! Макрос верой и правдой работал ежедневно в течение лет трех(!), строка была с False, True), винда и офис не обновлялась. Почему оно вдруг сегодня перестало работать?
Возможно тут это уже было, но не могу не поделиться. Вдруг кому надо будет. Начну издалека Однажды мой офисный принтер внезапно напечатал анкету на визу в пдф с двух сторон. До этого момента я думал, что он односторонний. Тут же у меня родилась идея как сэкономить бумагу родной фирме, а себе время, затрачиваемое на печать и переворачивание листов. Однако ни одна из установленных прог не хотела печатать в дуплексе, кроме того же адобе ридера, да и тот печатал только ту самую анкету (как ему подготовили этот пдф для меня до сих пор загадка). С помощью бубна, такой-то матери и наших эникейщиков айтишников удалось найти крыжик ответственный за включение дуплекса у принтера (лучи ненависти фирме НР). Дело осталось за малым - найти как управлять этим свойством из VBA. Ну и нашлось. На всякий случай выкладываю пример и сюда.
Из найденных ограничений. Поменять дуплекс из кода можно только с правами админа, хотя ручками, тыкая мышкой в панель управления и далее, мне это доступно и под обычным пользователем. А так как я решил, что больше не буду все время сидеть под админом, то понизил себе права и включением/выключением дуплекса не пользуюсь. (У автора по ссылке есть псевдорешение - не тестил). Зато перед печатью мне выводится алерт о состоянии дуплекса на принтере и предложением продолжить или отказаться - не ошибусь. А еще написал переписал под себя функцию для ограничения очереди печати в винде. Так как под опять же обычным пользователем удалить все задания из очереди невозможно, а макрос отправляет на печать куда быстрее чем съедает принтер и в очереди может скопиться "over9000" заданий. Нужно оно когда оказывается, что на печать отправлена чушь, а оказывается это почему-то когда очередь уже битком .
Функция:
Код
Public Function print_queue_count()
Dim locator As WbemScripting.SWbemLocator
Dim Service As WbemScripting.SWbemServices
Dim myob As WbemScripting.SWbemObjectSet
Set locator = New WbemScripting.SWbemLocator
Set Service = locator.ConnectServer
' язык WQL - почти SQL
Set myob = Service.ExecQuery("SELECT * FROM Win32_PrintJob ")
print_queue_count = myob.Count
End Function
Вызов функции:
Код
Do While print_queue_count > 1: DoEvents: Loop
Сообссно пока в очереди больше одного задания, макрос отдыхает. Емнип, для нее требуется Tools - References - Microsoft WMI Scripting V1.2 Library Функцию тоже честно спер, но не вспомню откуда
Имеется счет-фактура, которую выплевывает 1С. По договору точность отображения цены составляет 11 знаков после запятой. Кроме того, имеется замороченный сотрудник контрагента, который докапывается до каждой запятой в документе. Для успокоения этого сотрудника применяется нехитрый
Код
Set rSF = .Cells.Find("Цена (тариф) за единицу измерения", , , xlPart)
If Not rSF Is Nothing Then
rSF.Offset(2, 0).NumberFormat = "#,##0.00000000000"
End If
После него бывало, что число не влезает в ячейку и отображается как "#########" Решался вопрос просто: rSF.EntireColumn.AutoFit
Однако ребятам в 1С тоже хочется кушать и они выпускают новую версию, где rSF является объединенной ячейкой и соответственно плюет на .EntireColumn.AutoFit
Замороченный сотрудник в ярости, я боюсь за его душевное здоровье. Как мне его спасти без потери своего душевного здоровья? Вообще давно интересовал вопрос: есть некое содержимое ячейки .Value, кроме того про ячейку я знаю вид и размер шрифта, перенос строк и т.п. Как эти знания перевести в ширину столбца?
объявляю глобальную переменную Public NewMaket As Range
выполняю некую процедуру в которой этот NewMaket задается.
затем (после распития чая) запускаю другую процедуру или третью в которой этот диапазон используется.
Если во время чая или выполнения процедуры произошел reset проекта vba, то ессно переменная становится nothing. Конечно состояние переменной проверяется в процедурах, но хочется наглядности, а именно: иметь кнопку на панели, которая бы отражала состояние переменной и меняла бы иконку. Пришел, глянул на панель и запустил в случае чего этой кнопкой первую процедуру.
Алсо. Аналогичная задача стоит в аутлуке, где объявляется Private WithEvents ItemsT As Outlook.Items Аутглюк вообще гад, может вообще втихаря сбросить переменную и обработка писем остановилась. (Функционала "правил" в аутлуке мне не хватает для обработки).
Возникла следующая задача: Есть книга весом 16 метров. Содержит связь с мсАкцесс, кучу формул и сводных таблиц. Открывается минуты за две. В процессе открытия эксель занимает больше гига в оперативе. Короче тяжелый файл. Думаю, что прилагать нет нужды. Да и задача не связана с конкретным файлом.
В файл добавлен новый функционал на одном листе, вес увеличился на 2 метра (как и время открытия). Фишка в том, что функционал на регулярной основе не нужен, а только в нештатных ситуациях, то есть изредка.
Хочется, чтобы формулы на этом листе в штатном порядке не пересчитывались, но в любой момент их можно было бы включить одним кликом. Выносить в отдельную книгу этот лист не вариант, так как основной файл каждый месяц меняет имя, старый переезжает в архив, а замена связей происходит ну очень долго - формул на листе овердоху 100500 (а может и больше).
Upd. Забыл добавить: Эксель 2010, если имеет значение.
При создании формулы =ЕСЛИОШИБКА() в книге появляется скрытое имя "_xlfn.IFERROR" со значением : Value : "=#NAME?" Это только у меня так? Эксель 2010
Обращаю внимание на слово "скрытое" Visible = False, в диспетчере имен его не видно Но если сделать Visible = True, то отображается и его можно удалить. Программно не удаляется.
Если обе книги открыты - нет проблем. Если только Книга2.xlsx - ругается, что не может открыть.
Проблему локализовал. Нашел, что если удалить столбцы А:В в data, то обновляется нормально. Причем, если эти столбцы перенести на соседний лист (т.е. они уже не относятся к данным для обновления), то ошибка возникает все равно.
Что-то мне подсказывает, что таки глючный у меня офис.
Имею базу в Аксессе. В ней есть поле TimeStamp в формате Дата/время. Строю сводную в хлс. Пока нет группировки - формат поля отображается как надо (05.12.2011 14:30) и меняется как захочешь.
Стоит включить группировку формат меняется на 05.дек и ведет себя как будто это текст, т.е. не реагирует на смену формата.
Просто книга. Несколько листов, ни формул сложных, ни макросов. Сотрудник правил ее на моем компе, сохранил, закрыл. Далее открывается только эксель, как будто в нем ни одной книги не открыто. Файл при этом помечается системой, как занятый экселем.
Я уже писал о плавающих ошибках... Теперь вот постоянная ошибка, но на ровном месте. Написал макро1(). Делает следующее: - копирует два листа в новую книгу. - удаляет лишние строки/столбцы - заменяет значениями - удаляет имена
Все это в цикле для 16 объектов. На 13-м (может пора в мистику начать верить?) объекте встает с ошибкой, там где предыдущие 12 спокойно выполнялись. Эксель при этом "слегка подвисает": есть возможность менять листы, но ни одна ячейка не выбирается. Сохранить или просто закрыть невозможно - только снять задачу. При пошаговом выполнении - сбоев нет. Тот же 13-й объект ставлю в начало цикла - сбоев нет
сделал так: Саб макро1() цикл по 12 объектам Call макро2 енд саб
Макро2() цикл по 4 объектам енд саб
Кода в два раза больше, но работает без сбоев. Офис 2007 SP2
Sub Posting(FullNameOS As String, rPerStr As String) Dim OL As New Outlook.Application Dim SM As Outlook.MailItem Application.DisplayAlerts = False Set SM = OL.CreateItem(olMailItem) SM.Attachments.Add (FullNameOS) SM.To = ThisWorkbook.Sheets("Ruling").Range("SendMailTo").Value SM.CC = ThisWorkbook.Sheets("Ruling").Range("SendMailCC").Value SM.Subject = "Сравнительный анализ результатов планирования за " & rPerStr SM.Display
Когда в поле SM.To подставляется "Иванов И А; Петров В.В." - нет вопросов, аутлук адресатов распознает и подчеркивает. Но когда подставляется "Список рассылки" (содержащий тех же "Иванов И А; Петров В.В." ), то он остается просто текстом. Нужно или "проверить имена" нажать или кусрор в поле То поставить и чего-нибудь нажать. Тогда аутлук "понимает" и подчеркивает.
Вопрос. Как аутглюку сообщить, что это не просто адрес, а список рассылки? Или программно нажать "проверить имена"?
Мне не на чем теперь проверить. Как отображается условное форматирование 2007-го в 2003-ем? Не всякие новомодные стрелочки, а просто когда правил много.
И вопрос номер 2. Как условное форматирование перевести в обычное? Чтобы уменьшить вес отчета и его "ворочаемость". Я формулы убиваю, оставляя значения. Вот и условные форматы хотелось убить, так как цифры уже не изменяться.
При выделении* мышью текста, последний выделяется разными цветами. Иногда двумя, а иногда аж 4 разных, причем одного из них от фона не практически отличить. Это баг, фича или ворд так празнует новый год.
______ * Выделение показано зеленой скобкой на скрине
Всегда использую один код для открытия книги: Set wb = Workbooks.Open(SourcePath & fName) При этом, если поставить далее макрос на паузу (любым способом) книга wb становится модальной по отношению к ThisWorkbook. Т.е. пока макрос на паузе или wb открыта, окно ThisWorkbook не хочет выходить на передний план.
Или не становится модальной. От чего это зависит - не пойму.
Когда в кэше только одна сводная, то без разницы как писать: ActiveSheet.PivotTables("СводнаяТаблица1").SourceData = "[Книга3.xls]Лист1!R1C1:R323C9" или ActiveWorkbook.PivotCaches.Item(1).SourceData = "[Книга3.xls]Лист1!R1C1:R323C9"
А вот когда две и более таблицы построены на одном кэше, то ActiveWorkbook.PivotCaches.Item(1).SourceData = "[Книга3.xls]Лист1!R1C1:R323C9" вызывает ошибку, а ActiveSheet.PivotTables("СводнаяТаблица1").SourceData = "[Книга3.xls]Лист1!R1C1:R323C9" работает, но таблицы становятся на независимых кэшах.
При обновлении кэша сводной таблицы с источником в другом файле про этот источник выдется сообщение (см. вложение). Это о чем? И как его избежать? Application.DisplayAlerts = False - не предлагать: мне другие сообщения важны.
Дано: эмпирическая зависимость функции С от переменных А и В, живет в таблице. Есть некоторые значения А и В, которые точно не совпадают с значениями в таблице. Найти функцию С я могу с помощью какой-либо интерполяции (хоть линейной) или экстраполяции. Но может есть встроенная функция? Что-то типа: =интерполяция(F1;F2;A2:C21)
Дано: на сетевом диске файл "оперативный_отчет.xls" с кучей сводных, построенных на основе других файлов на том же сетевом диске. Соответственно свойство SourceData имеет следующий вид: 'Y:\Corps\2010\02\РСВ\[эффект.xls]БД'!R3C1:R35000C20 И кочуют эти файлы из месяца в месяц. Есть макрос, который меняет путь на ...\2010\03\... И вот этот макрос споткнулся "увидев" такой путь: '\Corps\2010\02\РСВ\[эффект.xls]БД'!R3C1:R35000C20
Я сохранил файл "оперативный_отчет.xls" к себе на рабочий стол, пусть стал нормального вида Y:\Corps\2010\02\... Перенес обратно на Y:, снова имею \Corps\2010\02\...
Я понимаю, что путь относительный, но он был долго абсолютным и хочется его вернуть взад.
Важно! Забить на все и изменить руками путь не предлагать! Сводных в файле больше сотни, многие из них построены на общем кэше и ручное изменение пути приведет к увеличению объема файла в дцать раз. Кроме того, хочется избежать такой байды в дальнейшем.
Кто-нибудь может объяснить этот бред? http://slil.ru/28360662 120 КБ Счас буду сносить 2007 Хотя в 2003 ворде творится тоже самое. шрифт гарамонд сносил и брал с соседнего компа. С другими шрифтами такого не происходит. Все шрифты, разумеется, не проверял.
Было в 2003 так: UserForm1.ListBox1.List = Range("A2").Resize(UsedRange.Count - 1, 1).Value UserForm1.Show (False) Все работало. в 2007 оказалось, что Could not set the List property. Вдруг стал Invalid property array index. Читаю справку: object.List( row, column ) [= Variant] row Required. An integer with a range from 0 to one less than the number of entries in the list. column Required. An integer with a range from 0 to one less than the number of columns.
Думаю, ладно раз Required, то подставим. (Хотя при открывании скобки после List аргументы идут в квадратных скобках - так они Optional или Required?)
Ваяю цикл - ошибка та же. For iList = 0 To Range("A2").Resize(UsedRange.Count - 1, 1).Count - 1 UserForm1.ListBox1.List(iList, 0) = Range("A2").Resize(UsedRange.Count - 1, 1).Cells(iList + 1, 1).Value Next
.RowSource нельзя использовать, так как потом удалять не дает элементы списка.