Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2011, 15:46   #1
Zodiac
 
Регистрация: 30.01.2011
Сообщений: 4
Вопрос Заполнить ячейки таблицы комбобоксами

Добрый день!

Необходимо решить следующую задачку.
В экселевском файле имеется таблица людей (ФИО, место работы, дата рождения, телефон и пр.). Необходимо сформировать таблицу в ВОРДОВСКОМ документе, являющуюся подмножеством экселевской (не все столбцы).
При этом связь данных осуществляется по ФИО, т.е. все ячейки первого столбца вордовской таблицы заполнены комбобоксами (каждый из которых заполнен всеми значениями из столбца ФИО экселевской таблицы). Пользователь начинает набирать фио человека в таблице ворда и ему выскакивает подходящий вариант по мере набора, затем он останавливается на каком-то варианте и переходит к следующему комбобоксу (в следующей строке). Когда необходимое количество фамилий введено в соответствующее количество строк вордовской таблицы, пользователь запускает макрос, который заполняет остальные столбцы в таблице ворда данными из экселевской таблицы.

Для фиксированного количества строк (комбобоксов) есть рабочий вариант, но у меня не получается расширить его на случай переменного количества строк, т.к. от раза к разу количество строк в вордовской таблице будет разным.

Можно ли сделать так, что пользователь вводит в какое-то текстовое поле необходимое количество строк (потом это поле можно будет удалить), а макрос создаёт соответствующее количество комбобоксов в первом столбце таблицы и заполняет каждый из них значениями из экселевской таблицы. Т.е. у меня сейчас проблема с созданием массива комбобоксов и программным размещением этих комбобоксов в нужных ячейках таблицы.

Прошу прощения, что получилось длинно. Если будут дополнительные вопросы - с удовольствием отвечу.
Zodiac вне форума Ответить с цитированием
Старый 30.01.2011, 19:01   #2
shanemac51
Участник клуба
 
Аватар для shanemac51
 
Регистрация: 12.08.2010
Сообщений: 1,077
По умолчанию

а почему бы в экселе не ввести столбик для галочки, а затем все помеченные перетащить в ворд

для примера кусочек экселя и ворда
Имя-Галина== почта shanemac51@yandex.ru скайп shanemac51 c 8-15мск будни
Сфера интересов--word-excel-access-распознавание
shanemac51 вне форума Ответить с цитированием
Старый 30.01.2011, 21:15   #3
Zodiac
 
Регистрация: 30.01.2011
Сообщений: 4
По умолчанию

В вордовском документе есть два макроса (в модуле). Первый (LoadNames) заполняет каждый из четырёх комбобоксов фамилиями. Сделано тупо ручками для каждого комбобокса.

Код:
Sub LoadNames()

Dim docNew As Document
Dim ExcelFILE As Excel.Workbook
Dim cb1 As MSForms.ComboBox
Dim cb2 As MSForms.ComboBox
Dim cb3 As MSForms.ComboBox
Dim cb4 As MSForms.ComboBox

Dim i As Integer

Set cb1 = ThisDocument.ComboBox1
Set cb2 = ThisDocument.ComboBox2
Set cb3 = ThisDocument.ComboBox3
Set cb4 = ThisDocument.ComboBox4

Set ExcelFILE = Excel.Workbooks.Open("D:\data.xls")
With ExcelFILE      
    i = 0
    cb1.Clear
    cb2.Clear
    cb3.Clear
    cb4.Clear
    While (ExcelFILE.Sheets(1).Cells(i + 2, 1).Value <> "")
       cb1.AddItem
       cb1.List(i) = ExcelFILE.Sheets(1).Cells(i + 2, 1).Value
       cb2.AddItem
       cb2.List(i) = ExcelFILE.Sheets(1).Cells(i + 2, 1).Value
       cb3.AddItem
       cb3.List(i) = ExcelFILE.Sheets(1).Cells(i + 2, 1).Value
       cb4.AddItem
       cb4.List(i) = ExcelFILE.Sheets(1).Cells(i + 2, 1).Value
      
       i = i + 1
    Wend
End With
ExcelFILE.Close False 

End Sub

Второй макрос (LoadData) загружает оставшиеся данные в соответствии с выбранными значениями комбобоксов.

Код:
Sub LoadData()
 
Dim C(1, 4) As String 'временные переменные для значений
Dim D(2) As Integer 'номера столбцов, которые нужно взять из экселя
Dim curr_cell(0 To 3) As Integer 'номер строки в экселе по выбранной в комбобоксе фамилии

Dim cb1 As MSForms.ComboBox
Dim cb2 As MSForms.ComboBox
Dim cb3 As MSForms.ComboBox
Dim cb4 As MSForms.ComboBox

Set cb1 = ThisDocument.ComboBox1
Set cb2 = ThisDocument.ComboBox2
Set cb3 = ThisDocument.ComboBox3
Set cb4 = ThisDocument.ComboBox4

'запоминаем, какие фамилии выбраны (т.е. их номера в комбобоксе)
curr_cell(0) = cb1.ListIndex + 2
curr_cell(1) = cb2.ListIndex + 2
curr_cell(2) = cb3.ListIndex + 2
curr_cell(3) = cb4.ListIndex + 2
D(0) = 4
D(1) = 6

Set tableNew1 = ActiveDocument.Tables(1)

With tableNew1
    Set ExcelFILE = Excel.Workbooks.Open("D:\data.xls")
    With ExcelFILE
       For i = 0 To 3 'заполняем массив временными значениями
        For j = 0 To 1
            C(j, i) = ExcelFILE.Sheets(1).Cells(curr_cell(i), D(j)).Value
        Next
       Next
    End With
    ExcelFILE.Close False
    
    For i = 2 To 5 'заполянем ячейки в ворде временными значениями
        For j = 2 To 3
            .Cell(i, j).Range.InsertAfter C((j - 2), (i - 2))
        Next
    Next
End With

End Sub
В экселевском файле просто табличка 6 столбцов (ФИО, дата рождения, паспорт, место работы, автомобиль, телефон), 7 строк (для тестирования). Первая строка - заголовки.
В вордовском документе уже создана таблица из трёх столбцов (ФИО, место работы, телефон) и в ячейках первого столбца (со второй строки по пятую) руками вставлены четыре комбобокса.

Не хватает самой малости: научиться программно создавать комбобоксы внутри вордовской таблицы, а потом использовать массивы и циклы для манипулирования данными.

Идея с галочками мне не приходила в голову, потому что о VBA узнал несколько дней назад, когда понадобилось решить конкретную задачку, причём т.к. результат должен быть в ворде, то начал в нём всё делать. Кроме того, экселевский документ - это некая БД, вмешательство в которую нежелательно. Но если Вас не затруднит предоставить и такое решение, я буду только признателен.

Последний раз редактировалось Zodiac; 30.01.2011 в 22:36.
Zodiac вне форума Ответить с цитированием
Старый 31.01.2011, 12:52   #4
Zodiac
 
Регистрация: 30.01.2011
Сообщений: 4
По умолчанию

Друзья, помогите

Осталось сделать совсем чуть-чуть, но сколько ни бьюсь - не могу прорваться через эту проблему. Перелопатил схожие топики в инете, но подходящего решения не нашёл

Ай нид хельпь )))
Zodiac вне форума Ответить с цитированием
Старый 03.02.2011, 01:48   #5
Zodiac
 
Регистрация: 30.01.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от shanemac51 Посмотреть сообщение
а почему бы в экселе не ввести столбик для галочки, а затем все помеченные перетащить в ворд

для примера кусочек экселя и ворда
Перерыв гору информации так и не нашёл решения поставленной задачи, но ваше предложение показалось очень интересным, поэтому реализовал его.

Спасибо за идею.

Последний раз редактировалось Zodiac; 03.02.2011 в 01:52.
Zodiac вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как заполнить DBLookupComboBoxEh из таблицы firebird postaveche Помощь студентам 16 03.09.2010 18:46
Как заполнить форму данными из таблицы применяя макет dgadavin Microsoft Office Excel 5 11.09.2009 14:45
Уважаемые! Помогите пожалуйста заполнить вторую часть таблицы в примере) Лука Microsoft Office Excel 0 07.07.2009 16:12
Заполнить пустые ячейки ниже значениями из непустой ячейки ing60 Microsoft Office Excel 7 01.04.2009 04:20
Как сделать с двумя комбобоксами вывод на мемо NeG Общие вопросы Delphi 5 20.12.2007 04:19