Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Работа с шаблоном. - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Работа с шаблоном.
RAN Дата: Понедельник, 21.10.2013, 14:54 | Сообщение № 1
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Приветствую!
Сделал книгу с макросами в формате xltm. (Ни разу еще не пробовал).
Workbook_BeforeSave удаляю лишний лист, далее - сохранение в xlsx.

При попытке открыть xlsx кричит, что файл сломан. Правда открывается.

Восстановленные записи: Представление из части /xl/worksheets/sheet1.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
- <recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<logFileName>error023560_02.xml</logFileName>
<summary>Обнаружены ошибки в файле "D:\Калькуляция\Сравнение_шаблон_V11.xlsx"</summary>
- <repairedRecords summary="Вот список внесенных исправлений:">
<repairedRecord>Восстановленные записи: Представление из части /xl/worksheets/sheet1.xml</repairedRecord>
</repairedRecords>
</recoveryLog>

Как бы проблему обрулить?


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеПриветствую!
Сделал книгу с макросами в формате xltm. (Ни разу еще не пробовал).
Workbook_BeforeSave удаляю лишний лист, далее - сохранение в xlsx.

При попытке открыть xlsx кричит, что файл сломан. Правда открывается.

Восстановленные записи: Представление из части /xl/worksheets/sheet1.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
- <recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<logFileName>error023560_02.xml</logFileName>
<summary>Обнаружены ошибки в файле "D:\Калькуляция\Сравнение_шаблон_V11.xlsx"</summary>
- <repairedRecords summary="Вот список внесенных исправлений:">
<repairedRecord>Восстановленные записи: Представление из части /xl/worksheets/sheet1.xml</repairedRecord>
</repairedRecords>
</recoveryLog>

Как бы проблему обрулить?

Автор - RAN
Дата добавления - 21.10.2013 в 14:54
RAN Дата: Понедельник, 21.10.2013, 16:36 | Сообщение № 2
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Проблема рассосалась совершенно неожиданным образом.
Оказалось, проблема не xltm, a xlsb. После пересохранения xlsb - xlsm - xltm все стало работать.
Но возникла другая - при запуске шаблона на работает
[vba]
Код
.InitialFileName = ThisWorkbook.Path
[/vba]
ввиду отсутствия последнего.
Как бы здесь исхитриться?


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеПроблема рассосалась совершенно неожиданным образом.
Оказалось, проблема не xltm, a xlsb. После пересохранения xlsb - xlsm - xltm все стало работать.
Но возникла другая - при запуске шаблона на работает
[vba]
Код
.InitialFileName = ThisWorkbook.Path
[/vba]
ввиду отсутствия последнего.
Как бы здесь исхитриться?

Автор - RAN
Дата добавления - 21.10.2013 в 16:36
SkyPro Дата: Понедельник, 21.10.2013, 17:35 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Когда-то боролся с этим. Единственный приемлемый способ - открывать рабочий стол.

[vba]
Код
Dim objWSHShell As Object
Set objWSHShell = CreateObject("WScript.Shell")
DesktopPath = objWSHShell.SpecialFolders("Desktop")
[/vba]

Цитата
Единственный приемлемый

*из тех, что я нашел :)


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Понедельник, 21.10.2013, 17:38
 
Ответить
СообщениеКогда-то боролся с этим. Единственный приемлемый способ - открывать рабочий стол.

[vba]
Код
Dim objWSHShell As Object
Set objWSHShell = CreateObject("WScript.Shell")
DesktopPath = objWSHShell.SpecialFolders("Desktop")
[/vba]

Цитата
Единственный приемлемый

*из тех, что я нашел :)

Автор - SkyPro
Дата добавления - 21.10.2013 в 17:35
SkyPro Дата: Среда, 23.10.2013, 15:39 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Короче, задал ты головоломку :)
Второй день ищу решение через апи.
Все, что есть на данный момент:
[vba]
Код
Private Declare Function apiGetClassName Lib "user32" Alias "GetClassNameA" (ByVal Hwnd As Long, ByVal lpClassname As String, ByVal nMaxCount As Long) As Long
Private Declare Function apiGetDesktopWindow Lib "user32" Alias "GetDesktopWindow" () As Long
Private Declare Function apiGetWindow Lib "user32" Alias "GetWindow" (ByVal Hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function apiGetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function apiGetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal Hwnd As Long, ByVal lpString As String, ByVal aint As Long) As Long

Private Const mcGWCHILD = 5
Private Const mcGWHWNDNext = 2
Private Const mcGWLSTYLE = (-16)
Private Const mcWSVISIBLE = &H10000000
Private Const mconMAXLEN = 255

Function fEnumWindows()
Dim lngx As Long, lngLen As Long
Dim lngStyle As Long, strCaption As String

lngx = apiGetDesktopWindow()
'Return the first child To Desktop
lngx = apiGetWindow(lngx, mcGWCHILD)
Do While Not lngx = 0
strCaption = fGetCaption(lngx)
If Len(strCaption) > 0 Then
lngStyle = apiGetWindowLong(lngx, mcGWLSTYLE)
'enum visible windows Only
If lngStyle And mcWSVISIBLE Then
Debug.Print "Class = " & fGetClassName(lngx),
Debug.Print "Caption = " & fGetCaption(lngx)
End If
End If
lngx = apiGetWindow(lngx, mcGWHWNDNext)
Loop
End Function

Private Function fGetClassName(Hwnd As Long)
Dim strBuffer As String
Dim intCount As Integer

strBuffer = String$(mconMAXLEN - 1, 0)
intCount = apiGetClassName(Hwnd, strBuffer, mconMAXLEN)
If intCount > 0 Then
fGetClassName = Left$(strBuffer, intCount)
End If
End Function

Private Function fGetCaption(Hwnd As Long)
Dim strBuffer As String
Dim intCount As Integer

strBuffer = String$(mconMAXLEN - 1, 0)
intCount = apiGetWindowText(Hwnd, strBuffer, mconMAXLEN)
If intCount > 0 Then
fGetCaption = Left$(strBuffer, intCount)
End If
End Function

Sub Fooad()
Call fEnumWindows
End Sub
[/vba]

Даст заголовки и класс запущенных видимых окон.
Может получится что-нибудь допилить.

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

Вот и источник. Там есть интересные вещи, которые могут помочь.
http://disketa.info/page.asp?page=vb&raz=17


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Среда, 23.10.2013, 16:07
 
Ответить
СообщениеКороче, задал ты головоломку :)
Второй день ищу решение через апи.
Все, что есть на данный момент:
[vba]
Код
Private Declare Function apiGetClassName Lib "user32" Alias "GetClassNameA" (ByVal Hwnd As Long, ByVal lpClassname As String, ByVal nMaxCount As Long) As Long
Private Declare Function apiGetDesktopWindow Lib "user32" Alias "GetDesktopWindow" () As Long
Private Declare Function apiGetWindow Lib "user32" Alias "GetWindow" (ByVal Hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function apiGetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function apiGetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal Hwnd As Long, ByVal lpString As String, ByVal aint As Long) As Long

Private Const mcGWCHILD = 5
Private Const mcGWHWNDNext = 2
Private Const mcGWLSTYLE = (-16)
Private Const mcWSVISIBLE = &H10000000
Private Const mconMAXLEN = 255

Function fEnumWindows()
Dim lngx As Long, lngLen As Long
Dim lngStyle As Long, strCaption As String

lngx = apiGetDesktopWindow()
'Return the first child To Desktop
lngx = apiGetWindow(lngx, mcGWCHILD)
Do While Not lngx = 0
strCaption = fGetCaption(lngx)
If Len(strCaption) > 0 Then
lngStyle = apiGetWindowLong(lngx, mcGWLSTYLE)
'enum visible windows Only
If lngStyle And mcWSVISIBLE Then
Debug.Print "Class = " & fGetClassName(lngx),
Debug.Print "Caption = " & fGetCaption(lngx)
End If
End If
lngx = apiGetWindow(lngx, mcGWHWNDNext)
Loop
End Function

Private Function fGetClassName(Hwnd As Long)
Dim strBuffer As String
Dim intCount As Integer

strBuffer = String$(mconMAXLEN - 1, 0)
intCount = apiGetClassName(Hwnd, strBuffer, mconMAXLEN)
If intCount > 0 Then
fGetClassName = Left$(strBuffer, intCount)
End If
End Function

Private Function fGetCaption(Hwnd As Long)
Dim strBuffer As String
Dim intCount As Integer

strBuffer = String$(mconMAXLEN - 1, 0)
intCount = apiGetWindowText(Hwnd, strBuffer, mconMAXLEN)
If intCount > 0 Then
fGetCaption = Left$(strBuffer, intCount)
End If
End Function

Sub Fooad()
Call fEnumWindows
End Sub
[/vba]

Даст заголовки и класс запущенных видимых окон.
Может получится что-нибудь допилить.

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

Вот и источник. Там есть интересные вещи, которые могут помочь.
http://disketa.info/page.asp?page=vb&raz=17

Автор - SkyPro
Дата добавления - 23.10.2013 в 15:39
RAN Дата: Среда, 23.10.2013, 18:04 | Сообщение № 5
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Круто! hands

Мы пошли другим путем! :)

Сделал xlsm с кодом

[vba]
Код
Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
10  If Me.Saved = False Then
20      If Len(Me.ActiveSheet.Cells(2, 2)) Then
30          Call Save_as
40      End If
50  End If
60  Me.Saved = True
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
10  If Len(Me.ActiveSheet.Cells(2, 2)) Then
20      Call Save_as
30      If Me.Saved = False Then Cancel = True
40  End If
End Sub

Private Sub Workbook_Open()
10  Call comparison_calculations
End Sub
Private Sub Save_as()
     Dim Filename
10  With Application.FileDialog(msoFileDialogSaveAs)
20      .InitialFileName = ThisWorkbook.Path & "\" & "Сравнение"
30      If .Show = 0 Then Exit Sub
40      ThisWorkbook.ActiveSheet.Copy
50      Application.DisplayAlerts = False
60      .Execute
70      Application.DisplayAlerts = True
80  End With
90  ActiveWorkbook.Close False
100 ThisWorkbook.Saved = True
110 ThisWorkbook.Close False

End Sub
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеКруто! hands

Мы пошли другим путем! :)

Сделал xlsm с кодом

[vba]
Код
Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
10  If Me.Saved = False Then
20      If Len(Me.ActiveSheet.Cells(2, 2)) Then
30          Call Save_as
40      End If
50  End If
60  Me.Saved = True
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
10  If Len(Me.ActiveSheet.Cells(2, 2)) Then
20      Call Save_as
30      If Me.Saved = False Then Cancel = True
40  End If
End Sub

Private Sub Workbook_Open()
10  Call comparison_calculations
End Sub
Private Sub Save_as()
     Dim Filename
10  With Application.FileDialog(msoFileDialogSaveAs)
20      .InitialFileName = ThisWorkbook.Path & "\" & "Сравнение"
30      If .Show = 0 Then Exit Sub
40      ThisWorkbook.ActiveSheet.Copy
50      Application.DisplayAlerts = False
60      .Execute
70      Application.DisplayAlerts = True
80  End With
90  ActiveWorkbook.Close False
100 ThisWorkbook.Saved = True
110 ThisWorkbook.Close False

End Sub
[/vba]

Автор - RAN
Дата добавления - 23.10.2013 в 18:04
SkyPro Дата: Среда, 23.10.2013, 18:08 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Ну я хоть не зря старался :)
Пока искал ответ хоть начал понимать принцип винапи.


skypro1111@gmail.com
 
Ответить
СообщениеНу я хоть не зря старался :)
Пока искал ответ хоть начал понимать принцип винапи.

Автор - SkyPro
Дата добавления - 23.10.2013 в 18:08
RAN Дата: Среда, 23.10.2013, 18:57 | Сообщение № 7
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
И то мясо! :D


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеИ то мясо! :D

Автор - RAN
Дата добавления - 23.10.2013 в 18:57
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!