Конфликт имен в Excel
Добрый день! Была создана база с шаблонами. Пользовался все было норм. Сейчас при выводе данных в шаблон, выдает ошибку «Конфликт имен». Что это может быть и как можно исправить? проблема именно с одним шаблоном.
Anti
Администратор
Команда форума
Причин проблемы может быть много — достаточно поискать в интернете по фразе «конфликт имен print_area».
Вы не указали тип шаблона, но поиск выдаёт что это проблема Excel.
Если вы предоставите упрощённый проект с проблемным шаблоном, мы попытаемся найти решение.
peachkuev
Гость
Такой вопрос, если файл слишком большой и не прикрепляется к сообщению лучше залить на обменник?)
Вот такой проект.
Создавал для личных целей. Занимаюсь обслуживанием теплового хозяйства в городе Киеве. Может кому-то понадобится что-то похожее.
Значит во вкладке «Объекты» при выводе документа «Акты» возникает ошибка вышеупомянутая.
peachkuev
Гость
Упс, вот файл)
Вложения
229.7 KB · Просмотры: 195
peachkuev
Гость
Тему можно закрыть) уже сам разобрался)
когда нужно срочно, а оно не работает от паники написал тему, прежде чем сесть и вникнуть в суть проблемы.
Итог: при последнем редактирование шаблона изменил граници печать в одной из страниц, что создавала 2 зоны печати, двоилось по причине того что были объеденные ячейки и одна из них выходила за границы печати)
Предотвращение конфликтов именования
При попытке создать или использовать ранее определенный идентификатор происходит конфликт имен. В некоторых случаях конфликты имен создают такие ошибки, как обнаружение неоднозначного имени или повторяющееся объявление в текущей области. Конфликты именования, которые не обнаружены, могут привести к ошибкам в коде, которые приводят к ошибочным результатам, особенно если перед первым использованием не объявлять все переменные явным образом.
Большинства конфликтов имен можно избежать при уверенном понимании областей видимости, а также частных и общих элементов уровня модуля.
Конфликт имен возникает в тех случаях, когда идентификатор:
- видим на нескольких уровнях области видимости;
- имеет два разных значения на одном уровне.
Например, процедуры в отдельных модулях могут иметь одинаковые имена. Таким образом, можно определить процедуру с именем MySub в модулях с именем Mod1 и Mod2 . Если каждая процедура вызывается только из других процедур своего модуля, конфликты имен не возникают. Однако при вызове из третьего модуля может возникнуть MySub ошибка, и не предоставляется квалификация для различия между двумя MySub процедурами.
Большинство конфликтов имен можно разрешить, указав перед идентификатором квалификатор, который состоит из имени модуля и, при необходимости, имени проекта. Например:
YourProject.YourModule.YourSub MyProject.MyModule.MyVar
Приведенный выше код вызывает процедуру YourSub Sub и передает в MyVar качестве аргумента. Используйте любое сочетание квалификаторов для различения идентичных идентификаторов.
Visual Basic сопоставляет каждую ссылку на идентификатор с ближайшим объявлением соответствующего идентификатора. Например, если MyID объявлен общедоступным в двух модулях в проекте ( Mod1 и Mod2 ), можно указать MyID объявленное в Mod2 без квалификации из Mod2 , но необходимо указать его, чтобы Mod2.MyID указать его в Mod1 .
Это также верно, если Mod2 объект находится в другом проекте, на который ссылается напрямую. Однако если Mod2 объект находится в проекте с косвенной ссылкой, то есть в проекте, на который ссылается проект, на который вы ссылаетесь напрямую, ссылки на Mod2 переменную с именем MyID должны всегда указываться именем проекта. Если вы ссылаетесь на MyID третий модуль с прямой ссылкой, совпадение выполняется с первым объявлением, встречаемым при поиске:
- Проекты напрямую ссылаются в том порядке, в который они отображаются в диалоговом окне Ссылки меню Сервис .
- Модули каждого проекта. Обратите внимание, что строгий порядок модулей в проекте отсутствует.
Использовать имена объектов ведущего приложения, например, R1C1 в Microsoft Excel, на других уровнях области видимости нельзя.
Типичные ошибки, связанные с конфликтом имен: неоднозначные имена, повторяющиеся объявления, необъявленные идентификаторы или ненайденные процедуры. Начиная каждый модуль с оператором Option Explicit для принудительного объявления переменных перед их использованием, можно избежать некоторых потенциальных конфликтов именования и ошибок, связанных с идентификаторами.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Как избавиться от конфликта имен Excel при открытии через Powershell?
Дорогие программисты, у меня возникает такая проблема, которая не дает мне спать иногда, буквально. Ежедневно нужно подготовить рапорт в формате Excel, я автоматизировал его подготовку с помощью скрипта в языке Powershell. Проблема происходит при открытии файла.
$xl = New-Object -comobject Excel.Application $xl.Visible=$True $xl.DisplayAlerts=$False $fileName="c:\path\to\my\file.xlsx" $wb = $xl.Workbooks.open("$fileName",3) $sheetName="mainSheet" $ws = $wb.Worksheets.item("$sheetName") .
Я пытался уже убрать/комментировать строку Visible=$True и даже сохранил файл с другим именем. Большая проблема в том, что так не всегда бывает. Иногда выполняется хорошо, но если нет, придется рано проснуться октрыть удаленное соединение с компьютером и вручную вводить какое-нибудь новое имя, и дальше скрипт выполняется. Есть ли у вас какие-нибудь предложения? Благодарю за ранее за внимание.
Отслеживать
задан 14 дек 2019 в 16:15
Fabio Mendes Soares Fabio Mendes Soares
128 1 1 золотой знак 2 2 серебряных знака 9 9 бронзовых знаков
$xl.Visible — только визуальное отображение приложения (показать/скрыть), к именам отношения не имеет. Имя открываемой книги — file.xlsx , название листа — mainSheet . Ошибка с именем Print_Area . Проблема с диапазоном для печати? Вот его и ищите в книге. Возможно, в книге есть именованный диапазон, который ссылается на внешние источники. При открытии файла идет запрос на обновление данных, но Вы его не видите (сообщения отключены — DisplayAlerts=$False ), при обновлении чего-то там происходит. Но это догадка.
14 дек 2019 в 16:45
Если включаю отображение сообщений, то программа останавливается пока не нажимаю «ОК». Но такая проблема тоже бывает у другого файла но конфликт будет с именем «Database». Да я предполагаю, что это какой-то скрытный диапазон, ведь файл был много раз использован многими людьми. Я просто хотел, чтобы программа сама выбрала «программатически» либо новое имя и «ОК» либо «отмена». На старом компьютере Windows 7 и Office 2016 таких конфликтов не было, программа до конца выполнялась, только как обновлили на Windows 10 и Office 365 я обнаружил этот конфликт.
14 дек 2019 в 17:02
>> * программа останавливается пока не нажимаю «ОК»* Если сообщение об обновлении связей — найдите в ‘Powershell’, как отключать обновления пр открытии книги
14 дек 2019 в 17:40
Отключать обновления не идеальный вариант, раз именно этот файл имеет много связей, которые нужно обновить. Когда включаю сообщения конфликта нет, но придется вручную закрыть окна.
Конфликт имен в excel как убрать
Вариант 1. открыть файл в Excel, верхнее меню — Формулы — Диспетчер имён.
выделить Print_Titles и нажать кнопку удалить.
Вложение 97516
Вариант 2.
когда скрипт попросит ввести имя, ввести что-нибудь (например, xx) и Нажать кнопку «Ок».
это нужно сделать один раз и больше не понадобится.
Да, тоже думаю, как вариант переименовать эти диапазоны через диспетчер имён в случае возникновения такой ситуации.
Осталось подумать, как это внести в код)
Последний раз редактировалось Sofya63; 23.08.2019 в 12:42 .
Регистрация: 09.01.2008
Сообщений: 26,238
Сообщение от Sofya63
Да, тоже думаю, как вариант переименовать эти диапазоны через диспетчер имён в случае возникновения такой ситуации.
Осталось подумать, как это внести в код)
не уверен, что в ваш код изменения внести возможно.
дело в том, что даже одна строчка — открытие файла, уже вызывает это диалоговое окно.
import os, re import win32com.client as com_client print('Тест “.xls, .xlsx”.\ \nСкрипт должен лежать в той же директории, что и обрабатываемые файлы.\ \nВажно! Убедитесь, что приложение “Microsoft Excel” закрыто.\ \nВ случае неполадок нужно снять задачу “Microsoft Excel” в диспетчере задач.\n') #ВЫБИРАЕМ ФАЙЛЫ folder_path = os.getcwd() files = list(filter( lambda name: name[0] != '.' and 'xls' in name, os.listdir(folder_path) )) files.sort(key=lambda file: list(map(int, re.findall('\d+', file)))) #ВЫПОЛНЯЕМ ПРЕОБРАЗОВАНИЕ НАД ФАЙЛАМИ Excel = com_client.Dispatch("Excel.Application") Excel.Visible = True for file in files: wb = Excel.Workbooks.Open(f'/') print(f'Файл успешно открыт!') wb.Close() Excel.Quit() input('Операция успешно выполнена! Для выхода нажмите "Enter".')
но, конечно, решение есть.
и даже не одно.
пара вариантов (правда на Delphi) приведено в теме на форуме SQL.ru:
https://www.sql.ru/forum/543092-1/ex. -konflikt-imen
Это, конечно, костыли:
один вариант в цикле ждёт появления окошка «Конфликт имён», вносит туда текст и закрывает его.
другой вариант распаковывает XLSX файл (это по сути переименованный ZIP архив ), находит там файл в папке XL файл workbook.xml, находит там через парсер XML нужное имя и заменяет его на другое, после чего запаковывает файл обратно в XLSX.
предположу, что есть ещё вариант.
написать макрос на VBA и запустить его в Excel — там можно открыть XLSX файл, переименовать нужные (точнее ненужные) имена и сохранить/закрыть файл.
Serge_Bliznykov |
Посмотреть профиль |
Найти ещё сообщения от Serge_Bliznykov |