Private Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" ( _ ByVal lpFileName As String, _ ByVal dwDesiredAccess As Long, _ ByVal dwShareMode As Long, _ ByVal lpSecurityAttributes As Long, _ ByVal dwCreationDisposition As Long, _ ByVal dwFlagsAndAttributes As Long, _ ByVal hTemplateFile As Long _ ) As Long Private Declare Function GetFileTime Lib "kernel32" ( _ ByVal hFile As Long, _ lpCreationTime As FILETIME, _ lpLastAccessTime As FILETIME, _ lpLastWriteTime As FILETIME _ ) As Long Private Declare Function SetFileTime Lib "kernel32" ( _ ByVal hFile As Long, _ lpCreationTime As FILETIME, _ lpLastAccessTime As FILETIME, _ lpLastWriteTime As FILETIME _ ) As Long Private Declare Function GetFileAttributes Lib "kernel32.dll" Alias "GetFileAttributesA" ( _ ByVal lpFileName As String _ ) As Long Private Declare Function SetFileAttributes Lib "kernel32.dll" Alias "SetFileAttributesA" ( _ ByVal lpFileName As String, _ ByVal dwFileAttributes As Long _ ) As Long Private Declare Function CloseHandle Lib "kernel32" ( _ ByVal hObject As Long _ ) As Long
Private Sub CommandButton1_Click() Dim strFolder$ Dim CreationTime As FILETIME, _ LastAccessTime As FILETIME, _ LastWriteTime As FILETIME With Application.FileDialog(msoFileDialogFolderPicker) .AllowMultiSelect = False If .Show Then strFolder = .SelectedItems(1) Else Exit Sub End With Dim coll As Collection, strFilePath, strNewFilePath$, hFile&, hFileAttr& Dim DocProp(1 To 6) As Variant, objTimeZone As Object, zip$, TZOffset# Set coll = FilenamesCollection(strFolder, ".doc") Application.ScreenUpdating = False For Each strFilePath In coll 'создаем файловый дескриптор, указывающий на исходный файл hFile = CreateFile(strFilePath, GENERIC_READ, 0&, 0&, OPEN_EXISTING, 0&, 0&) 'читаем датувремя создания, открытия, сохранения файла GetFileTime hFile, CreationTime, LastAccessTime, LastWriteTime hFileAttr = GetFileAttributes(strFilePath) 'закрываем дескриптор CloseHandle hFile With Documents.Open(strFilePath) strNewFilePath = Left(.FullName, InStrRev(.FullName, ".")) & "docx" 'этот блок нужен для переноса встроенных свойств файла '7-last author,8=revision number,9-application name,11-creation date '12-last save time,13-total editing time With .BuiltInDocumentProperties DocProp(1) = .Item(7): DocProp(2) = .Item(8) DocProp(3) = .Item(9): DocProp(4) = .Item(11) DocProp(5) = .Item(12): DocProp(6) = .Item(13) End With .SaveAs strNewFilePath, 12: .Convert: .Save .Close: 'Kill strFilePath 'удаление исходного файла End With 'определяем часовой пояс With GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") For Each objTimeZone In .ExecQuery("Select * from Win32_TimeZone") TZOffset = objTimeZone.Bias / 1440 Next End With 'заменяем встроенные свойства скопированного файла zip = "%ProgramFiles(x86)%\7-Zip\7z.exe" With CreateObject("wscript.shell") .Run "%comspec% /c ""cd """ & Environ("tmp") & """&&""" & zip & _ """ x """ & strNewFilePath & """ docProps\app.xml -y""", 0, 1 .Run "%comspec% /c ""cd """ & Environ("tmp") & """&&""" & zip & _ """ x """ & strNewFilePath & """ docProps\core.xml -y""", 0, 1 With CreateObject("MSXML2.DOMDocument.4.0") .async = False: .validateOnParse = False .Load Environ("tmp") & "\docProps\core.xml" .setProperty "SelectionLanguage", "XPath" .setProperty "SelectionNamespaces", _ "xmlns:cp='http://schemas.openxmlformats.org/package/2006/metadata/core-properties' " & _ "xmlns:dc='http://purl.org/dc/elements/1.1/' " & _ "xmlns:dcterms='http://purl.org/dc/terms/' " & _ "xmlns:dcmitype='http://purl.org/dc/dcmitype/' " & _ "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'" .SelectSingleNode("//cp:lastModifiedBy").Text = DocProp(1) .SelectSingleNode("//cp:revision").Text = DocProp(2) .SelectSingleNode("//dcterms:created").Text = _ Format(DocProp(4) - TZOffset, "yyyy-mm-ddTHH:MM:SSZ") .SelectSingleNode("//dcterms:modified").Text = _ Format(DocProp(5) - TZOffset, "yyyy-mm-ddTHH:MM:SSZ") .Save Environ("tmp") & "\docProps\core.xml" End With With CreateObject("MSXML2.DOMDocument.3.0") .async = False: .validateOnParse = False .Load Environ("tmp") & "\docProps\app.xml" .SelectSingleNode("//Application").Text = DocProp(3) .SelectSingleNode("//TotalTime").Text = DocProp(6) .Save Environ("tmp") & "\docProps\app.xml" End With .Run "%comspec% /c ""cd """ & Environ("tmp") & """&&""" & zip & _ """ u """ & strNewFilePath & """ docProps\app.xml -y""", 0, 1 .Run "%comspec% /c ""cd """ & Environ("tmp") & """&&""" & zip & _ """ u """ & strNewFilePath & """ docProps\core.xml -y""", 0, 1 Kill Environ("tmp") & "\docProps\*.*" RmDir Environ("tmp") & "\docProps" End With 'создаем файловый дескриптор, указывающий на конвертированный файл hFile = CreateFile(strNewFilePath, GENERIC_WRITE, 0&, 0&, OPEN_EXISTING, 0&, 0&) 'заменяем датувремя создания, открытия, сохранения файла SetFileTime hFile, CreationTime, LastAccessTime, LastWriteTime SetFileAttributes strNewFilePath, hFileAttr 'закрываем дескриптор CloseHandle hFile Next Application.ScreenUpdating = True End Sub
[/vba]
в общем, понагородил все подряд ...
[vba]
Код
Option Explicit
Private Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" ( _ ByVal lpFileName As String, _ ByVal dwDesiredAccess As Long, _ ByVal dwShareMode As Long, _ ByVal lpSecurityAttributes As Long, _ ByVal dwCreationDisposition As Long, _ ByVal dwFlagsAndAttributes As Long, _ ByVal hTemplateFile As Long _ ) As Long Private Declare Function GetFileTime Lib "kernel32" ( _ ByVal hFile As Long, _ lpCreationTime As FILETIME, _ lpLastAccessTime As FILETIME, _ lpLastWriteTime As FILETIME _ ) As Long Private Declare Function SetFileTime Lib "kernel32" ( _ ByVal hFile As Long, _ lpCreationTime As FILETIME, _ lpLastAccessTime As FILETIME, _ lpLastWriteTime As FILETIME _ ) As Long Private Declare Function GetFileAttributes Lib "kernel32.dll" Alias "GetFileAttributesA" ( _ ByVal lpFileName As String _ ) As Long Private Declare Function SetFileAttributes Lib "kernel32.dll" Alias "SetFileAttributesA" ( _ ByVal lpFileName As String, _ ByVal dwFileAttributes As Long _ ) As Long Private Declare Function CloseHandle Lib "kernel32" ( _ ByVal hObject As Long _ ) As Long
точно? а если к 01.01.2012 прибавить 400 дней , то получится 04.02.2013 (разница - 1г1м3д) если к 01.02.2012 прибавить 400 дней , то получится 07.03.2013 (разница - 1г1м6д) если к 01.02.2013 прибавить 400 дней , то получится 08.03.2014 (разница - 1г1м7д)
[moder]А чего это все так бодренько отвечают, когда замечание модератора еще не исправлено? [/moder] [moder]Тема исправлена, ответы открыты[/moder]
точно? а если к 01.01.2012 прибавить 400 дней , то получится 04.02.2013 (разница - 1г1м3д) если к 01.02.2012 прибавить 400 дней , то получится 07.03.2013 (разница - 1г1м6д) если к 01.02.2013 прибавить 400 дней , то получится 08.03.2014 (разница - 1г1м7д)
[moder]А чего это все так бодренько отвечают, когда замечание модератора еще не исправлено? [/moder] [moder]Тема исправлена, ответы открыты[/moder]krosav4ig
Function ЦБР(Optional ByVal Curr$ = "USD", Optional ByVal dDate As Date) As Currency Dim date_req$ With CreateObject("msxml.DOMDocument") date_req = "?date_req=" & IIf(dDate, dDate, Date): .async = 0 If .Load("http://www.cbr.ru/scripts/XML_daily.asp" & date_req) Then With .SelectSingleNode("*/Valute[CharCode='" & UCase(Curr) & "']") ЦБР = CCur(.ChildNodes(4).Text) / Val(.ChildNodes(2).Text) End With End If End With End Function
Function ЦБР(Optional ByVal Curr$ = "USD", Optional ByVal dDate As Date) As Currency Dim date_req$ With CreateObject("msxml.DOMDocument") date_req = "?date_req=" & IIf(dDate, dDate, Date): .async = 0 If .Load("http://www.cbr.ru/scripts/XML_daily.asp" & date_req) Then With .SelectSingleNode("*/Valute[CharCode='" & UCase(Curr) & "']") ЦБР = CCur(.ChildNodes(4).Text) / Val(.ChildNodes(2).Text) End With End If End With End Function
Didrou, какие дату и время нужно сохранять? Дату самого файла (в свойствах файла на вкладке общая) или те, что BuiltInDocumentProperties(11) и BuiltInDocumentProperties(12) (в свойствах файла на вкладке сводка > дополнительно>>), или и то и другое? Номер редакции, имя последнего сохранившего, общее время редактирования сохранять, название приложения которым последний раз сохранялся сохранять нужно?
Didrou, какие дату и время нужно сохранять? Дату самого файла (в свойствах файла на вкладке общая) или те, что BuiltInDocumentProperties(11) и BuiltInDocumentProperties(12) (в свойствах файла на вкладке сводка > дополнительно>>), или и то и другое? Номер редакции, имя последнего сохранившего, общее время редактирования сохранять, название приложения которым последний раз сохранялся сохранять нужно?krosav4ig
Private Sub CommandButton1_Click() Dim coll As Collection, strFolder As String, strFilePath With Application.FileDialog(msoFileDialogFolderPicker) .AllowMultiSelect = False If .Show Then strFolder = .SelectedItems(1) End With Set coll = FilenamesCollection(strFolder, ".doc") Application.ScreenUpdating = False For Each strFilePath In coll With Documents.Open(strFilePath) .SaveAs2 Left(.FullName, InStrRev(.FullName, ".")) & "docx", 12 .Close Kill strFilePath 'удаление исходного файла End With Next Application.ScreenUpdating = True End Sub
Private Sub CommandButton1_Click() Dim coll As Collection, strFolder As String, strFilePath With Application.FileDialog(msoFileDialogFolderPicker) .AllowMultiSelect = False If .Show Then strFolder = .SelectedItems(1) End With Set coll = FilenamesCollection(strFolder, ".doc") Application.ScreenUpdating = False For Each strFilePath In coll With Documents.Open(strFilePath) .SaveAs2 Left(.FullName, InStrRev(.FullName, ".")) & "docx", 12 .Close Kill strFilePath 'удаление исходного файла End With Next Application.ScreenUpdating = True End Sub
не всегда, например Alt+VC - изменение стиля Обычный, в 2007 такой комбинации нет, есть только Alt+ЯЯ показывающая меню с набором стилей upd. хотя нет, есть Alt+ЯЯ+клавиша контекстного меню+И, но все равно 2 лишние клавиши :) upd.upd. диспетчер правил УФ Alt+VE в 2007 Alt+ЯУУУ>Enter
не всегда, например Alt+VC - изменение стиля Обычный, в 2007 такой комбинации нет, есть только Alt+ЯЯ показывающая меню с набором стилей upd. хотя нет, есть Alt+ЯЯ+клавиша контекстного меню+И, но все равно 2 лишние клавиши :) upd.upd. диспетчер правил УФ Alt+VE в 2007 Alt+ЯУУУ>Enterkrosav4ig
Sub Пробирка() Dim rng As Range, a As Variant Set rng = Range("A1:A100") With Application a = Evaluate(Join(Array("IF(ISBLANK(", "),"""",ROW(", "))"), rng.Address(, , .ReferenceStyle))) a = .Index(rng.Value, .Small(a, Evaluate("ROW(R1:R" & .Count(a) & ")"))) End With MsgBox UBound(a) Erase a Set rng = Nothing End Sub
[/vba]
[vba]
Код
Sub Пробирка() Dim rng As Range, a As Variant Set rng = Range("A1:A100") With Application a = Evaluate(Join(Array("IF(ISBLANK(", "),"""",ROW(", "))"), rng.Address(, , .ReferenceStyle))) a = .Index(rng.Value, .Small(a, Evaluate("ROW(R1:R" & .Count(a) & ")"))) End With MsgBox UBound(a) Erase a Set rng = Nothing End Sub
проверяем есть ли в системе утилита devcon (для 64-битной системы devcon64) в командной строке пишем devcon и жмем enter если в ответ получаем
Цитата
devcon Usage: devcon [-r] [-m:\\<machine>] <command> [<arg>...] For more information type: devcon help
, то она установлена, если
Цитата
"devcon" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.
, то нужно скачать и поместить в папку %windir%\system32 (для для 64-битной системы %windir%\SysWOW64) файл devcon.exe (для 64-битной системы devcon64.exe) скачать можно из torrent сборки DRP.SU . идем по ссылке под спойлером "Устаревшие версии" выбираем DRP_15.4.12_Full.torrent, при добавлении в очередь нужно снять все галки и выбрать только devcon.exe или devcon64.exe в папке tools. Затем нужно в свойствах файла снять галку "только чтение", нажать кнопку Разблокировать, нажать кнопку Применить, вернуть галку "только чтение" и нажать ОК
проверяем есть ли в системе утилита devcon (для 64-битной системы devcon64) в командной строке пишем devcon и жмем enter если в ответ получаем
Цитата
devcon Usage: devcon [-r] [-m:\\<machine>] <command> [<arg>...] For more information type: devcon help
, то она установлена, если
Цитата
"devcon" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.
, то нужно скачать и поместить в папку %windir%\system32 (для для 64-битной системы %windir%\SysWOW64) файл devcon.exe (для 64-битной системы devcon64.exe) скачать можно из torrent сборки DRP.SU . идем по ссылке под спойлером "Устаревшие версии" выбираем DRP_15.4.12_Full.torrent, при добавлении в очередь нужно снять все галки и выбрать только devcon.exe или devcon64.exe в папке tools. Затем нужно в свойствах файла снять галку "только чтение", нажать кнопку Разблокировать, нажать кнопку Применить, вернуть галку "только чтение" и нажать ОК
ну дык его нужно правильно импортировать, и будет счастье данные>получение внешних данных>из текста>выбираем файл>импорт формат данных: с разделителями, формат файла: 65001 (он должен определиться автоматически) далее галка на точка с запятой>готово
ну дык его нужно правильно импортировать, и будет счастье данные>получение внешних данных>из текста>выбираем файл>импорт формат данных: с разделителями, формат файла: 65001 (он должен определиться автоматически) далее галка на точка с запятой>готовоkrosav4ig
мб я чего-то недопонял... в thisdocument вставьте такой код [vba]
Код
Private Sub Document_Open() Dim tbl As Table For Each tbl In Me.Tables tblrRows(1).HeadingFormat = True Next End Sub
[/vba]
или в модуле класса clsAppWord [vba]
Код
Public WithEvents App As Word.Application Private Sub App_DocumentBeforePrint(ByVal Doc As Document, Cancel As Boolean) Dim tbl As Table If Doc Is ThisDocument Then For Each tbl In Doc.Tables tbl.Rows(1).HeadingFormat = True Next End If End Sub
[/vba] в стандартном модуле [vba]
Код
Public objAppWord As New clsAppWord Sub AutoOpen() Set objAppWord.App = Parent End Sub
[/vba]
мб я чего-то недопонял... в thisdocument вставьте такой код [vba]
Код
Private Sub Document_Open() Dim tbl As Table For Each tbl In Me.Tables tblrRows(1).HeadingFormat = True Next End Sub
[/vba]
или в модуле класса clsAppWord [vba]
Код
Public WithEvents App As Word.Application Private Sub App_DocumentBeforePrint(ByVal Doc As Document, Cancel As Boolean) Dim tbl As Table If Doc Is ThisDocument Then For Each tbl In Doc.Tables tbl.Rows(1).HeadingFormat = True Next End If End Sub
[/vba] в стандартном модуле [vba]
Код
Public objAppWord As New clsAppWord Sub AutoOpen() Set objAppWord.App = Parent End Sub
Lania, тогда остается 2 варианта: 1 переписать определение процедуры 2 воспользоваться макросом
[vba]
Код
Option Explicit
Public Sub ExecStoredProc(dDate As Date) Const strServerName$ = "ServerName", _ strDBName$ = "DBName", _ strUser$ = "User", strPass$ = "Pass" Const adAsyncExecute& = 16, _ adStateOpen& = 1, _ adStateExecuting& = 4 With CreateObject("ADODB.Connection") .Open Join(Array( _ "DRIVER=SQL Server", _ "SERVER=" & strServerName, _ "UID=" & strUser, _ "password=" & strPass, _ "APP=2013 Microsoft Office system", _ "WSID=" & Environ$("computername"), _ "DATABASE=" & strDBName), ";") .Execute "exec МояПроцедура '" & Format(dDate, "yyyy-mm-dd") & "'", , _ adAsyncExecute Do While .State = (adStateOpen Or adStateExecuting) DoEvents Loop .Close End With 'ThisWorkbook.RefreshAll 'обновление всех подключений End Sub
[/vba]
[vba]
Код
Option Explicit
Private Sub CommandButton1_Click() ExecStoredProc [A1] End Sub
[/vba]
в ячейке может быть дата как в числовом формате, так и в текстовом, в текстовом формате дата распознается в форматах "дд.мм.гггг", "д.м.гг" вместо точек может быть пробел, запятая, слэш (/), дефис, так же распознается дата при написании месяца текстом в полной и сокращенной фррме (1 января 16, 1 янв 2016), если не указан год (как в примере) то берется текущий
Lania, тогда остается 2 варианта: 1 переписать определение процедуры 2 воспользоваться макросом
[vba]
Код
Option Explicit
Public Sub ExecStoredProc(dDate As Date) Const strServerName$ = "ServerName", _ strDBName$ = "DBName", _ strUser$ = "User", strPass$ = "Pass" Const adAsyncExecute& = 16, _ adStateOpen& = 1, _ adStateExecuting& = 4 With CreateObject("ADODB.Connection") .Open Join(Array( _ "DRIVER=SQL Server", _ "SERVER=" & strServerName, _ "UID=" & strUser, _ "password=" & strPass, _ "APP=2013 Microsoft Office system", _ "WSID=" & Environ$("computername"), _ "DATABASE=" & strDBName), ";") .Execute "exec МояПроцедура '" & Format(dDate, "yyyy-mm-dd") & "'", , _ adAsyncExecute Do While .State = (adStateOpen Or adStateExecuting) DoEvents Loop .Close End With 'ThisWorkbook.RefreshAll 'обновление всех подключений End Sub
[/vba]
[vba]
Код
Option Explicit
Private Sub CommandButton1_Click() ExecStoredProc [A1] End Sub
[/vba]
в ячейке может быть дата как в числовом формате, так и в текстовом, в текстовом формате дата распознается в форматах "дд.мм.гггг", "д.м.гг" вместо точек может быть пробел, запятая, слэш (/), дефис, так же распознается дата при написании месяца текстом в полной и сокращенной фррме (1 января 16, 1 янв 2016), если не указан год (как в примере) то берется текущийkrosav4ig