Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 След.
Добавить еще один лист в новую книгу, выводимую макросом
 
Спасибо, все работает!
Добавить еще один лист в новую книгу, выводимую макросом
 
Добрый день, есть макрос, который сохраняет текущий лист из открытой книги в текущую папку, присваивает ему имя из ячейки N8 и заменяет формулы значениями:
Код
Sub New ()
Dim AW As Window
    Dim CellValue As String
   Dim Path As String
   Dim FinalFileName As String
   Path = ThisWorkbook.Path & "\"
   Application.DisplayAlerts = False
       Set AW = ActiveWindow
    For Each s In AW.SelectedSheets
        Set TempWindow = AW.NewWindow
        s.Copy
        TempWindow.Close
   CellValue = Range("N8")
   FinalFileName = Path & CellValue
   ActiveWorkbook.SaveAs Filename:=FinalFileName, _
                      FileFormat:=xlOpenXMLWorkbook
   Application.DisplayAlerts = True
    Next
           For Each ws In ActiveWorkbook.Worksheets
        ws.UsedRange.Value = ws.UsedRange.Value
    Next ws
    End Sub

Лист этот имеет одинаковое имя, например "Лист1". В книге есть еще несколько листов, в том числе "Лист2". Никак не соображу как добавить в выводимый файл этот "Лист2" и также заменить формулы на нем значениями. То есть в выводимом файле должно быть 2 листа: текущий лист "Лист1" с которого запускается макрос и "Лист2"
Двухуровневая фильтрация с учетом фильтра
 
Здравствуйте, в свое время потребовалось сделать двухуровневую нумерацию в Excel вида 1, 2, 3... для заголовков и 1.1, 1.2, 1.3..., 2.1, 2.2... и т.д. для обычных строк. В примере в столбце "S" для заголовков указан критерий "заголовок" и есть столбец "T", в котором указан Объект. Для каждого объекта должна быть своя нумерация с единицы. Ранее все объекты шли в таблице по порядку и для того, чтобы сделать нумерацию воспользовался найденной в интернете пользовательской функцией "НУМЕР", которая делает двухуровневую фильтрацию по доп.столбцу, где должны быть указаны уровни фильтрации: для "1" будут выводиться 1,2,3, для "2" 1.1, 1.2, 2.1 и т.д. С помощью формулы, которая проверяла изменение объекта и переводила заголовки и пустые строки в столбце "S" в "1" и "2", нужные для работы пользовательской функции НУМЕР ранее все работало:
Код
=@ЕСЛИ(СМЕЩ(T18;-1;0)=T18;нумер(ЕСЛИ(S18="заголовок";1;2));1)
Но сейчас объекты стали "вперемешку" как в примере. И нужно, чтобы нумерация была как будто с учетом фильтра в столбце "T". Помогите, пожалуйста, поменять имеющуюся формулу или может быть проще новую формулу (без пользовательской функции), чтобы нумерация получилась как в столбце "B" в примере, как будто бы с учетом фильтра объектов в столбце "T"
Не работает макрос после применения другого
 
Sanja,
Цитата
написал:
П.С. А для чего в коде Перенос() вот такая строка?КодWith sh1.UsedRange: End With
Там определяется последняя строка:
Код
With sh1.UsedRange: End With
iLastRowPerenos = sh1.UsedRange.Row + sh1.UsedRange.Rows.Count - 1
Учился определять последнюю строку по этой статье. Ссылку на этот же сайт приводила уважаемая Ma_Ri, выше. но там как понял эта строка немного для другой цели применяется.
Для определения же последней строки автор пишет, что строка нужна для:
    Код
    Обладает некоторыми недостатками предыдущего метода. Определяет самую "дальнюю" ячейку на листе, используя при этом механизм "запоминания" тех ячеек, в которых мы работали в данном листе(включая форматирование ячейки с последующей очисткой). Следовательно попробовать обойти этот момент можно точно так же: перед определением последней строки/столбца записать строку:With ActiveSheet.UsedRange: End With
    
    Это должно переопределить границы рабочего диапазона и тогда определение последней строки/столбца сработает как ожидается, даже если до этого в ячейке содержались данные, которые впоследствии были удалены.даже если в ячейке нет видимого значения, но есть формула - UsedRange посчитает ячейку не пустойигнорирует установленный фильтр и скрытые строки, определяя последнюю ячейку даже если она скрыта

Не работает макрос после применения другого
 
Спасибо, теперь даже мне все стало понятно!
Остался последний небольшой вопрос. А возможно ли в Макросе 1 как-то относительно просто вернуть после применения .Find с параметром xlWhole, параметр xlPart, который там был изначально, чтобы дальнейшие макросы уже работали с ним "по умолчанию"?
Не работает макрос после применения другого
 
Можно еще вопрос: уважаемый Sanja, конечно, починил код.
Внес изменения в свой файл, там все посложнее, но все получилось. Признаю, что балбес, но не могу до конца понять как сейчас все работает, почему происходила ошибка.
Как понял в первом приближении: Макрос 1 где-то меняет
Цитата
параметры в диалоговом окне Найти, а изменение параметров в диалоговом окне Найти приводит к изменению сохраненных значений, которые используются, если опустить аргументы
И явное указание листа в диапазоне в макросе 2 решило эту проблему, а указание параметра LookAt:=xlPart служит "для профилактики", чтобы параметры не сохранялись в дальнейшем. Но при удалении LookAt:=xlPart:
Код
Sub Убрать_ошибку()With Worksheets("ОБЩИЙ").Range("O19:O20")
  .Replace What:="+#REF!", Replacement:=""
  .Replace What:="=#REF!", Replacement:="="
  .Replace What:="=+", Replacement:="="
End With
End Sub
опять получается ошибка
Получается моя "теория" неправильная. Не могли бы пояснить по возможности как это работает?
Не работает макрос после применения другого
 
Sanja, спасибо! Только теперь немного страшновато. Так как запускаю несколько макросов последовательно. Вдруг там тоже какие-то параметры перейдут из одного в другой...
Изменено: Валерий Анисомов - 02.10.2024 09:09:52
Не работает макрос после применения другого
 
Здравствуйте, еще раз прошу прощения за потраченное вчера время. Оказывается файл был больше 300 КБ и поэтому не прикрепился. Прилагаю его к этому сообщению. В файле 3 листа. На листе "ОБЩИЙ" 2 кнопки для запуска макросов. Если запустить сразу Макрос 2, то он работает. А если перед ним запустить Макрос 1, то нет.
Цитата
написал:
Как вариант, если в макросе 2 используется Find или Replace, то после макроса 2 запоминаются настройки поиска, и поиск происходит не так, как вы ожидаете. Это только вариант, не единственно возможная причина.
В Макросе 1 действительно используется Find, но он вроде привязан к другим листам, не к тому с которым работает Макрос 2. Скорее всего это действительно сбивает работу Макроса 2, но не понимаю, почему он сбивает настройки поиска и как побороть эту проблему не знаю
Цитата
написал:
Макрос Убрать_ошибку() работает на Активном листе. Какой лист у Вас активен после работы макроса 'Перенос' ?
Макрос 2 "Убрать_ошибку()" работает на активном в момент его запуска листе "ОБЩИЙ". В Макросе 1 "Перенос ()" по идее все диапазоны привязаны к двум листам "ВОР" и "ВОР2" и он должен одинаково работать будучи запущенным с любого листа. Запускал Макрос 1 со всех трех листов, а потом Макрос 2 с текущего листа "ОБЩИЙ". Во всех случаях Макрос 2 не срабатывает
Не работает макрос после применения другого
 
Извините, файл не прикрепился. И доступа к нему сейчас нет. Вероятно,МатросНаЗебре, прав, но сам я вряд ли найду что сбивает поиск
Если возможно, прошу модераторов удалить эту тему, завтра пересоздам с файлом. Прошу прощения
Не работает макрос после применения другого
 
Здравствуйте, проблема очень специфичная, но не понимаю почему так. Есть макрос (Макрос 1):
Код
Sub Убрать_ошибку()
Range("O19:O20").Replace What:="+#REF!", Replacement:=""
Range("O19:O20").Replace What:="=#REF!", Replacement:="="
Range("O19:O20").Replace What:="=+", Replacement:="="
End Sub
который убирает ошибку #ССЫЛКА!, то есть по сути это аналог "Найти и заменить" в Excel. Если в примере его сразу запустить (можно через кнопку Макрос 2), то он убирает ошибку #ССЫЛКА!в ячейках O19, O20.
Проблема в том, что в книге есть еще один Макрос 1 Перенос. Он переносит данные с листа "ВОР" на лист "ВОР2" по заголовку. Вроде бы он никак не связан с макросом 2, там даже прописаны листы на которых он работает и листа "ОБЩИЙ" он не затрагивает. Этот Макрос 1 нужно запускать до Макроса 2. Так вот после срабатывания Макроса 1, Макрос 2 перестает работать. Можно после запуска Макроса 1 закрыть файл, открыть его заново и запустить Макрос 2, тогда он сработает корректно, но файл не нужно закрывать по условию задачи. Может кто-то подскажет, почему так происходит. Как можно добиться последовательной работы двух макросов?
Сортировка по нескольким столбцам в VBA
 
Спасибо за разъяснение! А чтобы сортировал как во втором макросе из первого сообщения, но указав один раз диапазон возможно? Просто с таким макросом он сортирует дольше, чем если делать это автофильтром вручную, а пользоваться автофильтром в макросе страшновато (может многое меняться в файле и слететь диапазон автофильтра)
Сортировка по нескольким столбцам в VBA
 
Цитата
написал:
Разве? Похоже вы не правильно понимаете принцип данной сортировки.
Возможно. В первом сообщении 2 кода, которые работают по-разному. Не могу понять, почему это так
Сортировка по нескольким столбцам в VBA
 
Все равно неправильно сортирует же  
Сортировка по нескольким столбцам в VBA
 
Цитата
написал:
изменил данные, чтобы видеть сортировку, как минимум по 2-ум отсортировало.
Не совсем понял, может должен был быть приложен файл..
Сортировка по нескольким столбцам в VBA
 
Здравствуйте, никак не могу понять логику сортировки в VBA. Предположим нужно отсортировать таблицу по трем столбцам: сначала по "D", потом по "B" и в конце по "A"
Пробую такой макрос:
Код
Sub Sortirovka()
Range("A4:E12").Sort Key1:=Range("D4"), Order1:=xlAscending, Key2:=Range("B4"), Order2:=xlAscending, Key3:=Range("A4"), Order3:=xlAscending, Header:=xlYes
End Sub
Но он сортирует только по столбцу "D" (заданному первым)

Если переделать вот так:
Код
Sub Sortirovka()
Range("A4:E12").Sort Key1:=Range("D4"), Order1:=xlAscending, Header:=xlYes
Range("A4:E12").Sort Key1:=Range("B4"), Order1:=xlAscending, Header:=xlYes
Range("A4:E12").Sort Key1:=Range("A4"), Order1:=xlAscending, Header:=xlYes
End Sub
То сортирует правильно
Но хотелось бы понять как сортировать первым методом. Ведь не зря там есть KEY1, KEY2 и Order1, Order2 и т.д. Но почему не работает не понимаю... На всякий случай пример приложил
Поправить формулу расчета минимальной даты по условию, если часть значений пустая
 
Цитата
написал:
так?
Именно! Спасибо за помощь
[ Закрыто] ОФФ. Вопрос по форуму, в графе ответ показывает не все ответы.
 
Создал тему, в вопросах. Она создалась, но в списке тем ее нет. Повторно создал ее. И обе темы не отображаются, даже в другом браузере без авторизации на форуме. Вероятно, глючит форум
Поправить формулу расчета минимальной даты по условию, если часть значений пустая
 
Здравствуйте, Имеется таблица с датами. На соседний лист переносится сводная наименований в которой формулой
Код
=ЕСЛИ(МИН(ЕСЛИ((Col_1=A2);Col_2;""))=0;"";МИН(ЕСЛИ((Col_1=A2);Col_2;"")))
ищется минимальная дата по наименованию. Проблема в том, что если часть дат одного наименования пустая, то эта формула выводит пустоту, а нужно указать минимальную дату, по сути игнорирую пустые ячейки в таком случае. Подробнее в файле-примере. Помогите, пожалуйста, поправить формулу
Преобразование пользовательской функции в макрос
 
Цитата
написал:
Раз так, то вот
Спасибо большое!
Цитата
написал:
Но что мешает использовать функцию напрямую в макросе?
Попробую объяснить. Сейчас есть макрос, который разделяет большую таблицу по фильтру на несколько файлов. Он копирует лист в новую книгу и производит в нем различные манипуляции, а потом сохраняет как книгу Excel без поддержки макросов. При этом как понял, пользовательские функции в этом новом листе после его копирования перестают работать (там везде выводится ошибка ИМЯ), а сам макрос работает как бы пока из "старого" большого файла. При этом помимо этой функции Replace_symbols там есть другая пользовательская функция, данные для которой статичны. Там решил проблему отключив автоматический пересчет формул в книге и сохранив их как значения. А вот данные, которые Replace_symbols пересчитывает меняются в процессе преобразований на новом скопированном листе и так сделать не получается. Наверняка тут что-то можно придумать, вроде того, чтобы как-то скопировать функцию в лист, а после выполнения макроса, заменив на значения ячейку S1 и удалить пользовательскую функцию из нового файла, т.к. он должен быть XLXS без поддержки макросов. Но проще, вероятно, сделать это в макросе. Сейчас с Вашей помощи вроде все работает
Преобразование пользовательской функции в макрос
 
Здравствуйте, часто пользуюсь полезной пользовательской функцией для преобразования некоторых специфичных символов в "-" (это нужно для возможности присвоения имен файлам из ячеек):
Код
Function Replace_symbols(ByVal txt As String) As String
    st$ = "~!@/\#$%^&*|`"""
    For i% = 1 To Len(st$)
        txt = Replace(txt, Mid(st$, i, 1), "-")
    Next
    Replace_symbols = txt
End Function
Но появилась необходимость обойтись в файле без пользовательских функций. Подскажите, как преобразовать эту функцию в макрос для ячейки S1, то есть чтобы при запуске макроса, содержимое ячейки S1 преобразовывалось в соответствии с этой пользовательской функцией?
Найти первую строку с текстом
 
Цитата
написал:
Или явно указать поиск ПОСЛЕ последней ячейки диапазона - тогда поиск будет с первой ячейки указанного диапазона:
Спасибо, теперь понял логику работы этого Find
Найти первую строку с текстом
 
Цитата
написал:
Поиск начинается со СЛЕДУЮЩЕЙ ячейки
Спасибо, теперь понятно
Изменено: Валерий Анисомов - 17.09.2024 10:21:49 (Теперь понял)
Найти первую строку с текстом
 
Здравствуйте, есть таблица в которой нужно найти номер первой строки с "яблоками" в диапазоне ячеек D21:D157. Вроде все просто и одной строчкой можно найти этот номер строки:
Код
Sub Find()
MsgBox Range("D21:D157").Find("*яблок*").Row
End Sub
Но столкнулся с проблемой: в ячейке D20 содержится заголовок, в котором тоже встречается сочетание "яблок" и из-за этого, если в 21-ой строке и еще где-то содержится "*яблок*", то макрос выводит не строку 21, которую по идее должен вывести, а следующую строку с "яблок" (27 строка в примере). Если "яблоки" оставить только в ячейке D21, то строка будет определена верно как 21. Тут дело явно в том, что строка 20 тоже содержит "яблок". При этом по определенным причинам нельзя поменять критерии поиска, например, на "яблоки", и заголовок не поменять, нужно оставить как есть. Подскажите, почему если в строках 20, 21 и любой другой строки из заданного диапазона содержится "яблок", то вместо 21-ой строки выводится следующая? Ведь по идее задан конкретный диапазон ячеек где искать. И строка 20 не должна влиять на поиск
Активировать ячейки на листе, не заходя на сам лист
 
Цитата
написал:
- потому что такой способ копирует только значения, без форматирования.

Но при вводе
Цитата
написал:
Worksheets(2).Range("A1:E28") = Worksheets(2).Range("A1:E28").value  
Форматирование не слетело почему-то...
Активировать ячейки на листе, не заходя на сам лист
 
Цитата
написал:
Worksheets(2).Range("A1:E28") = Worksheets(2).Range("A1:E28").value  
Отлично работает. Самое интересное, что вначале и делал по первому же нагугленному приему замены формул значениями:
Код
ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value
Но почему-то слетало форматирование после применения. А тут все хорошо

Всем большое спасибо за помощь!
Активировать ячейки на листе, не заходя на сам лист
 
Здравствуйте, есть код, в котором работа преимущественно ведется на одном листе № 1, но нужно преобразовать на другом листе № 2 в определенном диапазоне, формулы в значения. Получилось это сделать таким образом:
Код
Worksheets(2).Activate
  Range("A1:E14").Calculate
  Range("A1:E28").Activate
     Dim smallrng As Range
     For Each smallrng In Selection.Areas
     smallrng.Value = smallrng.Value
     Next smallrng
  Range("A2").Select
  ActiveWindow.ScrollRow = 1
Worksheets(1).Activate
Пытался сделать сначала так, чтобы не активировать лист № 2, обратившись ко второму листу через With Worksheets(2), но проблема в том, что нужно сделать Range("A1:E28").Activate, а диапазон на неактивном листе не активируется. То есть нужно что-то типа:
Код
    With Worksheets(2)
     .Range("A1:E28").Activate
...
    End With.
Но  .Range("A1:E28").Activate в цикле With выдает ошибку. Первый код работает, но получаются не нужные "прыжки" с листа на лист. Можно ли как-то преобразовать код так, чтобы сделать Activate на листе 2, не заходя на лист 2?  
Изменено: Валерий Анисомов - 16.09.2024 13:46:46
Добавить второй лист в новую книгу
 
Hugo,
Код
Set shSource2 = Sheets("Новый лист")
Sheets(Array(shSource.Name, shSource2.Name)).Copy
Так заработало, спасибо!
Код
Sheets(Array(shSource.Name, "Новый лист")).Copy
Так тоже оказывается работает. Это я балбес, первый раз неправильно название листа написал (он с пробелом был в файле). Спасибо еще раз
Изменено: Валерий Анисомов - 13.09.2024 18:52:55
Добавить второй лист в новую книгу
 
Попробовал
Код
Sheets(Array(shSource.name, "Новый лист")).Copy
Не работает (
Добавить второй лист в новую книгу
 
Здравствуйте, есть макрос, который разбивает один файл на несколько других по элементам фильтра из столбца "T". Он выводит в текущую папку к основному файлу созданные новые файлы. Потребовалось добавить в каждый из этих новых файлов еще один лист, который уже содержится в исходной книге, сохранив его имя. Но никак не соображу как это сделать:

Код
Sub Разбить_по_файлам_ИЗМ()    
Dim oDic As Object, oFSO As Object    
Dim arrData(), arrSeparateItems()    
Dim TempWb As Workbook    
Dim sFolderPath As String, sFullFileName As String    
Dim LastRow As Long, i As Long, n As Long    
Dim RngData As Range, FilteredRng As Range        
If MsgBox("Разбить по файлам?", vbQuestion + vbYesNo, "Вопрос") = vbNo Then Exit Sub        
sFolderPath = ThisWorkbook.Path & "\" 'здесь укажите путь для сохранения файлов      
Application.ScreenUpdating = False       
Set oFSO = CreateObject("Scripting.FileSystemObject")    
Set oDic = CreateObject("Scripting.Dictionary")       
Dim shSource As Worksheet    
Set shSource = ActiveSheet       
Dim Application_Calculation As XlCalculation    
Application_Calculation = Application.Calculation   
Application.Calculation = xlCalculationManual       
With shSource              
If .FilterMode = True Then .ShowAllData        
LastRow = .Cells(.Rows.Count, 12).End(xlUp).Row        
arrData = .Range("T1:T" & LastRow).Value 'столбец, где нужно найти уникальные значения        
Set RngData = .Range("A1").CurrentRegion    
End With       
For i = 21 To UBound(arrData)        
If Not oDic.Exists(arrData(i, 1)) Then oDic.Add arrData(i, 1), 0&    
Next i       
arrSeparateItems() = oDic.Keys       
For n = LBound(arrSeparateItems) To UBound(arrSeparateItems)        
shSource.Copy

 



ХОТЕЛОСЬ БЫ СЮДА СКОПИРОВАТЬ ЕЩЕ ЛИСТ "Новый лист", КОТОРЫЙ СОДЕРЖИТСЯ В ИСХОДНОЙ КНИГЕ      






Set TempWb = ActiveWorkbook 
...ОПРЕДЕЛЕННЫЕ ДЕЙСТВИЯ С ЛИСТОМ, СКОПИРОВАННЫМ В ТЕКУЩУЮ КНИГУ... 
ActiveSheet.name = arrSeparateItems(n)         
sFullFileName = sFolderPath & arrSeparateItems(n) & ".xlsx"        
If oFSO.FileExists(sFullFileName) Then oFSO.Deletefile (sFullFileName)        
TempWb.SaveAs sFullFileName, FileFormat:=xlOpenXMLWorkbook 'XLSX        
TempWb.Close SaveChanges:=False    
Next n       
With ActiveSheet        
If .FilterMode = True Then .ShowAllData    
End With      
Application.Calculation = Application_Calculation    
Application.ScreenUpdating = True    
MsgBox "Файлы сохранены в " & sFolderPath, vbInformation, "Конец"
End Sub

Выделил в коде место, где текущий лист копируется в новую книгу. Хотелось бы туда же вставить еще и лист с названием "Новый лист", содержащийся в исходной книге.
То есть по смыслу что-то вроде:

Код
Sheets(Array(Новый лист", ТЕКУЩИЙ ЛИСТ ЗАДАННЫЙ СЕЙЧАС КАК ShSourse)).Copy
Надеюсь смысл передал и пример файл-пример тут вроде не нужен. Подскажите, как тут добавить этот лист?
Изменено: Валерий Анисомов - 13.09.2024 16:47:25
Сплюсовать ячейки через VBA по условию формулой
 
Здравствуйте, казалось, что вопрос должен быть распространённым, но готового решения не удалось найти. Хотелось бы через VBA в одну ячейку (в примере это "B2") сплюсовать ячейки столбца "B" по условию "заголовок" в столбце "C". Но сложность в том, что сделать это нужно формулой, то есть, чтобы в ячейке "B2" после запуска макроса получилось "=B4+B9+B13" для приложенного примера
Страницы: 1 2 3 4 След.
Наверх