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

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

05.01.2014, 18:17. Показов 15396. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru