Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/75: Рейтинг темы: голосов - 75, средняя оценка - 4.53
10 / 10 / 2
Регистрация: 23.09.2012
Сообщений: 427

Доступ к данным другой книги Excel

05.01.2014, 18:17. Показов 15249. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно, работая в одной книге, открыть другую книгу и работать с данными оттуда. Есть фрагмент кода:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Dim wb As Workbook 
    DirName = ThisWorkbook.Path 
    Filename = DirName & "\Книга1.xls" 
    Set wb = Workbooks.Open(Filename) 
    
    Dim ws As Worksheet
    Set ws = Worksheets("Персонал")
    lstEmloyees.RowSource = "'Персонал'!A2:G" + CStr(wd.ws.UsedRange.SpecialCells(xlCellTypeLastCell).Row) 
        
    wb.Save
    wb.Close
Но что нужно дописать в строку
Visual Basic
1
lstEmloyees.RowSource = "'Персонал'!A2:G" + CStr(wd.ws.UsedRange.SpecialCells(xlCellTypeLastCell).Row)
чтобы программа работала?
Подскажите, пожалуйста. Не понимаю этого.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.01.2014, 18:17
Ответы с готовыми решениями:

Обращение к данным из другой книги
привет! у меня небольшой и кажется довольно простой вопрос (сильно упростил задачу, потому что проблема, как мне кажется в этом) ...

доступ к данным другой программы
Доброго времени суток :) Есть некая программа с которой грубо говоря нужно взять данные, объясните как собственно говоря это...

Доступ к данным Datagridview из другой формы
Новичок. Усердно читал 7 часто задаваемых вопросов на форуме, Но никак не могу понять, как получить доступ к данным, находящимся в...

33
10 / 10 / 2
Регистрация: 23.09.2012
Сообщений: 427
10.01.2014, 11:58  [ТС]
Студворк — интернет-сервис помощи студентам
Файл "Кафе" - главный. Там на панельке есть кнопка "Работа с персоналом". При нажатии на неё считываются данные из книги "Персонал" и загружаются на форму. Потом работника можно удалить, изменить данные, или добавить нового человека. Данные то считываются, а дальше ничего сделать невозможно.
Вложения
Тип файла: xls Персонал.xls (21.0 Кб, 20 просмотров)
Тип файла: xls Кафе.xls (59.0 Кб, 21 просмотров)
0
10 / 10 / 2
Регистрация: 23.09.2012
Сообщений: 427
10.01.2014, 12:04  [ТС]
Вы там сильно не обращайте внимания на мой кривой код. Я ведь только учусь
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
10.01.2014, 14:00
Посмотрел.
Думаю основной вопрос я уже выше решил, всё работает (заменил строку ничего в ней не меняя):

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Public Sub UpdateListRowSource()
    Dim wb As Workbook    'переменная-книга
    DirName = ThisWorkbook.Path    'получение пути, где хранится АРМ, книга-отчет хранится рядышком
    Filename = DirName & "\Персонал.xls"    'получение полного имени книги-отчета
    Set wb = Workbooks.Open(Filename)    'открытие книги-отчета
 
    Dim ws As Worksheet
    Set ws = wb.Worksheets("Персонал")
    lstEmloyees.RowSource = "'Персонал'!A2:G" & ws.[a1].CurrentRegion.Rows.Count
    wb.Close
End Sub
Остальное решать не буду, тем более что не хватает ресурсов (и в файле, и у меня )

Замечание по практическому применению - нужно бы при переходе на другие книги возвращать родной интерфейс.
А он кстати вообще не возвращается полностью даже после закрытия книги - Application.CommandBars("Management").De lete не хватает.


А вообще код совсем и не кривой.
1
10 / 10 / 2
Регистрация: 23.09.2012
Сообщений: 427
10.01.2014, 14:37  [ТС]
Спасибо Вам большое
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
10.01.2014, 15:36
Думаю там дело вот в чём (посмотрел пристальнее ) - нельзя закрывать книгу-источник листбокса. И у Вас ругается не на память, а на недоступность ресурса.
Нужно или держать ту книгу открытой, или брать данные в массив и заполнять листбокс из него (можно и с листа, но из массива быстрее).
0
10 / 10 / 2
Регистрация: 23.09.2012
Сообщений: 427
10.01.2014, 16:20  [ТС]
А будет всё нормально, если я в каждой процедуре буду открывать книгу, но закрывать только в самом конце, при закрытии формы?

Мне вариант с открытой книгой кажется проще (лично для меня). С массивом сложновато будет
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
10.01.2014, 16:31
Можно и открывать каждый раз заново, но зачем?
И если будут изменения в открытом ранее файле - то будет запрос по поводу этих изменений, т.к. они пропадут.
Лучше проверять, не открыт ли уже файл, или использовать getobject.
0
10 / 10 / 2
Регистрация: 23.09.2012
Сообщений: 427
10.01.2014, 16:42  [ТС]
А что делать с getobject? Куда и когда его писать?
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
10.01.2014, 18:20
Ну вот например некая симуляция:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub tt()
    Dim wb As Workbook    'переменная-книга
    Dim ws As Worksheet
 
    DirName = ThisWorkbook.Path    'получение пути, где хранится АРМ, книга-отчет хранится рядышком
    Filename = DirName & "\Персонал.xls"    'получение полного имени книги-отчета
    
    Set wb = GetObject(Filename)    'открытие книги-отчета
    Set ws = wb.Worksheets("Персонал")
    MsgBox ws.Cells(1)
 
    Set wb = GetObject(Filename)    'открытие книги-отчета
    Set ws = wb.Worksheets("Персонал")
    MsgBox ws.Cells(2)
 
    Set wb = GetObject(Filename)    'открытие книги-отчета
    Set ws = wb.Worksheets("Персонал")
    MsgBox ws.Cells(3)
 
    wb.Close 0    'закрываем скрытую книгу. Если что - позакрывайте лишние процессы Экселя!
End Sub
Если книга до этого не будет уже открыта - Вы её и не увидите, она откроется скрыто.
Но иногда такой способ глючит. Но редко

Как можно заметить - в этом случае книга каждый раз не "переоткрывается".
0
10 / 10 / 2
Регистрация: 23.09.2012
Сообщений: 427
10.01.2014, 18:47  [ТС]
А можно как-то сделать так, что открыть книгу один раз, делать с ней что угодно, а потом закрыть? Как-нибудь так, чтобы она была доступна из любого места программы (ну или почти из любого)?
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
10.01.2014, 19:03
Можно.
Погоняйте пошагово например такие коды.
В начале обязательно выполнить Sub otkritie(), в конце Sub zakritie()
Код должен быть в стандарном модуле!

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
Public wb As Workbook    'переменная-книга
Public ws As Worksheet
Public Filename As String
 
 
Sub otkritie()
    DirName = ThisWorkbook.Path    'получение пути, где хранится АРМ, книга-отчет хранится рядышком
    Filename = DirName & "\Персонал.xls"    'получение полного имени книги-отчета
End Sub
 
Sub tt()
    If wb Is Nothing Then
        Set wb = GetObject(Filename)    'открытие книги-отчета
        Set ws = wb.Worksheets("Персонал")
    End If
    MsgBox ws.Cells(1)
End Sub
 
Sub ttt()
    If wb Is Nothing Then
        Set wb = GetObject(Filename)    'открытие книги-отчета
        Set ws = wb.Worksheets("Персонал")
    End If
    MsgBox ws.Cells(2)
End Sub
 
Sub zakritie()
    If Not wb Is Nothing Then
        wb.Close 0    'закрываем скрытую книгу. Если что - позакрывайте лишние процессы Экселя!
        Set ws = Nothing
        Set wb = Nothing
    End If
End Sub
0
10 / 10 / 2
Регистрация: 23.09.2012
Сообщений: 427
10.01.2014, 20:46  [ТС]
Делаю так.
Это дело написала в стандартном модуле
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    Public wb As Workbook
    Public ws As Worksheet
    Public Filename As String
 
Sub WorkWithStaff()
    OpenBook
    frmStaff.Show
    CloseBook
End Sub
 
Public Sub OpenBook()
    DirName = ThisWorkbook.Path    
    Filename = DirName & "\Ïåðñîíàë.xls"    
End Sub
 
Public Sub CloseBook()
    If Not wb Is Nothing Then
        wb.Close    
        Set ws = Nothing
        Set wb = Nothing
    End If
End Sub
А это относится к самой форме:

Visual Basic
1
2
3
4
5
6
7
Public Sub UpdateListRowSource()
    If wb Is Nothing Then
        Set wb = GetObject(Filename)    
        Set ws = wb.Worksheets("Персонал")
    End If
    lstEmloyees.RowSource = "'Персонал'!A2:G" & ws.[a1].CurrentRegion.Rows.Count
End Sub
Ругается тут:
Visual Basic
1
lstEmloyees.RowSource = "'Персонал'!A2:G" & ws.[a1].CurrentRegion.Rows.Count
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
10.01.2014, 21:29
Ругается вероятно потому, что файл не открыт. Вообще ругнуться тогда должно уже строкой выше, на Set ws...
Форма так не видит переменную Filename, да и вообще их все.
Нужно писать имямодуля.Filename и аналогично с wb и ws.
Но если использовать будете только в одной форме - то переносите весь этот код в модуль формы.
Смысл в том, чтоб в начале работы в публичные переменные запомнить путь к файлу, и определить объектные переменные, которые будут указывать на файл и лист.
Затем из любой процедуры формы проверяем переменные - если там нет файла, то его открываем, если же есть - используем.
Хотя конечно можно просто каждый раз не глядя делать
Visual Basic
1
2
Set wb = GetObject(Filename)    
        Set ws = wb.Worksheets("Персонал")
Но тогда нужно сразу же файл и закрыть, иначе наплодите процессов, если вдруг wb не окажется публичной.
0
10 / 10 / 2
Регистрация: 23.09.2012
Сообщений: 427
10.01.2014, 22:04  [ТС]
Перенесла весь код в модуль формы. Всё по прежнему...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.01.2014, 22:04
Помогаю со студенческими работами здесь

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

ОЧЕНЬ медленный доступ к данным в файлах Excel
Проблем, собственно, две, и обе касательно скорости работы приложения при чтении из Excel. Использую позднее связывание - тащить левые...

Доступ к данным Excel с помощью ADO.NET
Подкиньте плиз примерчик, если кто сталкивался

Как считать Excel файл и получить доступ к данным?
Пожалуйста, кому не жалко, скинте примерчик как считать Excel'евский файл и получить доступ к данным, а может и после изменений как...

Как получить доступ к данным в новом окне excel?
Добрый день, форумчане! Возникла следующая проблема. Имеется 1 запущенный файл с макросом. Далее через специальное ПО выгружается новая...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru