Витя, здесь я бы не согласился, т.к. задача просто разбивается на две подзадачи и по сути даже на одну: правильное удаление листов. Сохранение в PDF было изначально. Т.е. сохранить в PDF только листы, отвечающие критериям, а остальные удалить. А вот зачем две темы было создавать с одной и той же задачей - вот здесь я уже не понимаю. Код из второй темы готов выложить здесь после того, как автор определиться и здесь уже напишет что вообще все-таки надо в итоге: удалять листы с НД или удалять ячейки или еще чего там надо делать.
Jack Famous написал: спорно, т.к. они стали дубликатами уже при вставке
не соглашусь. По идее данные должны возвращаться в том же виде, в котором были взяты. Если иное не озвучено как спец.функция инструмента. Здесь же происходит такое именно внутренними механизмами Excel-я и именно при вставке(как и было замечено), но все мы знаем, что виноват будет разработчик, т.к. должен был это учесть И я думаю Николай обязательно учтет в следующих обновлениях.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Max2307 написал: Есть предложения по существу - буду рад услышать
по существу. Вы приложили пример данных и того, что хотите видеть в итоге. Но пример итогового результата не корректен и мы просто не понимаем: так должно быть или это ошибка составления? Если ошибка - то как должно быть правильно? Если Вам лень это объяснять - другим тем более лень додумывать чего-то для Вас и тратить свое время на решение задачи, которое в свете неверно представленного итога тоже окажется бесполезным. Конкретно в данном случае: Иванова в исходных данных в этой строке нет, а в итоге есть. И неясно - его надо туда как-то подставлять или его там и быть не должно? Вот для чего тут "пререкаются". Не проще ли было просто выложить корректный пример и уже не его основе ждать решения? Это в конце концов больше Вам надо, а не форуму. Может Вам не классическую сводную надо, а просто собрать данные из всех листов одну таблицу? С большей частью справится этот код: Как собрать данные с нескольких листов или книг? В качестве диапазона указываете - A6, имена листов: 00*. Так данные будут собраны только с тех листов, имена которых начинаются на два нуля. В итоге останется только добавить шапку и итоговые формулы. Что можно сделать и макросом, дописав чут-чуть код.
P.S. Забыл совсем. В коде для более правильного результата надо будет заменить эту строку:
При такой постановке вопроса без макросов умная таблица сама ничего не протянет. Надо писать код, который будет вставлять нужные формулы на основе сводной.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Использовать моноширный шрифт и добивать пробелами строки с малым кол-вом символов. Здесь в самом конце есть готовая функция для создания такой таблицы: Вставить в письмо Outlook таблицу Excel с форматированием Останется закинуть в текстовый файл. Или, если надо сохранить весь лист, а не отдельную таблицу, то: Сохранить как -Форматированный текст (разделитель - пробел) (*.prn). В дальнейшем созданный файл можно либо открывать через Блокнот либо сразу после сохранения изменить расширение с prn на txt. Файл так же будет открываться как ни в чем не бывало Блокнотом.
никак не видим Файла-то Вашего у нас нет. Откуда взялось имя таблицы? Формула внутри умной таблицы? А вставить пытаетесь потом в простую? Тогда надо заменять имя таблицы и имя столбца на их диапазоны. Вроде того:
Код
Dim shislostrok&, lc&, rc As Range, rt As Range, x, xt As ListObject
shislostrok = 11
Set rt = Sheets("внедрение").Range("A1:C" & shislostrok)
For Each x In Sheets("внедрение").ListObjects
If Not Intersect(x.Range, rt) Is Nothing Then
Set xt = x
Exit For
End If
Next
If xt Is Nothing Then
Exit Sub
End If
rt.Copy
With Sheets("Данные").Range("A" & shislostrok + 6).Resize(xt.ListRows.Count, xt.ListColumns.Count)
.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
For lc = 1 To xt.ListColumns.Count
.Replace xt.Name & "[" & xt.ListColumns(lc).Name & "]", xt.ListColumns(lc).DataBodyRange.Address, xlPart
Next
End With
Sheets("внедрение").Application.CutCopyMode = False
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
molinari написал: в облаке на предприятии а общем доступе
тогда параметры защиты листов не изменить. В общем доступе нельзя изменять параметры защиты, а значит и выход только скрывать листы. Либо стандартно, как в статье выше через "Разрешить изменение диапазонов" - там можно из сетевых групп выбирать пользователей и назначать им привилегии. При этом логиниться отдельно им уже не надо будет, Excel сам автоматом определит пользователя и разрешит или запретит ему изменять те или иные диапазоны(это могут быть и полностью листы, если задать в качестве диапазона все ячейки листа).
совпало с чем? Именем пользователя ПК? Файл в общем доступе или нет? Допустимо использование макросов? Что уже пытались сделать сами? По факту есть варианты: Каждому пользователю свой лист/диапазон
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
denka1982 написал: задача состоит в том что бы удалить те листы
Цитата
denka1982 написал: все таки идея заключается в том что б удалял именно ячейки со значением НД
тут уже определяться надо - листы или ячейки. Если ячейки с НД - это действительно проще, но непонятно, надо ли в этом случае выводить лист на печать или пропускать такой лист.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Sub SplitSheets5()
Dim s As Worksheet
Application.DisplayAlerts = False
For Each s In ActiveWorkbook.Worksheets
If s.Index > 2 Then
If s.Cells(33, 16).Value = CVErr(xlErrna) Then
s.Delete
else
s.ExportAsFixedFormat Filename:=ThisWorkbook.Path & "\" & s.Name & ".pdf", Type:=xlTypePDF
end if
end if
Next
Application.DisplayAlerts = True
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Из такого описания ответ очевиден: выделить лишние листы и удалить. А чтобы получить хоть что-то похожее на решение нужно приложить файл и рассказать, по какому признаку лист можно считать лишним.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Помещаете свои файлы в отдельную папку и применяете для них код:
Код
Sub Get_All_File_from_Folder()
Dim sFolder As String, sFiles As String
Dim wb As Workbook
'диалог запроса выбора папки с файлами
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = False Then Exit Sub
sFolder = .SelectedItems(1)
End With
sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
'отключаем обновление экрана, чтобы наши действия не мелькали
Application.ScreenUpdating = False
sFiles = Dir(sFolder & "*.xls*")
Do While sFiles <> ""
'открываем книгу
Set wb = Application.Workbooks.Open(sFolder & sFiles, False, Password:="123")
wb.Password = ""
wb.Close True 'если поставить False - книга будет закрыта без сохранения
sFiles = Dir
Loop
'возвращаем ранее отключенное обновление экрана
Application.ScreenUpdating = True
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
на основе представленных 4-х строк кода помочь нечем. Они точно ошибок не несут.
Скрытый текст
P.S. Если создали тему и получили в ней ответ(тем более с решением) - то правила хорошего тона гласят, что нужно как-то отреагировать на подобный ответ(подошло, не подошло, если не подошло - почему? если не актуально уже - тоже обозначить). А то в предыдущих Ваших темах есть и решения и советы, но как-то отреагировать на них у Вас почему-то не хватило времени. Не хорошо.
оставлять в умной таблице хотя бы одну строку данных, пусть и одни нули. Иначе макет так и будет слетать. Или не обновлять сводную после удаления значений.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Мелко написал: Autofit. на умную таблицу ListObjects я так не понял возможна или нет.
не очень понял проблему(в файле разбираться нет желания, т.к. там несколько столбцов и кодов), но возможность автоподбора высоты строк решается проставлением галочки "Форматирование строк" при установке защиты. И соответственно "Форматирование столбцов" для автободбора ширины столбца.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Leming написал: начал думать в сторону временной копии листа
наверное, это оптимальный вариант. Точнее вариант со скрытым листом, в который будут тянуться данные для списков из той закрытой книги. Один раз, при открытии книги со списком. А закинуть в вып.список данные из закрытой книги напрямую не получится.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
а вот и нет, она не умеет работать с закрытыми файлами. Возможно, поможет что-то из этого(через VBA): Как получить данные из закрытой книги? Вариант через ExecuteExcel4Macro должен работать довольно быстро и при этом можно отсечь те ссылки, которые ссылаются на несуществующие листы или возвращающие ошибки. Например, можно обработать так:
Код
vData = ExecuteExcel4Macro(sAddress)
If Not Iserror(vData) then
range("A1").value = vData
end if
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Can't create activeX object? Если да - то у Вас явно проблема с библиотеками глубже. Надо скорее всего удалять офис полностью(с применением Fix-а от Microsoft для полного удаления всего-всего) и последующей установкой.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
А вообще уберите из кода On Error Resume Next и посмотрите, где спотыкается код. Тогда можно будет более предметно разговаривать. А сейчас можно много предположений строить.
iiiadan написал: Запустил макрос при открытом файле Excel из той же папки
это как понимать? При чем здесь так же папка или не та же? Может код приведете? Если подключились к Excel - открывать файл уже не надо, вместо строки
Код
Set xlBook = xl.workbooks.Open(filepath)
надо задать такую:
Код
Set xlBook = xl.workbooks(filepath)
где filepath это только имя книги, без полного пути: "Книга1.xlsx"
P.S. Обратите внимание на то, как оформлен мой код и как Ваш. Вернитесь в сообщение(Изменить), найдите кнопочку <...> и нажмите её, предварительно выделив листинг кода.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
gogy913 написал: меня шеф попросил помочь сделать таблицу фотографии рабочего дня, мне что ему сказать "вы знаете моральные принципы форумчан не позволяют создать инструмент вывести на чистую воду паршивую овцу"
совет прост(как и для всех профильных форумов): нет смысла нам свои личные проблемы отношений с шефом вываливать - это проблемы-то не наши и мотивировать нас жалостью на их основе не получиться, только наоборот.
Цитата
gogy913 написал: Там реально человек просто наглый
так вот про него шефу и скажите - пусть карает рублем. Это будет эффективнее, чем нам про него жаловаться Тогда может и наглость поубавится. В конце концов можно сделать лог изменений - тогда можно будет вычислить кто пакостит, если это еще неизвестно или недоказуемо. Ну и непосредственно по теме ответ-то уже получен: Excel не видит разницы между числом и датой-временем. Все, что между 0 и 1 - это время. А если еще вспомнить, что нельзя делать Copy-Paste, то вообще остается только придумать что-то макросами, но раз человек такой наглый - что мешает ему просто их не включать? Решения и этих вопросов тоже есть, но опять же - это надо заморочиться именно Вам. Но благо решения подобные на форуме были, можно поиском поискать как определитесь с оптимальным для Вас путем решения проблемы. Самый оптимальный в таких случаях вариант - оставить возможность заполнения данных исключительно через UserForm - там все действия можно контролировать куда жестче.