2. на основании этого диапазона создаешь листы где создаёшь листы сразу фильтр по месяцам в основной таблице с копированием необходимых дат на новый лист
Код
Set ws = .Sheets.Add(After:=.Sheets(.Sheets.Count))
ws.Name = ActiveWorkbook.Sheets("name").Range("A1")
Sheets(ws.Name).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
For f = 2700 To 1 Step -1
If Cells(f, 1) <> ActiveWorkbook.Sheets("name").Range("B1") Then
'Range(Cells(i, 1), Cells(i, 2)).Select
Cells(f, 1).EntireRow.Delete
Cells.Select
End If
Next f
Добрый день В наличие были 2 темы аналогичные на форме изучил ответа не нашел мб не понял 462462(2)
изначально был макрос экспорта из эксель в word затем запуск макроса в word решил их совместить врубил tools references - ofice MS word 16 для форматирования текста перенес данный код в эксель при первичном запуске все идеально код проходит создает файл меняет форматы все отлично
но при повторном запуске макроса Word.Application. уходит в ошибку. после завершения ошибки код снова проходит. т.е работает через раз Основная ошибка идет при повторном обращении Word.Application после завершения 462 ошибки поломки код снова проходит.
Код
With objworddoc
Word.Application.ScreenUpdating = 0
Sanja написал: В общем случае, обработчик ошибок On Error не предназначен для условного перехода к выполнению каких-то подпрограмм.Для условного перехода используйте операторы GoTo или GoSubА по последнему Вашему коду, я бы так написалКодDim aRng As Range
Ту стать инструкций по операторам читал некоторых нюансов немного не понял поэтому тут и задал вопрос. Не мог понять почему почему нельзя повторно on error каждый раз использовать для перехода.
Код
On Error Resume Next
Set aRng = Range("Таблица4[проц]").SpecialCells(xlCellTypeVisible)
If Not aRng Is Nothing Then
Добрый вечер Не могу понять почему выдаётся ошибка при повторном пропуске ошибки vba
Суть макроса фильтрует в одной таблице данные несколько раз и переносит только видимые ячейки из таблицы в определённый диапазон но фильтрация может быть не только которые есть значения в таблице а даже которых нет в случае ошибки переходит к точке воспроизведения макроса. но если уже повторно назначаешь on error go to point.... то он не пропускает ошибку и не переходит к нужной точке воспроизведения а выдает ошибку срабатывания макроса <Не найдено ни одной ячейки, удовлетворяющей указанным условиям.> в файле лист 1 modul5
Код
Sub testcoppaste()
Range("Таблица3[проц]").Select
ActiveSheet.ListObjects("Таблица3").Range.AutoFilter Field:=2, Criteria1:="20"
On Error GoTo point2
Range("Таблица3[проц]").SpecialCells(xlCellTypeVisible).Select
Selection.Copy
Range("A8").Select
ActiveSheet.Paste
point2:
Range("Таблица4[проц]").Select
ActiveSheet.ListObjects("Таблица4").Range.AutoFilter Field:=2, Criteria1:="10"
On Error GoTo point3 ' тут должен был перейти на точку 3 но не переходит а выдает ошибку
Range("Таблица4[проц]").SpecialCells(xlCellTypeVisible).Select
Selection.Copy
Range("b8").Select
ActiveSheet.Paste
point3:
End Sub
Игорь написал: Функция =DIR("маска имени файла со звездочкой")
спасибо огромное все работает не знал про данную функцию запомню так как можно много где применить. только уточнить хотел а для чего $ в vba после mask$ и failname$
Код
' для ребят новичков не забудьте задать если кому понадобиться данная статья
dim mask as string
dim filename as string
любой файл из данного диапазона от 0000 до 2459 но файл один. поэтому и ищу помощи как оптимизировать код в строке
Код
sAttachment = "C:\1\check1043.txt"
'пример файл в папке "C:\1\check1043.txt"
' завтра файл в папке "C:\1\check1158.txt"
прописать так не подхватывает файлы
sAttachment = "C:\1\check****.txt"
sAttachment = "C:\1\check####.txt"
sAttachment = "C:\1\check*.txt"
sAttachment = "C:\1\check#.txt"
'как прописать чтоб подхватывал любой файлс с названием sAttachment = "C:\1\check****.txt" в котором **** могут быть любые 4 символа
'вот это интересует
если есть любой файл у которого начало идет sAttachment = "C:\1\check*.txt" и + 4 неизвестных символа которые всегда есть
один файл но последние 4 символа рандомные прописано много вложений чтоб он нашел нужный один файл. то есть одна и та-же строка дублируется с разными окончаниями 0001;0002;0003, для того что бы он нашел нужный файл с неизвестными последними 4 символами.
макрос должен понимать по первоначальному имени файла
Код
.attachments.Add "\\ip\TNS_Loyalty\GOODSANDGROUPS_Import_AddOrUpdate_" & ActiveWorkbook.Sheets("Лист1").Range("A1") & "1544.xml"
' т.е если содержит начало .attachments.Add "\\10.35.24.68\TNS_Loyalty\GOODSANDGROUPS_Import_AddOrUpdate_" & ActiveWorkbook.Sheets("Лист1").Range("A1") & ".xml"
' прикрепляет любой файл из папки с началом названия .attachments.Add "\\10.35.24.68\TNS_Loyalty\GOODSANDGROUPS_Import_AddOrUpdate_" & ActiveWorkbook.Sheets("Лист1").Range("A1") & "****.xml"
' с последними любыми цифрами
С сервера подгружаться выгрузки с определенным названием датой и временем. время выгрузки в сетевую папку рандомное т.е. последний 4 символа неизвестный. .файл с сервера выгружается один с уникальным названием
код примера с прикреплением нескольких файлов. тут с условием если вложение не пусто то поиск следующих вложений. список вложений сократил чтоб не был очень длинный код
суть полного кода при пк врубается по времени через 5 мин срабатывает макрос который отправляет сообщение с вложением а затем вырубается пк скидывал первичный код так как одно вложение с неизвестными последними 4 символами
Код
Sub Send_Mail_1()
Dim objOutlookApp As Object, objMail As Object
Dim sTo As String, sSubject As String, sBody As String, sAttachment As String
Application.ScreenUpdating = False
On Error Resume Next
'пробуем подключиться к Outlook, если он уже открыт
Set objOutlookApp = GetObject(, "Outlook.Application")
Err.Clear 'Outlook закрыт, очищаем ошибку
If objOutlookApp Is Nothing Then
Set objOutlookApp = CreateObject("Outlook.Application")
End If
'раскомментировать строку, если в Outlook несколько учетных записей и нужно подключиться к конкретной(только если Outlook закрыть)
' [параметры]: Session.Logon "имя профиля","пароль",[показывать окно выбора профиля], [запускать в новой сессии]
'objOutlookApp.Session.Logon "profile","1234",False, True
Set objMail = objOutlookApp.CreateItem(0) 'создаем новое сообщение
'если не получилось создать приложение или экземпляр сообщения - выходим
If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub
sTo = "" 'Кому(можно заменить значением из ячейки - sTo = Range("A1").Value)
sSubject = "Автоотправка tns" 'Тема письма(можно заменить значением из ячейки - sSubject = Range("A2").Value)
sBody = "Добрый день! прилагаю выгрузку tns. Excel-VBA ежедневная автоматическая отправка на данное сообщение просьба не отвечать. Обновление: файл check.txt необходим для подхвата нескольких файлов" 'Текст письма(можно заменить значением из ячейки - sBody = Range("A3").Value)
sAttachment = "C:\1\check.txt" 'Вложение(полный путь к файлу. Можно заменить значением из ячейки - sAttachment = Range("A4").Value)
'создаем сообщение
With objMail
.To = sTo 'адрес получателя
.CC = "" 'адрес для копии avsemashko@oilmurman.ru
.BCC = "" 'адрес для скрытой копии
.Subject = sSubject 'тема сообщения
.Body = sBody 'текст сообщения
'.HTMLBody = sBody 'если необходим форматированные текст сообщения(различные шрифты, цвет шрифта и т.п.)
'добавляем вложение, если файл по указанному пути существует(dir проверяет это)
If sAttachment <> "" Then
If Dir(sAttachment, 16) <> "" Then
.attachments.Add sAttachment 'просто вложение
.attachments.Add "\\ip\TNS_Loyalty\GOODSANDGROUPS_Import_AddOrUpdate_" & ActiveWorkbook.Sheets("Лист1").Range("A1") & "1544.xml"
.attachments.Add "\\ip\TNS_Loyalty\GOODSANDGROUPS_Import_AddOrUpdate_" & ActiveWorkbook.Sheets("Лист1").Range("A1") & "1545.xml"
.attachments.Add "\\ip\TNS_Loyalty\GOODSANDGROUPS_Import_AddOrUpdate_" & ActiveWorkbook.Sheets("Лист1").Range("A1") & "1546.xml"
.attachments.Add "\\ip\TNS_Loyalty\GOODSANDGROUPS_Import_AddOrUpdate_" & ActiveWorkbook.Sheets("Лист1").Range("A1") & "1543.xml"
.attachments.Add "\\ip\TNS_Loyalty\GOODSANDGROUPS_Import_AddOrUpdate_" & ActiveWorkbook.Sheets("Лист1").Range("A1") & "1547.xml"
.attachments.Add "\\ip\TNS_Loyalty\GOODSANDGROUPS_Import_AddOrUpdate_" & ActiveWorkbook.Sheets("Лист1").Range("A1") & "1144.xml"
.attachments.Add "\\ip\TNS_Loyalty\GOODSANDGROUPS_Import_AddOrUpdate_" & ActiveWorkbook.Sheets("Лист1").Range("A1") & "1145.xml"
.attachments.Add "\\ip\TNS_Loyalty\GOODSANDGROUPS_Import_AddOrUpdate_" & ActiveWorkbook.Sheets("Лист1").Range("A1") & "1146.xml"
.attachments.Add "\\ip\TNS_Loyalty\GOODSANDGROUPS_Import_AddOrUpdate_" & ActiveWorkbook.Sheets("Лист1").Range("A1") & "1147.xml"
.attachments.Add "\\ip\TNS_Loyalty\GOODSANDGROUPS_Import_AddOrUpdate_" & ActiveWorkbook.Sheets("Лист1").Range("A1") & "1153.xml"
'чтобы отправить активную книгу вместо sAttachment указать ActiveWorkbook.FullName
End If
End If
.Send 'Display, если необходимо просмотреть сообщение, а не отправлять без просмотра
End With
это решение если несколько файлов но имя так же полностью прописанно
файл прикрепил строка в модуле sAttachment = "C:\GOODSANDGROUPS_Import_AddOrUpdate_20210517####" & ".xml" 'Вложение(полный путь к файлу. Можно заменить значением из ячейки - sAttachment = Range("A4").Value) убираем #### на нужные цифры работает Option Explicit
Код
Sub Send_Mail()
Dim objOutlookApp As Object, objMail As Object
Dim sTo As String, sSubject As String, sBody As String, sAttachment As String
Application.ScreenUpdating = False
On Error Resume Next
'пробуем подключиться к Outlook, если он уже открыт
Set objOutlookApp = GetObject(, "Outlook.Application")
Err.Clear 'Outlook закрыт, очищаем ошибку
If objOutlookApp Is Nothing Then
Set objOutlookApp = CreateObject("Outlook.Application")
End If
'раскомментировать строку, если в Outlook несколько учетных записей и нужно подключиться к конкретной(только если Outlook закрыть)
' [параметры]: Session.Logon "имя профиля","пароль",[показывать окно выбора профиля], [запускать в новой сессии]
'objOutlookApp.Session.Logon "profile","1234",False, True
Set objMail = objOutlookApp.CreateItem(0) 'создаем новое сообщение
'если не получилось создать приложение или экземпляр сообщения - выходим
If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub
sTo = "" 'Кому(можно заменить значением из ячейки - sTo = Range("A1").Value)
sSubject = "Автоотправка" 'Тема письма(можно заменить значением из ячейки - sSubject = Range("A2").Value)
sBody = "Привет от Excel-VBA" 'Текст письма(можно заменить значением из ячейки - sBody = Range("A3").Value)
sAttachment = "C:\GOODSANDGROUPS_Import_AddOrUpdate_20210517####" & ".xml" 'Вложение(полный путь к файлу. Можно заменить значением из ячейки - sAttachment = Range("A4").Value)
'создаем сообщение
With objMail
.To = sTo 'адрес получателя
.CC = "" 'адрес для копии
.BCC = "" 'адрес для скрытой копии
.Subject = sSubject 'тема сообщения
.Body = sBody 'текст сообщения
'.HTMLBody = sBody 'если необходим форматированные текст сообщения(различные шрифты, цвет шрифта и т.п.)
'добавляем вложение, если файл по указанному пути существует(dir проверяет это)
If sAttachment <> "" Then
If Dir(sAttachment, 16) <> "" Then
.Attachments.Add sAttachment 'просто вложение
'чтобы отправить активную книгу вместо sAttachment указать ActiveWorkbook.FullName
End If
End If
.Send 'Display, если необходимо просмотреть сообщение, а не отправлять без просмотра
End With
Set objOutlookApp = Nothing: Set objMail = Nothing
Application.ScreenUpdating = True
End Sub
но последние 4 знака динамические и меняются постоянно & "****.xml" & "*.xml" пробовал менять концовки на **** но тогда подхват файла идет если есть в конце названия **** как правильно прописать рандомное окончание чтоб не делать дубликаты
Dim path_rik_fail As String Dim save_path_rik_fail As String Dim namerikDoc As String Dim objwrdapp As Object Dim objworddoc As Object 'activeworkbook.Path &"\" ткущее местоположение
path_rik_fail = ThisWorkbook.Sheets("экспорт_ворд").Range("rik_fail") ' указываем страницу и путь к нашему файлу save_path_rik_fail = ActiveWorkbook.Path & "\" ' указываем путь и путь к сохранению файла save_path_rik_fail = ThisWorkbook.Sheets("экспорт_ворд").Range("rik_save_fail") вручную namerikDoc = "Протокол рик шаблон" ' название нашего шаблона Set objwrdapp = CreateObject("word.application") ' создание вордовского документа из приложения objwrdapp.Visible = True 'делали наш объект видимым Set objworddoc = objwrdapp.documents.Open(path_rik_fail & namerikDoc & ".docx") 'прописываем путь к нашему объекту для открытия. With objworddoc .bookmarks("д_инв").Range.Text = ThisWorkbook.Sheets("рик").Range("i2") ' в нашу закладку д_инв заносим нашу дату. .bookmarks("д_инв1").Range.Text = ThisWorkbook.Sheets("рик").Range("i2")
End With objworddoc.SaveAs Filename:=save_path_rik_fail & "Рик от " & ThisWorkbook.Sheets("рик").Range("i2") & " " & ThisWorkbook.Sheets("рик").Range("h2") & ".docx"
End Sub
хотел бы откорректировать но знаний у самоучки не хватает.
В чем суть корректировки у меня все файлы лежать в определенных папках путях c них эксель подвязывает шаблоны . но хотелось бы каждых образец шаблона ворд был внутри экселя. и ненужно было перепривязывать пути.
когда вставляешь объект ворд в эксель он становиться shape. то есть объектом похож на картинку.
как пытался решить данную проблему: 1. вариант подвязать пути напрямую к объекту но тогда закладки .bookmarks("д_инв1").Range.Text = ThisWorkbook.Sheets("рик").Range("i2") становятся ошибочными
2. вариант вставлял данные шаблоны как объекты в эксель. и пытался из экселя данные объекты экспортировать их как файл word в текущую папку. (провал не получилось) а затем путем из текущей директории подхватывать данные шаблоны.
Вдруг кто знает как можно сделать 1. настроить прямую подвязку из объектов (ворд) в excele или 2 вариант сохраненный объект в экселе экспортировать в текущую папку сохранив формат ворда а от туда я уже сам восстановлю подвязку пути шаблона