Успешно используюю нижепривиденный макрос для импорта определенных листов из других книг в текущую
Sub Import_Allfunds() ' Import_AllFunds Macro Dim sFolder, li As Long sFolder = Application.GetOpenFilename("XLS Files(*.xl*),*.xl*", , "Chose an Allfunds File", "Chose", True) On Error GoTo GetCode If sFolder = False Then Exit Sub GetCode: Application.ScreenUpdating = False For li = 1 To UBound(sFolder) Workbooks.Open sFolder(li) Next li Application.ScreenUpdating = True Sheets("Lux EUR").Copy Before:=Workbooks("RFU023.xls").Sheets(1) For Each wb In Workbooks If wb.Name Like "All Funds*" Then wb.Close savechanges:=False End If Next Sheets("Data Management").Select End Sub
Но для одного из документов появилась проблемка. При попытке импорта одного из листов выскакивает диалоговое окно:
И так несколько раз с разными именами. При этом, если все время нажимать Yes, то импортируется тот лист что нужно и всё остальное работает ок.
Можно как-то избавиться от этого диалогового окна? Что-то менять в файле с которого импортируется - не вариант, так как файл каждый месяц присылается другим отделом, который нам не подвластен.
Там ведь всё ясно написано - импортируете лист с именем, которое у Вас уже есть. Я бы На Вашем месте заранее изменил своё имя на другое, раз уж такой конфликт часто бывает - тут если выбрать YES, то может быть ошибка. Или выбирал NO и менял имя.
{quote}{login=Hugo}{date=25.11.2011 02:53}{thema=}{post}Там ведь всё ясно написано - импортируете лист с именем, которое у Вас уже есть. Я бы На Вашем месте заранее изменил своё имя на другое, раз уж такой конфликт часто бывает - тут если выбрать YES, то может быть ошибка. Или выбирал NO и менял имя.{/post}{/quote}
Так ведь дело вот в чем:
В файле в кторый я ипортирую информацию есть только 2 листа: Data Management (просто лист с кнопками управления импорт/экспорт/рефреш) HC Report (Лист с шаблоном в который собирается информация с импортированых листов)
А импортирую я из другого документа только один лист с названием Lux EUR
Я вообще не могу понять насчет чего оно мне пишет... С другими документами все работает нормально.
Это имя - не имя листа, а имя в листе. Если Вы их не используете, то поудаляйте все лишние имена менеджером имён. А английский на минимальном уровне всёж нужно понимать...
Ну так и пишут: "формула или лист, который вы хотите скопировать/переместить содержит имя "bonddata_lc_id" которое на файле-приёмнике уже есть..." Измените в том файле КУДА перемещаете листы это имя на другое и не будет выскакивать.
{quote}{login=Hugo}{date=25.11.2011 03:06}{thema=}{post}Это имя - не имя листа, а имя в листе. Если Вы их не используете, то поудаляйте все лишние имена менеджером имён. А английский на минимальном уровне всёж нужно понимать...{/post}{/quote} Ну английским владею слава Богу нормально. Но не суть.
Прикрепить файл не могу, так как практически чистый файл весит 6 с половиной мб а в архиве - полтора.
Дело в том, что в моем файле нету даже похожих строк/имен/названий...
Подозреваю, что как раз лишних имён там на пяток мегабайт и лежит, раз размер такой.
Про имена вот есть пример кода:
===================== Попробуйте запустить для поиска имён: Код: Sub ListNames() ' вывод всех имен диапазонов в книге и их ссылок в активную ячейку и ниже Selection.ListNames End Sub А вот так можно пройтись по списку имён и по одному их поудалять при необходимости: Код: Sub EraseNames() ' очистка списка имен диапазонов Dim nM As Name For Each nM In ActiveWorkbook.Names If nM.Visible Then If Not nM.Name Like "*!Print_Area" Then ' имена областей печати лучше оставить Select Case MsgBox("Удалить имя диапазона:" & vbCrLf & vbCrLf _ & nM.Name & nM.RefersTo, vbYesNoCancel + vbQuestion) Case vbYes: nM.Delete Case vbCancel: Exit Sub End Select End If Else If Not nM.Name Like "*!_FilterDatabase" Then nM.Delete ' удалить все скрытые имена диапазонов кроме фильтров End If Next nM End Sub =======================
{quote}{login=Spagor}{date=25.11.2011 03:27}{thema=Re: }{post}{quote}{login=Hugo}{date=25.11.2011 03:06}{thema=}{post}{/post}{/quote}практически чистый файл весит 6 с половиной мб{/post}{/quote}Не такой уж он и чистый :-)
{quote}{login=Hugo}{date=25.11.2011 03:16}{thema=}{post}Вообще-то есть строка, отключающая лишние вопросы - но думаю тут её применять не стоит, пока не разобрались с конфликтом имён.{/post}{/quote}
А можно поинетересоваться как эта строка выглядит?
"А если я поудаляю эти имена (с формулами)что может произойти? Я имею ввиду, не утрачу ли информацию?"
"-думаю тут её применять не стоит, пока не разобрались с конфликтом имён.- А можно поинетересоваться как эта строка выглядит?"
Т.е. Вы справедливо боитесь потерять информацию, и тут же готовы её потерять (а может быть уже что-то потеряли, когда отвечали YES). Хотя конечно если Вы точно знаете, что в той книге, куда Вы копируете лист, нужных имён нет, то можете применять
Но судя по весу, Вы так уже набрали приличное количество мусора. Я бы сделал иначе - перед копированием кодом (пример выше чуть переделать) удалил все ненужные имена из книги (остатки от предыдущего копирования), потом смело копировал лист со всеми именами.
"А если я поудаляю эти имена (с формулами)что может произойти? Я имею ввиду, не утрачу ли информацию?"
"-думаю тут её применять не стоит, пока не разобрались с конфликтом имён.- А можно поинетересоваться как эта строка выглядит?"
Т.е. Вы справедливо боитесь потерять информацию, и тут же готовы её потерять (а может быть уже что-то потеряли, когда отвечали YES). Хотя конечно если Вы точно знаете, что в той книге, куда Вы копируете лист, нужных имён нет, то можете применять
Но судя по весу, Вы так уже набрали приличное количество мусора. Я бы сделал иначе - перед копированием кодом (пример выше чуть переделать) удалил все ненужные имена из книги (остатки от предыдущего копирования), потом смело копировал лист со всеми именами.{/post}{/quote}
Спасибо за ответ. Дело в том, что сам по себе мусор мне не мешает. Данынй файл - это рабочий файл, который просто собирает информацию в таблицу, потом жта таблица отдельно экспортируется в отдельный документ, а сам рабочий файл закрывается без сохранения.
Хотя насчет веса это действительно странно. У меня есть другие файлы, которые работают с теми же книгами, с такими же макросами (только другие листы импортирует) и их вес не превышает 200кб...
Тогда действительно существующие имена нужно заменять на копированные. Но если файл закрывается без сохранения - тогда и мусора и лишних имён там быть не должно...
{quote}{login=Hugo}{date=25.11.2011 06:51}{thema=}{post}Тогда действительно существующие имена нужно заменять на копированные. Но если файл закрывается без сохранения - тогда и мусора и лишних имён там быть не должно...{/post}{/quote}
Сейчас попробую создать файл заново... может я что-то перемудрил был...
Это правильное решение. Я таким файлам, которые используются как шаблоны и которые нежелательно перезаписывать/сохранять, обычно после изготовления ставлю атрибут "Read Only". Это защищает шаблон от случайного повреждения.
{quote}{login=Hugo}{date=25.11.2011 07:10}{thema=}{post}Это правильное решение. Я таким файлам, которые используются как шаблоны и которые нежелательно перезаписывать/сохранять, обычно после изготовления ставлю атрибут "Read Only". Это защищает шаблон от случайного повреждения.{/post}{/quote}
Нубский вопрос, но "как"?) Уже совсем замаялся с этим документом. Таблицы большие, все формулы заново в макросах прописывать приходится... Форматировать сначала...
По данному вопросу назрела следующая проблема. При экспорте одного листа из рабочего документа экспортируются и все 6 мб имен, что не очень удобно для последующей отправки клиенту.
Сейчас для жкспорта использую соедующий код:
___________________________________________
Sub Export_Data() On Error Resume Next
Dim Sh As Worksheet: Set Sh = Sheets("HC Report") If Sh Is Nothing Then Exit Sub SU False: DA False NewFileName = GetNewFileName If Len(NewFileName) > 0 Then Sh.Copy ActiveWorkbook.Sheets("HC Report").Cells.Copy ActiveWorkbook.Sheets("HC Report").Cells.PasteSpecial xlPasteValuesAndNumberFormats ActiveWorkbook.SaveAs NewFileName ActiveWorkbook.Close False End If SU True: DA True: Set Sh = Nothing End Sub
Sub SU(ByVal Update_Screen As Boolean): Application.ScreenUpdating = Update_Screen: End Sub Sub DA(ByVal Display_Alerts As Boolean): Application.DisplayAlerts = Display_Alerts: End Sub
Function GetNewFileName() As String GetNewFileName = "": InitialFileName = "c:\": NewFileExt = ".xls" GetNewFileName = Application.GetSaveAsFilename(InitialFileName, _ "Excel File (*" & NewFileExt & "),", , _ "Type the file name", "Save the file") If VarType(GetNewFileName) = vbBoolean Then GetNewFileName = "": Exit Function If GetNewFileName = "False" Or GetNewFileName = "False" Then GetNewFileName = "" End Function __________________________________________
Что к нему дописать нужно, чтобы имена не копировались?
{quote}{login=Hugo}{date=29.11.2011 01:00}{thema=}{post}После копирования удаляйте все ненужные имена. Код выше есть - чуть подправить по вкусу... Например, убрать вывод сообщения.{/post}{/quote}
Всё, спасибо, я как все - сначала задаю вопрс, потом пользуюсь поиском (извините, каюсь. Через поиск сделал почти весь отчет)))
собственно, нашел более понятный и простой код для удаления имен: _______________________________________ Set AWB=ActiveWorkBook for i=AWB.Names.count to 1 step -1 On Error Resume Next AWB.Names.Item(i).Delete Next _______________________________________
Работает. Встрою его в макрос экспорта документа в самое начало. Думаю будет норм. Думаю, что тему можно закрыть ;)