VBA, EXCEL, Sharepoint, ADODB.Connection

VladConn

У меня вопрос по VBA в Excel. Вот часть кода, который работает в network, но не работает в sharepoint:
Set ioobjConn = New ADODB.Connection
Set ioobjCmnd = New ADODB.Command 

Dim strCnctn As String 

strCnctn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
 "Data Source=" & ThisWorkbook.FullName & ";" & _
 "Extended Properties=""Excel 8.0;HDR=No"";" 

With ioobjConn
 .ConnectionString = strCnctn
 .CursorLocation = ADODB.adUseClient
 .Open
End With
Проблема в ThisWorkbook.FullName. В sharepoint это путь http:\....., и ADODB ioobjConn его не понимает. Для диска работает.Кто-нибудь сталкивался?
19 ответов

VladConn

> Автор: VladConn> Проблема в ThisWorkbook.FullName. В sharepoint это путь http:\....., и ADODB ioobjConn его не понимает.
Provider=Microsoft.ACE.OLEDB.12.0;WSS;IMEX=2;RetrieveIds=Yes; DATABASE=http://pp1webofficelivecom.officelive.com/Documents/;LIST={5999B8A0-0C2F-4D4D-9C5A-D7B146E49698};The keyword "List" specifies the GUID value for the desired SharePoint list (list=table)
Может он съест, если предложить гуид нужного тебе эксельного файла?Ну и урл подправить на твой


VladConn

Игорь, спасибо!Может, но видно надо еще найти эту библиотеку, и я не знаю, как найти GUID на sharepoint. Нашел один блог, но ни хрена не понял, где и как искать нужные опции...


VladConn

> Автор: VladConn> Игорь, спасибо!> Может, но видно надо еще найти эту библиотеку,2007 Office System Driver: Data Connectivity ComponentsВ остальном не помощник, нет у меня sharepoint.Кстати ещё мысль, если не получится напрямую считать данные, можно сделать рекордсет и руками заполнить его данными


VladConn

ОК!Я не представляю, правда, как руками!Беда в том, что я не могу просто сгрузить библиотеку на корпоративный комп! :0))Игорь, еще раз спасибо!


VladConn

Проблема в ThisWorkbook.FullName. В sharepoint это путь http:\....., и ADODB ioobjConn его не понимает. Для диска работает.
strCnctn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
 "Data Source=" & replace(ThisWorkbook.FullName, "http://", "") & ";" & _
 "Extended Properties=""Excel 8.0;HDR=No"";"
Но вообще-то это сильно похоже на ... непрличиное в культурном обществе слово. Зачем подключаться через ADO к самому себе???


VladConn

White Owl,Давай неприличное слово! Я постараюсь попробовать твой код сегодня, правда я уже дома. Дело в том, что я делаю SQL запросы к данным на одном листе и сваливаю рекордсеты на другие листы в книге. А иначе там сплошные VLookups. И я всегда делаю рекордсеты через ADODB...


VladConn

> Автор: VladConn> ОК!> Я не представляю, правда, как руками!На пример так:
Dim r As New ADODB.Recordset
Dim i As Long
Dim sh As Worksheet
Set sh = ActiveSheet
r.Fields.Append "f1", adVarChar, <b>50</b>
r.Fields.Append "f2", adInteger
r.Fields.Append "f3", adVarChar, <b>150</b>
r.Open
For i = <b>2</b> To <b>2000</b>
 r.AddNew
 r!f1 = Trim(CStr(sh.Cells(i, <b>1</b>).Value))
 r!f2 = Val(sh.Cells(i, <b>2</b>).Value)
 r!f3 = Trim(CStr(sh.Cells(i, <b>3</b>).Value))
Next i
r.MoveFirst
ActiveWorkbook.Sheets("Eeno2").Range("A1").CopyFromRecordset r
> Беда в том, что я не могу просто сгрузить библиотеку на корпоративный комп!Библиотека ведь от МС, а не от кооператива "Фафаня-Лафаня" ;)И если она нужна для работы, то почему нет, не вижу никаких проблем, кроме некоторых административных в виде служебной о необходимости задействовать последние достижения в области АйТи технологий, от флагмана этой области :)> Автор: White Owl> Зачем подключаться через ADO к самому себе???Иногда бывает удобно обрабатывать строготипизированный набор данных, а не разнородную кашу, которую напихают пользователи "метайской китодой"


VladConn

> Автор: VladConnКстати!
Dim pc As PivotCache
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
 "'до разбивки'!R1C1:R3246C19").CreatePivotTable TableDestination:=ActiveSheet.Cells(<b>3</b>, <b>1</b>), _
 TableName:="СводнаяТаблица1", DefaultVersion:=xlPivotTableVersion10
Set pc = ActiveWorkbook.PivotCaches(<b>1</b>)
и если посмотреть на свойство:? pc.SourceData то оно будет указывать на файл ....... которого нет Блин, я все хочу вытащить рекордсет из самого себя используя сводную таблицу, а она не отдает его


VladConn

White Owl,Я попробовал твой код с Replace. Вылетает ошибка на Open. Система внутри себя подставляет спереди к wss/sites/... мои данныеC:\Documents and Settings\xxxxxx\Desktop\wss/sites/...и пишет "is not a valid path...."Игорь, Я посмотрел твой пример. Там же все равно подразумевается коннекшн, а в нем и проблема. И мне же надо запросы по полной программе, а не цикл подряд...Не знаю пока...


VladConn

> Автор: VladConn> Я посмотрел твой пример. Там же все равно подразумевается коннекшн, а в нем и проблема. И мне же надо запросы по > полной программе, а не цикл подряд...Где коннекшин? И цикл это для заполнения данных, в который можно добавить условие эмулирующее whereА как по другому руками сделать рекордсет?


VladConn

Игорь Горбонос,Я что-то не врубаюсь... А как же без коннекшн?


VladConn

Игорь Горбонос,До меня дошло как эмулировать WHERE, ORDER BY руками. Но как без коннекшн? Будет и без него работать?


VladConn

> Автор: VladConn> Игорь Горбонос,>> До меня дошло как эмулировать WHERE, ORDER BY руками. Но как без коннекшн? Будет и без него работать?Та я же специально показал, что работает:
ActiveWorkbook.Sheets("Лист2").Range("A1").CopyFromRecordset r
ORDER BY - предварительной сортировкой на листе, WHERE, JOIN'ы условиямиА то что без коннекшина работает, я такое в книжке вычитал, по работе с АДО, по моему Рода Стиветсона. Он показывал пример как строить свой АДО-провайдер :)Правда редко использую, обычно получается запросом выбрать данные, если бы ещё был метод обратный GetRows, что-бы из массива данные загружать в рекордсет, было-бы очень даже не плохо :)


VladConn

Игорь Горбонос,ОК. Приму к сведению... Это важная информация. Пока что я договорился с клиентом. Там порядка сорока человек будут только менять общие данные на sharepoint. А один ответственный раз в неделю будет на своем хард драйве гонять собственно запросы и копировать книгу назад в sharepoint.... Спасибо!


VladConn

White Owl,Я попробовал твой код с Replace. Вылетает ошибка на Open. Система внутри себя подставляет спереди к wss/sites/... мои данныеC:\Documents and Settings\xxxxxx\Desktop\wss/sites/...и пишет "is not a valid path...."
Ну и что? Она же в любом случае подставляет что-то вполне конкретное.В крайнем случае можешь сделать примерно так:
tmp = ThisWorkbook.FullName
if left(tmp, <b>7</b>) = "http://" then ' значит мы в sharepoint
 tmp = replace(tmp, "http://", "") ' убираем протокол
 tmp = replace(tmp, "/" , "\") ' правим слеши
 tmp = .... ' и дальше курочишь tmp, пока не превратишь его в правильный вид
end if
strCnctn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
 "Data Source=" & tmp & ";" & _
 "Extended Properties=""Excel 8.0;HDR=No"";"
Я посмотрел твой пример. Там же все равно подразумевается коннекшн, а в нем и проблема. И мне же надо запросы по полной программе, а не цикл подряд...
Так а чем циклы то не устраивают? Намного проще и надежнее работать будет.И вообще, давно пора вылезать из детских ползунков и ставить нормальную базу данных.


VladConn

White Owl,Все хорошо, но где некультурное слово?:0)Проблема с Replace в том, что сколько ни заменяй, а система потом все равно подставляет, втихаря и за кулисами. Причем узнаешь это уже в сообщении об ошибке, когда поздно пить боржоми. А циклы уже устраивают, я на будущее приму идею: она замечательная. Сейчас уже переделывать нет возможности... Праздники на носу, а потом другое делать надо будет.А замечание по базе правильное, и все у нас есть, и даже больше. Народ хочет так! Спасибо!


VladConn

Все хорошо, но где некультурное слово?:0)
Я тебе его при встрече скажу, шепотом.Не могу же я, культурный человек, говорить здесь, в культурном обществе, те некультурные слова которые мне хочется сказать глядя на доступ к собственным данным через два внешних интерфейса.


VladConn

White Owl,А у мужчины все интерфейсы должны быть внешними....:0)


VladConn

И на самом деле удобно же.