Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
Pavel07
3 / 3 / 3
Регистрация: 28.10.2012
Сообщений: 321
Завершенные тесты: 1
1

Загрузка защищенного файла

17.02.2016, 12:52. Просмотров 275. Ответов 6
Метки нет (Все метки)

Добрый день, подскажите как сделать загрузку файла в бд?
Ситуация такая если загружать файл excel который имеет защиту ячеек, то выходит ошибка
"Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности, проверьте значения всех состояний OLE DB. Работа не выполнена "
Если загрузить точно такой же файл без защиты загрузка происходит без ошибок.

Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
Dim rs As Object
Dim rs2 As Object
Dim sqlDel As String
Dim rs1214 As Recordset, s1, s1214
Dim rs18 As Recordset, s2, s18
Dim rs3 As Object
Dim rs4 As Object
 
If idone = 1 Then
 
MsgBox "Загружаем в план"
 
Set objConnectionEx = CreateObject("ADODB.Connection")
Set objConnectionSer = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
Set rs2 = CreateObject("ADODB.Recordset")
'*******Excel подключение****************
objConnectionEx.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " & Me.Form.l1.Value & "; Extended Properties=""Excel 12.0 xml;HDR=Yes"""
 
strSQL = "select [Код Кураторов],[Код Менеджера],[Вид деятельности ОД/ИД/Прибыль/Возмещаемые],[Код Контрагента (18 справочник)],[№ договора САП (25 справочник)],[Наименование услуги],[Код управления],[Код Центров затрат (12 справочник)],[Код Вида услуг (52 справочник)],[Код Целевой программы (33 справочник)],[Код Месторождения (39 справочник)],[Код элементов затрат (47 справочник)],[Код прочих доходов и расходов (кроме прочих р-ций,13 справочник)],[Код Вида производств (103 справочник)],[Код Вида деятельности (24 справочник)],[Код AFE (справочник АФЕ)],[Возмещаемые (если агентский договор прописывать № договора )],[Код типа сделки (справочник сделок)],[Код статьи бюджета (справочник Статей бюджета)],[Номер лота],[Протокол ЗК], " _
 & " [Единица измерения],[Уровень обслуживания(Эконом/Стандарт/Премиум)],[Тариф за единицу в месяц (без НДС, руб)],[Валюта договора],[Процент НДС],[Целевой коэффициент],[Объем обслуживаемых единиц (1)],[Сумма в месяц, рублей, без НДС (1)],[Объем обслуживаемых единиц (2)],[Сумма в месяц, рублей, без НДС (2)],[Объем обслуживаемых единиц (3)],[Сумма в месяц, рублей, без НДС (3)], " _
 & " [Объем обслуживаемых единиц (4)],[Сумма в месяц, рублей, без НДС (4)],[Объем обслуживаемых единиц (5)],[Сумма в месяц, рублей, без НДС (5)],[Объем обслуживаемых единиц (6)],[Сумма в месяц, рублей, без НДС (6)], " _
 & " [Объем обслуживаемых единиц (7)],[Сумма в месяц, рублей, без НДС (7)],[Объем обслуживаемых единиц (8)],[Сумма в месяц, рублей, без НДС (8)],[Объем обслуживаемых единиц (9)],[Сумма в месяц, рублей, без НДС (9)], " _
 & " [Объем обслуживаемых единиц (10)],[Сумма в месяц, рублей, без НДС (10)],[Объем обслуживаемых единиц (11)],[Сумма в месяц, рублей, без НДС (11)],[Объем обслуживаемых единиц (12)],[Сумма в месяц, рублей, без НДС (12)], " _
 & " [Объем обслуживаемых единиц],[Сумма, в рублях, без НДС],[№ договора от Куратора]  from  [Лист1$]"
rs.Open strSQL, objConnectionEx, 3, 3 ' открываем рекордсет excel
'***************************
 
s1 = "select [kod_upr] from [NCI_UPR_1214]"
Set rs1214 = CurrentDb.OpenRecordset(s1)
 
Do While rs1214.EOF = False
s1214 = s1214 & "_" & rs1214.Fields(0) & "_"
'строка с управлениями
rs1214.MoveNext
Loop
rs1214.Close
Set rs1214 = Nothing
 
 
s2 = "select [nStrEd] from [NCI_StrEd_18]"
Set rs18 = CurrentDb.OpenRecordset(s2)
 
Do While rs18.EOF = False
s18 = s18 & "_" & rs18.Fields(0) & "_"
'строка контрагентов
rs18.MoveNext
Loop
rs18.Close
Set rs18 = Nothing
 
objConnectionSer.Open "Provider=SQLOLEDB.1;Password=Skid2016;Persist Security Info=True;User ID=UserSkid;Initial Catalog=SKID;Data Source=rni-32" 'строка подключения к skid
rs.MoveLast: rs.MoveFirst 'прогон рекордсета на последнюю запись и назад к первой для правильного подсчета количества записей
rs2.Open "dbo.DogovorPlan", objConnectionSer, 3, 3  'открываем рекордсет  таблицы Skid
 
For i = 1 To rs.RecordCount
 
s1 = "_" & rs.Fields(6) & "_"
s2 = "_" & rs.Fields(3) & "_"
 
If InStr(s1214, s1) > 0 And InStr(s18, s2) > 0 Then
With rs2
.AddNew
.Fields("kod_kurator") = rs.Fields(0)
.Fields("kod_manager") = rs.Fields(1)
.Fields("type_activ") = rs.Fields(2)
.Fields("kod_18") = rs.Fields(3)
.Fields("kod_25") = rs.Fields(4)
.Fields("nameUslugi") = rs.Fields(5)
.Fields("kod_upr") = rs.Fields(6)
.Fields("kod_12") = rs.Fields(7)
.Fields("kod_52") = rs.Fields(8)
.Fields("kod_33") = rs.Fields(9)
.Fields("kod_39") = rs.Fields(10)
.Fields("kod_47") = rs.Fields(11)
.Fields("kod_13") = rs.Fields(12)
.Fields("kod_103") = rs.Fields(13)
.Fields("kod_24") = rs.Fields(14)
.Fields("kod_AFE") = rs.Fields(15)
.Fields("recoverable") = rs.Fields(16)
.Fields("kod_Cdelka") = rs.Fields(17)
.Fields("kod_StatBud") = rs.Fields(18)
.Fields("numberLot") = rs.Fields(19)
.Fields("ZKprotocol") = rs.Fields(20)
.Fields("kod_edizm") = rs.Fields(21)
.Fields("kod_urovuslug") = rs.Fields(22)
.Fields("cost") = rs.Fields(23)
.Fields("valuta") = rs.Fields(24)
.Fields("procNDS") = rs.Fields(25)
.Fields("coefficient") = rs.Fields(26)
.Fields("volume01") = rs.Fields(27)
.Fields("sum01") = rs.Fields(28)
.Fields("volume02") = rs.Fields(29)
.Fields("sum02") = rs.Fields(30)
.Fields("volume03") = rs.Fields(31)
.Fields("sum03") = rs.Fields(32)
.Fields("volume04") = rs.Fields(33)
.Fields("sum04") = rs.Fields(34)
.Fields("volume05") = rs.Fields(35)
.Fields("sum05") = rs.Fields(36)
.Fields("volume06") = rs.Fields(37)
.Fields("sum06") = rs.Fields(38)
.Fields("volume07") = rs.Fields(39)
.Fields("sum07") = rs.Fields(40)
.Fields("volume08") = rs.Fields(41)
.Fields("sum08") = rs.Fields(42)
.Fields("volume09") = rs.Fields(43)
.Fields("sum09") = rs.Fields(44)
.Fields("volume10") = rs.Fields(45)
.Fields("sum10") = rs.Fields(46)
.Fields("volume11") = rs.Fields(47)
.Fields("sum11") = rs.Fields(48)
.Fields("volume12") = rs.Fields(49)
.Fields("sum12") = rs.Fields(50)
.Fields("totalVolume") = rs.Fields(51)
.Fields("totalSum") = rs.Fields(52)
.Fields("NumDogKurator") = rs.Fields(53)
.Update
End With
If i < rs.RecordCount Then rs.MoveNext 'если переменная цикла не добралась до конца то двигаем рекордсет eXcel на следующую запись
Next i
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2016, 12:52
Ответы с готовыми решениями:

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

Копирование отфильтрованного диапазона с защищенного листа книги, с удалением формул и защиты на копии
Добрый день! Подскажите, пожалуйста. Есть данный макрос: Sub CopyFilter() Dim...

Загрузка формы из файла
Приветствую всех. Есть форма с элементами и кодом, сохранённая в файлах (*.frm,...

Загрузка разрезанного файла в Variables
Здравствуйте, благодаря Казанскому имеется код: Option Explicit 'путь к...

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

6
mobile
Эксперт MS Access
22914 / 12990 / 2688
Регистрация: 28.04.2012
Сообщений: 14,227
17.02.2016, 14:12 2
Через драйвер ISAM удалось считать защищенные ячейки (если правильно что такое защищенные ячейки). Типа такого
Visual Basic
1
2
3
4
Dim rs as DAO.Recordset
strSQL = "select [Код Кураторов],...,[№ договора от Куратора] from [Лист1$]" _
& " In '" Me.Form.l1.Value & "'[Excel 12.0; HDR=NO;]"
Set rs=CurrentDb.OpenRecordset(strSQL)
1
Pavel07
3 / 3 / 3
Регистрация: 28.10.2012
Сообщений: 321
Завершенные тесты: 1
17.02.2016, 14:16  [ТС] 3
А DAO с ADO потом подружится?
0
texnik-san
шапоклякистка 8-го дня
3630 / 2191 / 389
Регистрация: 26.06.2015
Сообщений: 4,648
Записей в блоге: 1
18.02.2016, 00:46 4
Цитата Сообщение от Pavel07 Посмотреть сообщение
А DAO с ADO потом подружится?
Смотря что вы имеете в виду под "подружатся".

Данные, добавленные в таблицу через рекордсет ADO будут доступны как и любые другие данные в таблице - таблице все равно, с помощью какой библиотеки в нее добавлялись данные.
1
Pavel07
3 / 3 / 3
Регистрация: 28.10.2012
Сообщений: 321
Завершенные тесты: 1
18.02.2016, 12:24  [ТС] 5
Цитата Сообщение от texnik-san Посмотреть сообщение
Смотря что вы имеете в виду под "подружатся".
Данные, добавленные в таблицу через рекордсет ADO будут доступны как и любые другие данные в таблице - таблице все равно, с помощью какой библиотеки в нее добавлялись данные.
Именно это я и хотел узнать.
Спасибо

Добавлено через 8 минут
Выходит сообщение слишком мало параметров. Требуется 54.
Я так понял что он не смог прочитать защищенные ячейки?

Добавлено через 5 часов 59 минут
как поправить ситуацию?
0
texnik-san
шапоклякистка 8-го дня
3630 / 2191 / 389
Регистрация: 26.06.2015
Сообщений: 4,648
Записей в блоге: 1
18.02.2016, 13:07 6
Я очень мало работала с excel, поэтому затрудняюсь. Есть способ до начала загрузки временно снять с ячеек защиту, а после вернуть обратно?
0
Pavel07
3 / 3 / 3
Регистрация: 28.10.2012
Сообщений: 321
Завершенные тесты: 1
19.02.2016, 07:46  [ТС] 7
Нет, потому что как такого открытия файла не происходит и я не могу передать параметр ActiveSheets.Unprotect.

Добавлено через 1 час 5 минут
В общем придумал вот такой алгоритм, исходя из мысли что мне нужно предотвратить редактирование только ячеек которые имеют нужные мне имена.
Так для загрузки файл должен быть не защищенным а для редактирования имел какую то защиту, сделал вот так в самом файле Excel.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private varOldValue As Variant
Private varNewValue As Variant
 
Private Sub Worksheet_Change(ByVal Target As Range)
 
Dim rrow As Integer, ccol As Integer
 rrow = Target.Row
 ccol = Target.Column
     
 varNewValue = Target.Value
  If (Target.Column >= 1 And Target.Column <= 54) Then
    If Target.Offset(0, 0).Interior.ColorIndex = 37 Then
      If varNewValue <> varOldValue Then
         Cells(rrow, ccol).Value = varOldValue
      End If
    End If
  End If
   
End Sub
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    varOldValue = Target.Value
End Sub
0
19.02.2016, 07:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2016, 07:46

Загрузка данных из закрытого .xls файла
Доброго времени суток. Необходимо создать код для выбора закрытого файла...

Загрузка данных из закрытого .xls файла
В двумерный массив 12 х 3 необходимо загрузить данные из закрытого файла...

Загрузка данных из стороннего файла Excel
Добрый день. Подскажите пожалуйста, запрашиваю сторонний файл с данными, на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru