Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Модератор
Эксперт .NET
3363 / 3023 / 463
Регистрация: 27.01.2014
Сообщений: 5,617
1

Что нужно сделать, чтоб данный код работал с поздним связыванием Excel?

15.01.2015, 20:17. Показов 2387. Ответов 30

Мне нужно перевести приложение на позднее связывание с EXCEL'ем, так как планируется его использование с разными версиями офиса от 2007 до 2013 и я столкнулся с такой вот неприятной проблемой...

Вобщем в коде, что ниже, в случае, если его применять без позднего связывания, заменив слово "EXCEL" на "Microsoft.Office.Interop.EXCEL", и добавив воответствующую ссылку, то все работает, и линии в ячейках благополучно отчищаются и рисуются новые.
Но, что нужно сделать, чтоб данная штука работала С ПОЗДНИМ СВЯЗЫВАНИЕМ? Не могу сообразить.
Пробовал xl_APP, xl_BOOK, xl_SHEET - выдаёт ошибку, типа не может найти в объекте нужные данные...

Эти "XlBorderWeight.xlThin" и т.д. являются какими то офисными константами вроде, но вот как к ним обратиться, без привязки офисных библиотек? Помогите разобраться, люди добрые... Очень надо...

PS: Если у кого-то есть литература или свои наработки по-вопросу позднего связывания EXCEL в VB.NET, очень буду благодарен, если поделитесь.

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Dim oRng 'Переменная для диапазона ячеек
Dim fName as String = "C:\Книга.xls"
Dim xl_APP as Object = CreateObject("EXCEL.Application") 'Создать объект EXCEL
Dim xl_BOOK as Object = xl_APP.Workbooks.Open(fName) 'Открыть книгу в EXCEL
Dim xl_SHEET as Object = xl_BOOK.Worksheets("General Communication") 'Выбрать нужный лист, с которым будем работать
 
    oRng = xl_SHEET.Range("A1:K" & .UsedRange.Rows.Count) 'Определить диапазон ячеек
    oRng.ClearContents()
    oRng.HorizontalAlignment = EXCEL.XlHAlign.xlHAlignCenter 'Текст Горизонтально По-Центру
    oRng.VerticalAlignment = EXCEL.XlVAlign.xlVAlignCenter 'Текст Вертикально По-Центру
 
        'Стереть все линии существующей таблицы
        With oRng.Borders 
            'Убираем диагональные границы
                .LineStyle = EXCEL.XlLineStyle.xlLineStyleNone 'Выставляем прозрачную линию
                .Item(EXCEL.XlBordersIndex.xlDiagonalDown).LineStyle = EXCEL.Constants.xlNone 'Убираем низ диагонали
                .Item(EXCEL.XlBordersIndex.xlDiagonalUp).LineStyle = EXCEL.Constants.xlNone 'Убираем верх диагонали
                
'Рисуем ячейки, куда будем копировать значения из DataGrid
                .Weight = EXCEL.XlBorderWeight.xlThin   'Выбираем тонкую линию
                .LineStyle = EXCEL.XlLineStyle.xlContinuous 'Выбираем сплошную линию
                .ColorIndex = 0 'Делаем черный цвет линии
                .TintAndShade = 0
        End With
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.01.2015, 20:17
Ответы с готовыми решениями:

Что нужно добавить чтоб работал код вызова картинок в превью
Я вставляю прямо в тело статьи и всё работает, но перестаёт работать когда создаю еще одну...

Незнаю как сделать чтоб код сам работал
Незнаю как сделать чтоб код сам работал а не по нажатию кнопки, есть ли какието средства?

Как сделать этот код без указателя, чтоб работал
Данные о росте 25 учеников класса, упорядоченные по убыванию, записаны в массиве. В начале...

Надо сделать общий код, но чтоб он работал только на главное меню
В общем у меня есть одни общие стили для меню. Стили активного меню. Блок отъезжает справа, в...

30
8349 / 4560 / 1785
Регистрация: 11.02.2013
Сообщений: 9,662
15.01.2015, 20:45 2
Лучший ответ Сообщение было отмечено Yury Komar как решение

Решение

Объяви как Dynamic
2
Модератор
Эксперт .NET
3363 / 3023 / 463
Регистрация: 27.01.2014
Сообщений: 5,617
15.01.2015, 21:43  [ТС] 3
ViterAlex, не понял..?

Добавлено через 22 секунды
ViterAlex, пока на примере...

Добавлено через 10 минут
ViterAlex, а все я понял. Тоесть все так же как и подлюченной библиотекой должно работать? Никаких юольше дополнений?
Нашел у мелкомягких объяснение
A dynamic object exposes members such as properties and methods at run time by using dynamic interfaces that are defined in the System.Dynamic namespace.
Добавлено через 2 минуты
ViterAlex, тоесть я так понимпю, если использовать позднее связывание с любым другим COM объектом - то лучше забыть про Object и использовать Dynamic? Тоесть он работает так же как и Object только куда глубже?

Добавлено через 37 минут
ViterAlex, ещетвот вспомнил, как то задавался вопросом еще на VB6, а тут вот столкнулся с этим в VB.NET Нужен очень простой и очень содержательный мануал по взаимодействию приложений, написанных на VB 6.0


Из поста понял одно, если писать придется на VB6, в силу обстоятельств... Там Dynamic вроле бы нету вообще. Тогда нужно вводить эти кончтанты в численных значениях...
вопрос: не знаете где взять их?
0
8349 / 4560 / 1785
Регистрация: 11.02.2013
Сообщений: 9,662
15.01.2015, 22:44 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от Yury Komar Посмотреть сообщение
кончтанты в численных значениях...
вопрос: не знаете где взять их?
В справке по VBA. Все константы являются членами перечислений и начинаются с букв wd. Я смотрю в редакторе VBA в окне Immediate (Ctrl+G). Ввожу такого типа строку:
Код
?ИмяКонстанты
2
Модератор
Эксперт .NET
3363 / 3023 / 463
Регистрация: 27.01.2014
Сообщений: 5,617
15.01.2015, 22:50  [ТС] 5
ViterAlex, спасибо, очень помогли... Моя программа спасена
0
Модератор
Эксперт .NET
3363 / 3023 / 463
Регистрация: 27.01.2014
Сообщений: 5,617
22.01.2015, 01:38  [ТС] 6
ViterAlex, а не так то и просто использовать DynamicObject... просто объявить не достаточно.
0
8349 / 4560 / 1785
Регистрация: 11.02.2013
Сообщений: 9,662
22.01.2015, 11:47 7
Что не получается?
0
Модератор
Эксперт .NET
3363 / 3023 / 463
Регистрация: 27.01.2014
Сообщений: 5,617
22.01.2015, 17:08  [ТС] 8
ViterAlex, обявляю xl_App as DynamicObject, в попытках создать объект екселя - говорит что не может...
в справке вычитал что нужно отдельный класс создавать и все константы тоже указывать. Какой же тогда смысл в нём.
млжет можно рабочий пример на эту тему именно с создание динамикОбджект экселя и обращение к константам ПО ИМЕНИ а не по их коду? Если есть такой пример рабочий. А то я не совсем понял как его использовать...

Добавлено через 1 час 39 минут
ViterAlex, если используете VS2010, наберите в справке "Пошаговое руководство. Создание и использование динамических объектов (C# и Visual Basic)" вот там стока всего, что не так то и просто ОБЪЯВИТЬ как Dynamic...
1
8349 / 4560 / 1785
Регистрация: 11.02.2013
Сообщений: 9,662
22.01.2015, 20:58 9
Если хочешь обращаться по имени, то только создавая отдельный класс и объявляя все константы там. Иначе никак. Думаю, такой класс или модуль уже сделали.
Как создаёшь объект Excel?
0
Модератор
Эксперт .NET
3363 / 3023 / 463
Регистрация: 27.01.2014
Сообщений: 5,617
22.01.2015, 21:55  [ТС] 10
ViterAlex,
VB.NET
1
2
Dim xl_App as DynamicObject
xl_All = CreateObject("Excel.Application")
Добавлено через 2 минуты
Если хочешь обращаться по имени
а я так понял что объявляя как Dynamic - он эти имена будет сам находить в объекте... или я не правильно понял?
0
8349 / 4560 / 1785
Регистрация: 11.02.2013
Сообщений: 9,662
24.01.2015, 19:11 11
Я был не прав. Тип dynamic используется в c#, в VB у него нет эквивалента. Но можно использовать тип Object и Option Strict Off
Но в любом случае, обращаться к константам по имени можно только вынеся их в отдельный класс или модуль
0
Модератор
Эксперт .NET
3363 / 3023 / 463
Регистрация: 27.01.2014
Сообщений: 5,617
24.01.2015, 21:27  [ТС] 12
ViterAlex, спасибо именно так я и сделал...
Найти бы классы с константаки для Word и Excel тогда вопрос решился б махом )))

Добавлено через 18 минут
ViterAlex, кстати вот, нашел как вытащить константы из офиса.
http://support2.microsoft.com/?kbid=239930
0
Модератор
Эксперт .NET
3363 / 3023 / 463
Регистрация: 27.01.2014
Сообщений: 5,617
29.01.2015, 09:59  [ТС] 13
ViterAlex, вопрос решился...
зделал софтинку которая эти константы выдёргивает.

К теме
0
26 / 18 / 8
Регистрация: 25.01.2015
Сообщений: 48
29.01.2015, 14:47 14
Не понял зачем позднее связывание. Только что добавил референции до PIA office15 (2013) и все работает и на 2010. 99% уверен что будет работать и на 2007.
Я лично не пользую PIA а пользую старый interop.excel.dll (перед PIA VisualStudio делал етот интероп и ставил в bin) который ставлю в bin директории делаю референции и ето 100% работает с все версии Ексела.
0
Модератор
Эксперт .NET
3363 / 3023 / 463
Регистрация: 27.01.2014
Сообщений: 5,617
29.01.2015, 22:29  [ТС] 15
Иван Чолев, а ты попробуй запустить на разных офисах 2003, 2007, 2010, 2013?
2010 и 2013 вроде потянут если Office.Interops 14.0 подключена а вот ниже версии уже непотянут. Поэтому позднее связывание - и получаешь софт НЕ ПРИВЯЗАННЫЙ к какой-то конкретной версии...

Добавлено через 1 минуту
Иван Чолев, тоесть ты библиотеку тамкаешь постоянно? не всегда удобно..

Добавлено через 1 час 57 минут
Иван Чолев, кстати, раз уж заговорили - может и вам было бы неплохо поделиться своим способом - а именно старенькой библиотекой interop.excel.dll
0
1677 / 1168 / 224
Регистрация: 23.12.2010
Сообщений: 1,504
30.01.2015, 00:40 16
Цитата Сообщение от Yury Komar Посмотреть сообщение
позднее связывание - и получаешь софт НЕ ПРИВЯЗАННЫЙ к какой-то конкретной версии...
а если в свойствах ссылки установить CopyLocal = False, и не таскать библиотеку с собой? Программа тогда будет использовать не ту библу, что под боком, а ту, что в системе зарегистрирована ( а если не зарегистрирована - значит и экселя нет). Лично мне подобный финт помог однажды. В итоге прога, писанная при имеющемся под рукой 2003 Ворде, без проблем заработала с 2010. С 2014 не пробовал.
1
Модератор
Эксперт .NET
3363 / 3023 / 463
Регистрация: 27.01.2014
Сообщений: 5,617
30.01.2015, 00:49  [ТС] 17
свойствах ссылки установить CopyLocal = False
а вот этого не знал.! Спасибо... тоесть работать так же должно как и при позднем связывании? Надо проверить... Так и правда гораздо удобнее...

С 2014 не пробовал
его еще нет. Есть 2013

Добавлено через 2 минуты
Юпатов Дмитрий, а еще, если библу таскать с собой, но екселя в системе нет - то есть ли возможность создавать и редактировать в этом случае Ексель файлы?
0
1677 / 1168 / 224
Регистрация: 23.12.2010
Сообщений: 1,504
30.01.2015, 00:50 18
Цитата Сообщение от Иван Чолев Посмотреть сообщение
Не понял зачем позднее связывание
Если объем работы с сервером автоматизации небольшой, то нет смысла вошкаться с пристегиванием.
Например, задача - программа формирует отчет в виде .mht-файла, но крайне желательно предусмотреть сброс отчета в Эксель.
Вариант 1: пишем код, который будет связываться с ним, форматировать таблицы, вгонять туда данные, рисунки (это из реальной задачи).... в итоге довольно геморно.
Вариант 2: запустить Эксель, открыть в нем файл отчета в исходном формате и пересохранить в xls. Это в пределах десятка строк кода.
Вот и зачем тут раннее связывание?
0
Модератор
Эксперт .NET
3363 / 3023 / 463
Регистрация: 27.01.2014
Сообщений: 5,617
30.01.2015, 00:50  [ТС] 19
Юпатов Дмитрий, а вообще, вроде если подключаешь старую библу, то в новых версиях пойдет, а ечли с новой например 14.0 то со старыми версиями вроде как не будет...
0
1677 / 1168 / 224
Регистрация: 23.12.2010
Сообщений: 1,504
30.01.2015, 01:01 20
Цитата Сообщение от Yury Komar Посмотреть сообщение
его еще нет. Есть 2013
та да, это я перегнул. Правда, я и 2010 особо не пользую. Только дома поставил, попробовал.
Цитата Сообщение от Yury Komar Посмотреть сообщение
если библу таскать с собой, но екселя в системе нет - то есть ли возможность создавать и редактировать в этом случае Ексель файлы
нее... это было бы слишком просто Тут эта библиотека никак не спасет

Добавлено через 7 минут
Цитата Сообщение от Yury Komar Посмотреть сообщение
а вообще, вроде если подключаешь старую библу, то в новых версиях пойдет, а ечли с новой например 14.0 то со старыми версиями вроде как не будет...
скажем так, есть на руках программа, писавшаяся (точнее, переписывавшаяся) в связке с 2007, но без проблем в итоге заработала и с 2003. Только в процедуре старта предусмотрел определение версии Экселя и в зависимости от этого - или создание/активирование панели с кнопками (2003) или загрузку своей вкладки на ленте (2007).
Думаю, проблемы могут возникнуть, если в более свежей версии появились новые члены в объектной модели, мы их использовали, а вот потом в старой выдаст ошибку, т.к. нужного не найдет. Но пока тьфу-тьфу, не сталкивался (бо пользую 2007 все же, а не 2010).
Это вот ViterAlex может подскажет, ничего ли нового в этом плане не вышло в 2010 или 2013 версиях.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.01.2015, 01:01

Что тут нужно поменять что бы код работал?
Дано предложения: "ЛЕНЬ - МАТЬ ВСЕХ ПОРОКОВ" В заданном предложении вырезать каждую третью букву...

Нужно что бы код работал каждую секунду
Как сделать так что бы код выполнялся каждую секунду?

Нужно чтоб работал только Worksheet_BeforeRig
kak ja ponjal posle pravovo shelchka rabotajet Private Sub Worksheet_BeforeRightClick(ByVal...

Что нужно знать чтоб писать код на C++ в игровой индустрии
какие темы знать начинающему программисту чтоб начать писать код.


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

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

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