Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - макрос excel

Ответить
Настройки темы
VBA - макрос excel

Аватара для Maza11

Старожил


Сообщения: 284
Благодарности: 2

Профиль | Отправить PM | Цитировать


Изменения
Автор: Maza11
Дата: 01-07-2015
нужен простой макрос. в документ excel удалить два логотипа организации, уместить для печати на 1 страницу документ, сохранить и напечатать 3 копии.
Можно ли как то его применить для всех документов в конкретной папке, есть много папок по разным торг.точкам, но документ одинаковый и в каждой папке по 20-50 документов. чтобы каждый не открывать и не проделывать это все.

Пробовал записать макрос нажав на "Запись", вот такой код вышел

Код: Выделить весь код
Sub лямина2()
'
' лямина2 Макрос
'
' Сочетание клавиш: Ctrl+l
'
    Range("H4:I7").Select
    Selection.ClearContents
    ActiveSheet.Shapes.Range(Array("Picture -767")).Select
    Selection.Delete
    Application.PrintCommunication = False
    With ActiveSheet.PageSetup
        .LeftHeader = ""
        .CenterHeader = ""
        .RightHeader = ""
        .LeftFooter = ""
        .CenterFooter = ""
        .RightFooter = ""
        .LeftMargin = Application.InchesToPoints(0.236220472440945)
        .RightMargin = Application.InchesToPoints(0.236220472440945)
        .TopMargin = Application.InchesToPoints(0.393700787401575)
        .BottomMargin = Application.InchesToPoints(0.393700787401575)
        .HeaderMargin = Application.InchesToPoints(0)
        .FooterMargin = Application.InchesToPoints(0)
        .PrintHeadings = False
        .PrintGridlines = False
        .PrintComments = xlPrintNoComments
        .PrintQuality = 600
        .CenterHorizontally = False
        .CenterVertically = False
        .Orientation = xlPortrait
        .Draft = False
        .PaperSize = xlPaperA4
        .FirstPageNumber = xlAutomatic
        .Order = xlDownThenOver
        .BlackAndWhite = False
        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = 1
        .PrintErrors = xlPrintErrorsDisplayed
        .OddAndEvenPagesHeaderFooter = False
        .DifferentFirstPageHeaderFooter = False
        .ScaleWithDocHeaderFooter = True
        .AlignMarginsHeaderFooter = False
        .EvenPage.LeftHeader.Text = ""
        .EvenPage.CenterHeader.Text = ""
        .EvenPage.RightHeader.Text = ""
        .EvenPage.LeftFooter.Text = ""
        .EvenPage.CenterFooter.Text = ""
        .EvenPage.RightFooter.Text = ""
        .FirstPage.LeftHeader.Text = ""
        .FirstPage.CenterHeader.Text = ""
        .FirstPage.RightHeader.Text = ""
        .FirstPage.LeftFooter.Text = ""
        .FirstPage.CenterFooter.Text = ""
        .FirstPage.RightFooter.Text = ""
    End With
    Application.PrintCommunication = True
    ActiveWindow.SelectedSheets.PrintPreview
    ActiveWorkbook.Save
    ActiveWindow.SelectedSheets.PrintOut Copies:=3, Collate:=True, _
        IgnorePrintAreas:=False
End Sub
применять для других документов его как не открывая каждый из 492 документов ???

Отправлено: 13:17, 01-07-2015

 

Аватара для Maza11

Старожил


Сообщения: 284
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата:
Iska превысил(а) максимальный объем сохраненных персональных сообщений и не может получать новые сообщения, пока не удалит часть старых
простите за глупый вопрос, но тот макрос что вы написали его нужно в редакторе макросов Microsoft Visual Basic открыть мой макрос PERSONAL.XLSB и вставить вместо него ?

сохранил ваш код в блокноте в файл Module3.bas нажимаю запустить его, тыкаю файл в wscript.exe, ругается

Отправлено: 16:59, 01-07-2015 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Maza11:
сохранил ваш код в блокноте в файл Module3.bas нажимаю запустить его, тыкаю файл в wscript.exe, ругается »
Сохраните приведённый код в файл с расширением «.vbs». Перетащите целевую папку, содержащую файлы для обработки, на сохранённый скрипт.

Отправлено: 17:54, 01-07-2015 | #12


Аватара для Maza11

Старожил


Сообщения: 284
Благодарности: 2

Профиль | Отправить PM | Цитировать


Iska,
круто, работает, НО
1. нельзя перетащить один файл, работает только если папку перетаскивать
2. не выставляет печать по ширине документа (фото распечатанного документа https://www.dropbox.com/s/wxfgrma9oe...41.01.jpg?dl=0 )

p.s. в остальном все работает как надо. логотип и строку под ним удаляет, внизу строку "автор печати" удаляет, печатает 3 копии

Отправлено: 08:43, 02-07-2015 | #13


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Maza11:
1. нельзя перетащить один файл, работает только если папку перетаскивать »
Не было заказано. Было:
Цитата Maza11:
Можно ли как то его применить для всех документов в конкретной папке, »
Если хотите и так, и этак, то вот:
Скрытый текст
Код: Выделить весь код
Option Explicit

Dim strSourceFileSystemObject

Dim objFile
Dim objExcel


If WScript.Arguments.Count = 1 Then
	strSourceFileSystemObject = WScript.Arguments.Item(0)
	
	With WScript.CreateObject("Scripting.FileSystemObject")
		If .FolderExists(strSourceFileSystemObject) Then
			Set objExcel = Nothing
			
			For Each objFile In .GetFolder(strSourceFileSystemObject).Files
				Select Case LCase(.GetExtensionName(objFile.Name))
					Case "xls", "xlsx"
						If objExcel Is Nothing Then
							Set objExcel = WScript.CreateObject("Excel.Application")
						End If
						
						WorkingWithWorkbook objExcel, objFile
					Case Else
						' Nothing to do
				End Select
			Next
			
			If Not objExcel Is Nothing Then
				objExcel.Quit
				Set objExcel = Nothing
			End If
		ElseIf .FileExists(strSourceFileSystemObject) Then
			Set objFile = .GetFile(strSourceFileSystemObject)
			
			Select Case LCase(.GetExtensionName(objFile.Name))
				Case "xls", "xlsx"
					With WScript.CreateObject("Excel.Application")
						WorkingWithWorkbook .Application, objFile
						
						.Quit
					End With
				Case Else
					WScript.Echo "Source file [" & strSourceFileSystemObject & "] probably has not an Excel Workbook."
			End Select
			
			Set objFile = Nothing
		Else
			WScript.Echo "Can't find source file or source folder [" & strSourceFileSystemObject & "]."
			WScript.Quit 2
		End If
	End with
Else
	WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file or source folder>"
	WScript.Quit 1
End If

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub WorkingWithWorkbook(objExcel, objFile)
	WScript.Echo objFile.Path
	
	With objExcel
		With .Workbooks.Open(objFile.Path)
			With .Worksheets.Item(1)
				.Shapes.Item("Picture -767").Delete
				.Range("H4:I6").Select
				objExcel.Selection.ClearContents
				.Range("A1").Select
				
				objExcel.Union(.Rows(.UsedRange.Rows.Count).EntireRow, .Rows(.UsedRange.Rows.Count -1).EntireRow).Delete
				
				With .PageSetup
					.Zoom = False
					.FitToPagesWide = 1
				End With
				
				.PrintOut ,, 3
			End With
			
			.Save
			.Close
		End With
	End With
End Sub
'=============================================================================


Я, кстати, в предыдущем коде забыл сделать выход из Excel и сослепу оставил после копирования куска кода вместо очистки объекта — его создание.

Цитата Maza11:
2. не выставляет печать по ширине документа (фото распечатанного документа https://www.dropbox.com/s/wxfgrma9oe...41.01.jpg?dl=0 ) »
Я вроде как выставляю:
Код: Выделить весь код
.PageSetup.FitToPagesWide = 1
Давайте попробуем добавить ещё и рекомендуемое «.Zoom = False».
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:57, 02-07-2015 | #14


Аватара для Maza11

Старожил


Сообщения: 284
Благодарности: 2

Профиль | Отправить PM | Цитировать


Идеально, печатает по ширине листа теперь.

Один файл перетягиваеш - работает, два или более - Usage: cscript.exe//nologo "Module.vbs" <Soutce file or source folder>
папку перетягиваеш - работает.
Но то такое, главное такой титанический труд занимавший пол часа, теперь занимает одну минуту. понажимать ОК и все.


p.s. и последняя "хотелка"

попробовал убрать
Код: Выделить весь код
End With
				
				.PrintOut ,, 3
чтобы был еще один скрипт, который делал бы все тоже самое но непечатал. Ругается так на синтаксическую ошибку при выполнении

и еще тогда пусть будет отдельный скрипт который бы просто печатал по 3 копии документа XLS при перетягивании на него.

Чтобы уже на все случаи жизни.

Отправлено: 10:31, 02-07-2015 | #15


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Maza11:
два или более - »
Maza11, вот бы Вы заранее определились, а? Хотелки желательно озвучивать сразу.

Цитата Maza11:
Usage: cscript.exe//nologo "Module.vbs" <Soutce file or source folder> »
Дабы не ошибаться при ручном наборе, используйте «Ctrl-C» для копирования содержимого диалогового окна типа MessageBox.


Цитата Maza11:
понажимать ОК и все. »
Если будете использовать «cscript.exe» (будете использовать его напрямую, указывая в командной строке, або назначите его хостом по умолчанию для скриптов WSH) — нажимать «OK» не понадобится, сообщения будут выводиться в окно консоли. Либо можете просто закомментировать уведомление «WScript.Echo objFile.Path» в процедуре «WorkingWithWorkbook()».

Пробуйте:
Скрытый текст
Код: Выделить весь код
Option Explicit

Dim objExcel

Dim strSourceFileSystemObject
Dim objFile


If WScript.Arguments.Count > 0 Then
	With WScript.CreateObject("Scripting.FileSystemObject")
		Set objExcel = Nothing
		
		For Each strSourceFileSystemObject In WScript.Arguments
			If .FolderExists(strSourceFileSystemObject) Then
				For Each objFile In .GetFolder(strSourceFileSystemObject).Files
					WorkingWithWorkbook objFile, .GetExtensionName(objFile.Name)
				Next
			ElseIf .FileExists(strSourceFileSystemObject) Then
				WorkingWithWorkbook .GetFile(strSourceFileSystemObject), .GetExtensionName(strSourceFileSystemObject)
			Else
				WScript.Echo "Can't find source file or source folder [" & strSourceFileSystemObject & "]."
			End If
		Next
		
		If Not objExcel Is Nothing Then
			objExcel.Quit
			Set objExcel = Nothing
		End If
	End With
Else
	WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file or source folder> [<Source file or source folder> [...]]"
	WScript.Quit 1
End If

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub WorkingWithWorkbook(objFile, strExtension)
	Select Case LCase(strExtension)
		Case "xls", "xlsx"
			WScript.Echo objFile.Path
			
			If objExcel Is Nothing Then
				Set objExcel = WScript.CreateObject("Excel.Application")
			End If
			
			With objExcel
				With .Workbooks.Open(objFile.Path)
					With .Worksheets.Item(1)
						.Shapes.Item("Picture -767").Delete
						.Range("H4:I6").Select
						.Parent.Parent.Selection.ClearContents
						.Range("A1").Select
						
						.Parent.Parent.Union(.Rows(.UsedRange.Rows.Count).EntireRow, .Rows(.UsedRange.Rows.Count -1).EntireRow).Delete
						
						With .PageSetup
							.Zoom = False
							.FitToPagesWide = 1
						End With
						
						.PrintOut ,, 3
					End With
					
					.Save
					.Close
				End With
			End With
		Case Else
			WScript.Echo "Source file [" & strSourceFileSystemObject & "] probably has not an Excel Workbook."
	End Select
End Sub
'=============================================================================

Цитата Maza11:
p.s. и последняя "хотелка" … чтобы был еще один скрипт, который делал бы все тоже самое но непечатал. »
Просто закомментируйте вывод на печать в этом отдельном скрипте:
Код: Выделить весь код
						'.PrintOut ,, 3
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:50, 03-07-2015 | #16


Аватара для Maza11

Старожил


Сообщения: 284
Благодарности: 2

Профиль | Отправить PM | Цитировать


Очень благодарен Вам за помощь.

Но задача усложняется, эти чудики теперь стали присылать накладные в одном файле на 3000 строк, и нужно каждую накладную копировать оттуда и сохранять в новый файл
http://rghost.ru/private/8PfsnjH6B/f...d5d81c3d8b9f35

сможете помочь ???

Отправлено: 17:27, 03-07-2015 | #17


Аватара для Maza11

Старожил


Сообщения: 284
Благодарности: 2

Профиль | Отправить PM | Цитировать


Или научите как самому написать

Отправлено: 15:48, 04-07-2015 | #18


Аватара для Maza11

Старожил


Сообщения: 284
Благодарности: 2

Профиль | Отправить PM | Цитировать


А если у меня есть код для макроса делающий разбивающий одну большую накладную на отдельные и размещает их с номерами 01, 02, 03 .. в той же папке, помогите переделать ее на скрипт VBS т.к. у них отличается синтаксис чуть-чуть, всякие WScript добавляются, чтобы работало перетягивание файла из провдника, и накладные создавались в той же папке где файл оригинал лежит

Код: Выделить весь код
Sub Эпицентр()
    Dim fn As String, Sh As Worksheet, Sh_out As Worksheet
    Dim Fout As String, Cl As Collection
    fn = Get_FileName
    If fn = "" Then Exit Sub
    
    Application.ScreenUpdating = False
    Fout = ThisWorkbook.Path
    Set Cl = New Collection
    Set Sh = Workbooks.Open(fn).Worksheets(1)
    LastRow = Sh.Cells(Sh.Rows.Count, 1).End(xlUp).Row
    dx = Sh.Range("A1:A" & LastRow)
    ss = "1:"
    For n = 1 To LastRow
        If InStr(1, dx(n, 1), "Автор друку:", vbTextCompare) > 0 Then
            ss = ss & (n - 1)
            Cl.Add ss
            ss = (n + 1) & ":"
        End If
    Next
    For n = 1 To Cl.Count
        ThisWorkbook.Worksheets("Документ").Copy
        Set Sh_out = ActiveSheet
        Sh.Rows(Cl.Item(n)).Copy Sh_out.Range("A1")
        For Each hp In Sh_out.Shapes
            hp.Delete
        Next
        Set xx = Sh_out.Cells.Find("%!", , , xlPart)
        If Not xx Is Nothing Then xx.Value = ""
     
        Sh_out.SaveAs Filename:=Fout & "\" & n & ".xls", FileFormat:=xlExcel8
        Sh_out.Parent.Close (False)
    Next

Sh.Parent.Close (False)
  Application.ScreenUpdating = True

MsgBox "Game Over"
End Sub








Function Get_FileName(Optional ByVal Title As String = "Выберите файл для обработки", _
                      Optional ByVal FilterDescription As String = "Файлы Excel", _
                      Optional ByVal FilterExtention As String = "*.xls*") As String
    On Error Resume Next
    With Application.FileDialog(msoFileDialogOpen)    '
        .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
        .Filters.Clear: .Filters.Add FilterDescription, FilterExtention
        If .Show <> -1 Then Exit Function
        Get_FileName = .SelectedItems(1)
    End With



End Function
накладные должны быть отдельными файлами, без логотипа, без строки с процентами и автора друку и иметь вид по ширине листа, печатать их будет отдельно

Отправлено: 10:48, 07-07-2015 | #19


Аватара для Maza11

Старожил


Сообщения: 284
Благодарности: 2

Профиль | Отправить PM | Цитировать


нужно в документе менять дату
делаю так
Код: Выделить весь код
Sub WorkingWithWorkbook(objExcel, objFile)
	WScript.Echo objFile.Path
	
	With objExcel
		With .Workbooks.Open(objFile.Path)
			With .Worksheets(1).Range("A4:I4")
				.Replace:="02.07.2015", Replacement:="09.07.2015"							
			End With
			
			.Save
			.Close
		End With
	End With
End Sub
ругается 800A0400 по адресу перед .Replace, какого там оператора не хватает ???

Подскажите пожалуйста

Отправлено: 17:32, 20-07-2015 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - макрос excel

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBA - Помогите написать макрос в Excel, экспорт данных из Excel в Word. E.v.g Программирование и базы данных 7 03-05-2018 22:18
VBS/WSH/JS - исправить макрос excel oleg-sm Скриптовые языки администрирования Windows 1 09-08-2013 19:01
VBA - [решено] Макрос excel neo21 Программирование и базы данных 4 06-03-2012 22:04
Разное - Макрос Excel. KiriJolit Microsoft Office (Word, Excel, Outlook и т.д.) 0 02-12-2010 23:19
Макрос Excel работает после перезагрузки :( Guest Программирование и базы данных 1 11-05-2004 08:43




 
Переход