Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2011, 11:26   #1
eli0n
 
Регистрация: 29.08.2011
Сообщений: 4
По умолчанию Как определить, есть ли пароль не книге (excel) не открывая ее?

Товарищи, буду признателен за помощь.

Есть код (VBA), который обрабатывает почтовый ящик и проверяет вложения на excel и сортирует их по ранее заданным шаблонам.
В каждом типе шаблонов есть определенный скрытый лист и в первой ячейке указан его тип.
В день порядка 1500 писем(1500 файлов ексель).

При проверке писем, я не открываю excel, а беру значение из скрытого листа с помощью функциии :

Function getvalue(file_path As String, sht_name As String, cell_RC As String) As String
Dim file_path As String
Dim file_name As String
file_dir = Left(x, InStrRev(file_path , "\", -1))
file_name = Right(file_path , Len(file_path ) - InStrRev(file_path, "\", -1))
getvalue = ExecuteExcel4Macro("'" & file_dir & "[" & file_name & "]" & sht_name & "'!" & cell_RC)
End Function


Этот способ очень эффективный по сравнению с открытием книги
(Set awb = Workbooks.Open(FileName:=file_path , UpdateLinks:=0, ReadOnly:=False, Password:="", WriteResPassword:=True, ignoreReadOnlyRecommended:=True, CorruptLoad:=xlRepairFile))

Но столкнулся с проблемой, что если книга с паролем, то всплывает окно с просьбой вести пароль и процедура стоппорится.
Никакие displayalersts=false не помагают.

Единственный вариант, который приходит на ум через OLEDB вытаскивать структуру файла, и если выдает ошибку "не удалось дешифровать файл, то игнорировать его:

Код:
on error resume next
 With New ADODB.Connection
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=" & filepath & ";Extended Properties=Excel 8.0;"
    .CursorLocation = adUseClient
    .Open
    With .OpenSchema(adSchemaTables)
if err.number=-2147467259  then goto next_file:
Но не хотелось бы завязываться на данный способ. Есть у кого какие-нибудь соображения, как можно определить наличие пароля на файл Excel не открывая его?
eli0n вне форума Ответить с цитированием
Старый 29.08.2011, 11:52   #2
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

как вариант
Как определить существует или нет пароль на открытие книги ?
Ответ :
Код:
If ThisWorkbook.HasPassword = True Then 
   MsgBox "Пароль на открытие этой книги, существует" 
Else 
   MsgBox "Пароля не существует" 
End If

If Not ActiveWorkbook.HasPassword Then 
   MsgBox "Пароля не существует" 
Else 
   MsgBox "Пароль на открытие активной книги, существует" 
End If
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499
VictorM вне форума Ответить с цитированием
Старый 29.08.2011, 23:25   #3
eli0n
 
Регистрация: 29.08.2011
Сообщений: 4
По умолчанию

Виктор,

Как ты предлагаешь обратиться к книге "ActiveWorkbook", если мне нельзя ее открывать?
eli0n вне форума Ответить с цитированием
Старый 29.08.2011, 23:43   #4
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Можно пытаться открыть книгу, указав пароль пустую строку, и тут же закрыть ее. Если книга запаролена, возникнет ошибка:
Код:
On Error Resume Next
With Workbooks.Open("c:\temp\456.xls", password:="")
    .Close False
End With
If Err Then Err.Clear: MsgBox "Книга с паролем"
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 29.08.2011, 23:44   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

А почему нельзя открывать файлы?
Они огромные?
Обычно цикл "открытие-закрытие без сохранения" занимает меньше секунды (обычно 0,2-0,4 сек.)
Итого, файлы обработаются за несколько минут.
Или в вашем случае это слишком долго?

PS: Ваша идея с ADODB.Connection мне очень понравилась.
Я бы остановился именно на таком способе, оформив код в виде функции.
(других способов пока на ум не приходит)

PPS: Пробовали GetObject вместо Workbooks.Open?
Вдруг ошибка не выскочит... (не проверял)
EducatedFool вне форума Ответить с цитированием
Старый 30.08.2011, 01:15   #6
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

Я бы просто поставил в цикле обработки файлов
on error resume next и err.clear
и данные получал через ADO
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 30.08.2011, 11:19   #7
eli0n
 
Регистрация: 29.08.2011
Сообщений: 4
По умолчанию

2Казанский,

Машина на которой находится обработчик не очень мощная.
И открытие/закрытие для некоторых файлов достигает до 20 секунд.
В свое очередь ADODB тратит не выгрузку не более секунды.
Поэтому пришлось отказаться от метода открытия с пустым паролем, т.к. все незапароленные файлы открываются,а их большинство.
(Set awb = Workbooks.Open(FileName:=file_path , UpdateLinks:=0, ReadOnly:=False, Password:="", WriteResPassword:=True, ignoreReadOnlyRecommended:=True, CorruptLoad:=xlRepairFile))

2EducatedFool
GetObject не помогает

2R Dmitry
Предлагаешь вообще отказаться от ExecuteExcel4Macro и использовать ADO с указанием диапазона для выгрузки из ячейки?
Идея хорошая... протестирую, что будет быстрее.
eli0n вне форума Ответить с цитированием
Старый 30.08.2011, 12:01   #8
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

Код:
2R Dmitry
Предлагаешь вообще отказаться от   ExecuteExcel4Macro и использовать ADO с указанием диапазона  для выгрузки из ячейки? 
Идея хорошая... протестирую, что будет быстрее.
Да именно это и предлагаю
посмотри, может используешь функцию
Тынц
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 30.08.2011, 13:51   #9
eli0n
 
Регистрация: 29.08.2011
Сообщений: 4
По умолчанию

Доработал механизм по совету R Dmitry.


Если функция возвращает ="ERR_OPEN" , то пытаюсь открыть книгу через workbook.open password:=""

Работает быстро.


Код:
Function load_cell(filepath As String) As String
Dim cn As ADODB.Connection
Dim cn_success As Boolean

On Error GoTo err:
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & filepath & ";Extended Properties=""Excel 8.0;HDR=NO;IMEX=1"""
cn_success = True
Set cn_source = New Recordset
cn_source.Open "select top 1 * from [sts$A1:A1]", cn
load_cell = cn_source.Fields(0).Value


Set cn_source = Nothing
Set cn = Nothing
Exit Function
 
err:
Set cn_source = Nothing
Set cn = Nothing

 If cn_success = False Then
    load_cell = "ERR_OPEN"
End If
   err.Clear
End Function
eli0n вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как программно снять пароль с книги Excel nFalcon Microsoft Office Excel 19 20.06.2013 00:21
Как в excel определить есть ли такое значение в таблице KAIst Microsoft Office Excel 9 09.09.2010 13:27
Как определить есть ли в едит курсор Яр|/||< (^_^) Общие вопросы Delphi 4 21.02.2010 15:26
как при импорте из Excel в delphi узнать сколько заполненных строк в книге Excel?чтобы организовать цикл betirsolt БД в Delphi 1 17.01.2010 18:51
Как обратиться к ячейке файла Excel не открывая его Alexandro Microsoft Office Excel 3 28.05.2008 12:02