Заполните Word Combobox с данными Excel через VBA
Я новичок в VBA, поэтому я борюсь с этим уже пару дней.
У меня есть комбинированный список в Word с контактами, у меня также есть файл Excel (contacts.xls) с одним столбцом (имена всех контактов). Когда я открываю Word-документ, Макрос должен заполнить поле со всеми именами из файла Excel.
Можно ли прислать мне рабочий пример этого для Word 2007? Кажется довольно простым, но просто не могу заставить это работать...
Заранее спасибо!
2 ответа
Если вы собираетесь читать из файла Excel в Word, вам придется открыть его. Он будет использовать такой код:
Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object
'Start a new workbook in Excel
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Open("FileName.xlsx")
Вы также, вероятно, захотите зайти в Tools->References в проекте VB и найти библиотеку Excel на своем компьютере (и, конечно, проверить). Есть способы обойти это, если это необходимо, но это проще.
Затем вы можете прочитать значения из рабочей книги:
oBook.Worksheets(1).cells(1,1)
Я не совсем уверен, что синтаксис, чтобы получить его в поле со списком. Посмотрите "элементы объекта combobox" в слове vbe. Будет свойство списка или что-то в этом роде.
Извините, я сейчас на Linux-машине, поэтому я не могу отладить точный код для вас.
У меня есть более полный код для вас сейчас:
Option Explicit
Sub TestDropDownFromExcel()
Dim counter As Long
Dim xlApp As Excel.Application
Dim xlBook As Workbook
Dim oCC As ContentControl
Set oCC = ActiveDocument.ContentControls(1)
Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Open("C:\Path\To\MyFile.xlsx")
If xlBook Is Nothing Then
Exit Sub
End If
oCC.DropdownListEntries.Clear
For counter = 1 To 10
oCC.DropdownListEntries.Add Text:=xlBook.Worksheets(1).Cells(counter, 1), Value:=CStr(counter)
Next counter
xlApp.Visible = True
Set xlBook = Nothing
Set xlApp = Nothing
End Sub
Имейте в виду, что здесь очень мало проверок ошибок. Кроме того, вместо вызова.Visible в конце, вы можете просто вызвать.Close, если вы не хотите, чтобы пользователь видел его (для финального проекта это, вероятно, предпочтительнее. Отражение (= Nothing) - это хорошая практика для есть, но VBA очищается автоматически в конце выполнения. Очевидно, я предполагаю, что вы хотите первый выпадающий список (ContentCOntrols(1)), но это может быть не так.