PATRI0T Пользователь Сообщений: 5 |
#1 05.10.2017 11:28:30 Добрый день. Что делаю:
Этой процедурой удаляю макросы (пытаюсь)
В результате Вопрос. Прикрепленные файлы
|
||||
_Igor_61 Пользователь Сообщений: 3007 |
Можно. Побаловался макрорекордером и у меня получилось |
PATRI0T Пользователь Сообщений: 5 |
#3 06.10.2017 08:17:17 Спасибо за ответ А зачем это?
|
||
Александр П. Пользователь Сообщений: 1147 |
#4 06.10.2017 08:53:07 PATRI0T, Код ниже удаляет весь код во всех модулях активной книги.
|
||
_Igor_61 Пользователь Сообщений: 3007 |
#5 06.10.2017 09:07:38
Покажите Ваш файл с кодом, который не работает. Смею предположить, что Вы что-то не так или не туда вставили или что-то не так сделали, а так же невнимательно посмотрели код, иначе не возникло бы вопроса:[QUOTE]PATRI0T написал: А зачем это? Kill Addr & «Файл без макросов 2007.xlsx[/CODE] |
||
_Igor_61 Пользователь Сообщений: 3007 |
Александр, здравствуйте! Но тогда пользователю нужно лезть в параметры, ставить доверенный доступ и перезапускать приложение, что для пользователя, думаю не очень удобно. Поэтому по-моему проще это все сделать просто пересохранением файлов, а потом лишний файл удалить. ИМХО, конечно |
_Igor_61, ну так, наше дело предложить вариант Изменено: Александр П. — 06.10.2017 10:19:58 |
|
sokol92 Пользователь Сообщений: 4445 |
Уважаемый PATRI0T, в приложенном к сообщению файле макросов нет, зато есть два «битых» имени книги. Удалите их через «Диспетчер имен» и проблема с открытием должна уйти. |
_Igor_61 Пользователь Сообщений: 3007 |
#9 07.10.2017 00:34:38
Да, если это так, то не удивительно, что у него мой макрос не работает, если он его в xls помещает. Но почему-то он про этот момент молчит. А я решил, что у него изначальный файл в xlsm, глядя на картинку |
||
LAD Пользователь Сообщений: 22 |
Вы копируете лист со всеми потрохами. Копируйте только то, что Вам нужно. Сделайте новый лист и на него скопируйте диапазон ячеек. Изменено: LAD — 07.10.2017 04:58:21 |
RAN Пользователь Сообщений: 7091 |
#11 07.10.2017 09:48:49
_Igor_61, Вставьте это в модуль копируемого листа, и вау съедят мыши.
Изменено: RAN — 07.10.2017 10:51:58 |
||||
_Igor_61 Пользователь Сообщений: 3007 |
RAN, не, не съедят, еще больше «ВАУ»! |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
$ в имени переменной — это тип (аналог as String). Вот табличка соответствий: // xlCSVWindows = 23; // основные константы 2007 // 57 = PDF |
_Igor_61 Пользователь Сообщений: 3007 |
Блин, как же я люблю этот форум! Каждый раз какое-то «ВАУ» для себя нахожу! Юрий М, спасибо большое! Сохранил Ваши пояснения, они очень пригодятся в дальнейшем. Не знал, что части кода можно цифрами задавать (хотя, нет, пример уже знаю — в MsgBox 64, 32, 48), это, видимо, что-то подобное, если правильно понимаю. Т.е. вместо «xlOpenXMLWorkbook (without macro’s in 2007-2010, xlsx) » пишем «51» и выполняется это действие, так? И я так понимаю, что RAN своим кодом вносит изменения в XML? Дальше — вообще не понимаю — ведь если открыть файл через WinRAR, там же куча папок и файлов XML, т.е. в данном случае через «51» производятся манипуляции с конкретным XML файлом, «51» его находит и выполняет свою задачу? |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
XML тут нет ) Просто заменяем длинную строку числом ) |
_Igor_61 Пользователь Сообщений: 3007 |
xlOpenXMLWorkbook — тогда это просто указание на книгу xlsx 2007-2010, этим кодом ее открываем? |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Нет, открываем по имени, а это указание ТИПА файла — книга без макросов. |
_Igor_61 Пользователь Сообщений: 3007 |
А, кажется понял: ActiveWorkbook.SaveAs sfName1, 51 — сохраняем активную книгу с заданным именем (sfName1) в xlsx (xlOpenXMLWorkbook (without macro’s in 2007-2010, xlsx) . И равнозначно — можно записать текстом «xlOpenXMLWorkbook (without macro’s in 2007-2010, xlsx», а можно «51». Я правильно понимаю? |
Николай Пользователь Сообщений: 229 |
RAN, ваш макрос в личную книгу макросов. Что нужно изменить что бы макрос заработал из личной книги макросов. Из листа текущей книги отрабатывает корректно. Изменено: Николай — 07.10.2017 19:42:37 |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
|
_Igor_61 Пользователь Сообщений: 3007 |
|
RAN Пользователь Сообщений: 7091 |
sfName1 =
ActiveWorkbook.FullName Изменено: RAN — 07.10.2017 20:30:39 |
RAN Пользователь Сообщений: 7091 |
_Igor_61, |
Николай Пользователь Сообщений: 229 |
Кнопка цитирования не для ответа [МОДЕРАТОР] sfName1 = ActiveWorkbook.FullName |
Николай Пользователь Сообщений: 229 |
#25 07.10.2017 21:46:53 На тестовой книге.
И скрин ошибки. Прикрепленные файлы
|
||
Николай Пользователь Сообщений: 229 |
#26 07.10.2017 21:49:24 Опа.
Решило проблему. |
||
Николай Пользователь Сообщений: 229 |
#27 08.10.2017 09:51:08 Вот как стал выглядеть код в итоге.
Огромная благодарность RAN, за его код сохранения файлов. Изменено: Николай — 08.10.2017 12:38:36 |
||
LAD Пользователь Сообщений: 22 |
#28 08.10.2017 14:57:17 Не думал, что можно так сильно извратить. |
1 / 1 / 1 Регистрация: 26.04.2014 Сообщений: 119 |
|
1 |
|
Сохранить файл без макросов10.02.2015, 17:16. Показов 7605. Ответов 7
Есть один файл, с одним листом. Называется он oo.xls. Как его сохранить как ooo.xls без макросов, и закрыть?Windows(«oo.xls»).SaveAs ooo.xls сохраняет его с макросами.
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
10.02.2015, 17:29 |
2 |
Если Эксель позволяет — сохраните как xlsx, закройте, затем можно открыть и сохранить как xls.
0 |
1 / 1 / 1 Регистрация: 26.04.2014 Сообщений: 119 |
|
10.02.2015, 17:32 [ТС] |
3 |
не позволяет.
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
10.02.2015, 18:04 |
4 |
Для 2003 есть патч.
0 |
2670 / 786 / 176 Регистрация: 14.01.2013 Сообщений: 3,676 |
|
10.02.2015, 19:24 |
5 |
Если сам лист не содержит кода макросов, то создать новую книгу, скопировать туда лист и сохранить. Если лист с кодом, то данные с листа скопировать в новую книгу, с сохранением оформления.
0 |
0 / 0 / 0 Регистрация: 29.05.2019 Сообщений: 10 |
|
03.09.2019, 09:53 |
8 |
поправка предыдущий пример выдает ошибку. формат — xlOpenXMLWorkbook
0 |
For this answer, I’m assuming that by Excel macro-enabled template, you mean a xltm file. I also guess that what you mean by «new document» is the document that is generated when a user double-clicks on the xtlm file (hence this new file has no location on since it hasn’t been saved yet).
To solve your issue, you could use a custom SaveAs window (Application.GetSaveAsFilename
) to have more control on how the user saves the file when the Workbook_BeforeSave
event macro gets called.
Here is how to implement it:
1 — Copy this code into a new module.
Option Explicit
Sub SaveAsCustomWindow()
Const C_PROC_NAME As String = "SaveAsCustomWindow"
Dim strFullFileName As String, strPreferedFolder As String, strDefaultName As String
Dim UserInput1 As Variant, UserInput2 As Variant
Dim isValidName As Boolean, isFileClosed As Boolean, isWorkbookClosed As Boolean
Dim strFilename As String, strFilePath As String
'To avoid Warning when overwriting
Application.DisplayAlerts = False
'Disable events (mostly for the BeforeSave event) to avoid creating infinite loop
Application.EnableEvents = False
On Error GoTo ErrHandler
'Customizable section
strDefaultName = ThisWorkbook.Name
strPreferedFolder = Environ("USERPROFILE")
Do While isWorkbookClosed = False
Do While isFileClosed = False
Do While isValidName = False
UserInput1 = Application.GetSaveAsFilename(InitialFileName:=strPreferedFolder & "" & strDefaultName, FileFilter:="Excel Workbook (*.xlsx),*.xlsx")
If UserInput1 = False Then
GoTo ClosingStatements 'This is important to take care of the case when the user presses cancel
Else
strFullFileName = UserInput1
End If
strFilename = Right(strFullFileName, Len(strFullFileName) - InStrRev(strFullFileName, ""))
strDefaultName = strFilename
strFilePath = Left(strFullFileName, InStrRev(strFullFileName, "") - 1)
strPreferedFolder = strFilePath
'If the file exist, ask for overwrite permission
If Dir(strFullFileName) <> "" Then
UserInput2 = MsgBox(strFilename & " already exists." & vbNewLine & "Do you want to overwrite?", vbYesNoCancel Or vbExclamation)
If UserInput2 = vbNo Then
isValidName = False
ElseIf UserInput2 = vbYes Then
isValidName = True
ElseIf UserInput2 = vbCancel Then
GoTo ClosingStatements
Else
GoTo ClosingStatements
End If
Else
isValidName = True
End If
Loop
'Check if file is actually open
If isFileOpen(strFullFileName) Then
MsgBox "The workbook you want to overwrite is currently open. Choose a different name, or close the workbook before saving.", vbExclamation
isValidName = False
isFileClosed = False
Else
isFileClosed = True
End If
Loop
'Check if an opened workbook has the same name
If isWorkbookOpen(strFilename) Then
MsgBox "You cannot save this workbook with the same name as another open workbook or add-in. Choose a different name, or close the other workbook or add-in before saving.", vbExclamation
isValidName = False
isFileClosed = False
isWorkbookClosed = False
Else
isWorkbookClosed = True
End If
Loop
ThisWorkbook.SaveAs Filename:=strFullFileName, FileFormat:=xlOpenXMLWorkbook
ClosingStatements:
Application.EnableEvents = True
Application.DisplayAlerts = True
Exit Sub
ErrHandler:
Call MsgBox("Run-time error '" & Err.Number & "': " & Err.Description & vbNewLine & _
"While running: " & C_PROC_NAME & IIf(Erl <> 0, vbNewLine & "Error Line: " & Erl, "")
GoTo ClosingStatements
End Sub
Function isFileOpen(ByVal Filename As String) As Boolean
Dim ff As Long, ErrNo As Long
On Error Resume Next
ff = FreeFile()
Open Filename For Input Lock Read As #ff
Close ff
ErrNo = Err
On Error GoTo 0
Select Case ErrNo
Case 0: isFileOpen = False
Case 70: isFileOpen = True
End Select
End Function
Function isWorkbookOpen(ByVal Filename As String) As Boolean
Dim wb As Workbook, ErrNo As Long
On Error Resume Next
Set wb = Workbooks(Filename)
ErrNo = Err
On Error GoTo 0
Select Case ErrNo
Case 0: isWorkbookOpen = True
Case Else: isWorkbookOpen = False
End Select
End Function
Explanation of part 1: This whole thing might seem a bit overkill, but all the error handling is important here to take into account potential errors and make sure that the setting for Application.EnableEvents
is turned back to TRUE
even if an error occurs. Otherwise, all event macros will be disabled in your Excel application.
2 — Call the SaveAsCustomWindow
procedure inside the Workbook_BeforeSave event procedure like this:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'Your code
If ThisWorkbook.Path = "" Then
SaveAsCustomWindow
Cancel = True
End If
End Sub
Note that we need to set the variable Cancel = True in order to prevent the default SaveAs window to show up. Also, the if statement is there to make sure that the custom SaveAs window will only be used if the file has never been saved.
У нас есть лист Excel с некоторыми формулами и макросами. Мы хотим сохранить данные в виде другого листа Excel без формул и макросов, прежде чем запускать макросы на текущем листе.
Следует просто сохранить значения. Один из способов — скопировать все данные и вставить их как значения в другой лист Excel и сохранить их. Но есть ли другой простой способ сделать это?
изменён Sathyajith Bhat53k
Это двухступенчатый процесс
A. Прокрутите все листы и скопируйте ячейки, а затем введите специальные значения (не нужно копировать их на другой лист)
Sub Sample()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Cells.Copy
ws.Cells.PasteSpecial xlPasteValues
Next
Application.CutCopyMode = False
End Sub
Если вы не хотите идти по VBA, вам придется вручную скопировать и выполнить PasteSpecial. Как только вышеперечисленное сделано
Б. Вы можете избавиться от макросов, сохранив файл как .xlsx
. Вам придется закрыть и снова открыть файл. Таким образом, ваш оригинальный файл останется нетронутым.
ответ дан Siddharth Rout387
Перейдите в раздел «Данные» на ленте вверху Excel, нажмите на ссылку «Изменить ссылки» (в части соединений этой панели инструментов около середины, а затем разорвите ссылку для каждой увиденной ссылки.