I have an abstraction of a table hold als a two dimensional String array in Word VBA.
Now I want to save this array into a table in a word document, without iteration through both dimensions…afaik there is a method to get a Range(…) content from excel as array…
e.g.:
Dim rng As Excel.Range
Set rng = excelTabelle.Range("A4:F" + CStr(lastRow))
arrData = rng.Value
is there a similar solution for pasting this into a Word table?
Iterating needs too much time for the execution, so I’m looking for a more efficient way to do that.
Greets, poeschlorn
skaffman
397k96 gold badges815 silver badges768 bronze badges
asked Nov 28, 2010 at 14:40
1
One solution may be to utilize the clipboard for your needs. It is not so easy as in Excel, but perhaps fast enough for you. Here is some sample code how to get some text through the clipboard into a 2×3 word table (add a reference to Microsoft Forms 2.0 object library to your VBA doc):
Dim oData As New DataObject
Dim sText As String
' Navigate to the top-left cell of your table (just an example)
Selection.HomeKey Unit:=wdStory
' Put text to the clipboard
sText = "X1" & vbTab & "B1" & vbTab & "C1" & vbCrLf
sText = sText & "A2" & vbTab & "B2" & vbTab & "C2" & vbCrLf
On Error Resume Next
oData.SetText sText
oData.PutInClipboard
On Error GoTo 0
' Select the needed rows and columns of the table'
Selection.MoveDown Unit:=wdLine, Count:=1, Extend:=wdExtend
Selection.MoveRight Unit:=wdCharacter, Count:=2, Extend:=wdExtend
' Paste the clipboard to the table '
Selection.Paste
I suggest that you adapt this to put an arbitrary 2-dimensional array into a string and paste it in a similar manner. If you need more help, come back give us more details, please.
answered Nov 28, 2010 at 15:57
Doc BrownDoc Brown
19.6k7 gold badges52 silver badges88 bronze badges
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
Public Sub zBookmarks() Dim arr As Variant, x1, x1k, nstr Dim C1, C2, C3, C4, C5, C6, C7 As String Dim path Dim wd As Object 'Word.Application Dim doc As Object 'Word.Document Dim tbl As Object 'Word.Table '------------------------------------------------' arr = Worksheets("Лист1").Range("A1:G7").Value ' Для примера '------------------------------------------------' x1 = LBound(arr, 1) x1k = UBound(arr, 1) - 1 path = ThisWorkbook.path Set wd = CreateObject("Word.Application") wd.Visible = True 'Поменять потом на False wd.Documents.Open Filename:=path & "" & "WORD.dotm" ''wd.Documents.Open Filename:=path & "" & "EXRD111.dotm" Set doc = wd.ActiveDocument Set tbl = doc.tables(1) x1 = 0 Do While x1 < x1k x1 = x1 + 1 Debug.Print x1; If x1 > 1 Then tbl.Cell(x1 + 2, 1).Select wd.Selection.InsertRowsBelow 1 End If With tbl '' .Cells(x1 + 2, 1).Range.Text = arr(x1, 1) tbl.Cell(x1 + 2, 1).Range = arr(x1, 1) tbl.Cell(x1 + 2, 2).Range = arr(x1, 2) tbl.Cell(x1 + 2, 3).Range = arr(x1, 3) tbl.Cell(x1 + 2, 4).Range = arr(x1, 4) tbl.Cell(x1 + 2, 5).Range = arr(x1, 5) tbl.Cell(x1 + 2, 6).Range = arr(x1, 6) tbl.Cell(x1 + 2, 7).Range = arr(x1, 7) End With Loop wd.ActiveDocument.SaveAs2 Filename:=path & "" & "EXRD1.doc" wd.ActiveDocument.Close wd.Quit Set wd = Nothing End Sub |
I want to declare a dynamic string array, then make calls to each of the other procedures. This is what I have, I thought it would work but I keep getting errors.
Option Explicit
Sub Main()
Public ListArr() As String
Application.Run "Get_Input_List"
End Sub
Function Get_Input_List(ByRef ListArr() As String) As String
Dim list As String
Dim MesBox As String
list = InputBox("Please enters word to sort using a comma with no space to separate", "Words")
ListArr = Split(list, ",")
MsgBox ListArr(1)
End Function
Deduplicator
44.3k7 gold badges65 silver badges115 bronze badges
asked Sep 21, 2016 at 0:42
A couple issues here. First, Public
can only be used as an access modifier for Module level variables — not local ones, so it should be Dim ListArr() As String
. Second, you don’t need to use Application.Run
to call procedures in the same project. If you did, you aren’t passing the required parameter (which can’t be passed ByRef
via Application.Run
anyway). Third, Get_Input_List
is a function, so you should probably return the result of the Split
. Right now it always returns vbNullString
. I’m guessing that you’re looking for something more like this:
Option Explicit
Sub Main()
Dim ListArr() As String
ListArr = Get_Input_List
Dim inputWord As Variant
For Each inputWord In ListArr
MsgBox inputWord
Next
End Sub
Function Get_Input_List() As String()
Dim list As String
list = InputBox("Please enter words to sort separated with a comma and no spaces", "Words")
Get_Input_List = Split(list, ",")
End Function
answered Sep 21, 2016 at 0:52
CominternComintern
21.7k5 gold badges33 silver badges80 bronze badges
vikttur Пользователь Сообщений: 47199 |
Пробую работать с документами Word. Копирование данных в Excel. Прикрепленные файлы
|
anvg Пользователь Сообщений: 11878 Excel 2016, 365 |
#2 03.12.2013 18:47:38 Может так?
Или анализировать ActiveDocument.Range.Text, продумывать как разбивать этот текст для массива вывода на лист. Изменено: anvg — 03.12.2013 18:48:15 |
|
vikttur Пользователь Сообщений: 47199 |
#3 03.12.2013 19:02:42 Наверное, проще. Еще не пробовал. Спасибо.
Может, без этого? |
||
anvg Пользователь Сообщений: 11878 Excel 2016, 365 |
#4 03.12.2013 19:21:26
Вот только как, в смысле — загнать? Такого «красивого» Range.Value, дающего массив, в Word ни для текста объекта Range, ни для ячеек таблиц. Можно, конечно, запросить у таблицы число строк/столбцов и циклом по ячейкам (ThisDocument.Tables(1).Cell(idRow, idCol).Range.Text) считать значения в массив, только сомневаюсь, что это будет будет быстрее, чем копировать/вставлять просто текст без форматирования. |
||
vikttur Пользователь Сообщений: 47199 |
Ясно. Я объектную модель Excel плохо знаю, а уж Word… |
SkyPro Пользователь Сообщений: 309 |
#6 03.12.2013 20:13:53 Нашел здесь: http://www.cyberforum.ru/vba/thread693224.html Может поможет
SkyPro |
||
vikttur Пользователь Сообщений: 47199 |
#7 03.12.2013 20:51:19 Что подтверждает: быстрее и проще копировать-вставить, а уже потом над данными издеваться. |
Одним из решений может быть использование буфера обмена для ваших нужд. Это не так просто, как в Excel, но, возможно, достаточно быстро для вас. Вот пример кода, как получить текст через буфер обмена в таблицу слов 2×3 (добавьте ссылку на библиотеку объектов Microsoft Forms 2.0 в документ VBA):
Dim oData As New DataObject
Dim sText As String' Navigate to the top-left cell of your table (just an example)
Selection.HomeKey Unit:=wdStory' Put text to the clipboard
sText = "X1" & vbTab & "B1" & vbTab & "C1" & vbCrLf
sText = sText & "A2" & vbTab & "B2" & vbTab & "C2" & vbCrLfOn Error Resume Next
oData.SetText sText
oData.PutInClipboard
On Error GoTo 0' Select the needed rows and columns of the table'
Selection.MoveDown Unit:=wdLine, Count:=1, Extend:=wdExtend
Selection.MoveRight Unit:=wdCharacter, Count:=2, Extend:=wdExtend
' Paste the clipboard to the table '
Selection.Paste
Я предлагаю вам адаптировать это, чтобы разместить произвольный двумерный массив в строку и вставить его аналогичным образом. Если вам нужна дополнительная помощь, верните нам дополнительную информацию, пожалуйста.
Мы очень хорошо знаем, что переменная является контейнером для хранения значения. Иногда разработчики могут удерживать более одного значения в одной переменной за раз. Когда ряд значений хранится в одной переменной, он известен как переменная массива.
Содержание:
- Объявление массивов
- Назначение значений массиву
- Многомерные массивы
- Объявление ReDim
- Методы массива
- Функции для работы с массивами
- LBound
- UBound
- Split
- Join
- Filter
- IsArray
- Erase
Объявление массивов
Массивы объявляются так же, как объявлена переменная, за исключением того, что объявление переменной массива использует скобки. В следующем примере размер массива указан в скобках.
'Method 1 : Using Dim Dim arr1() 'Without Size 'Method 2 : Mentioning the Size Dim arr2(5) 'Declared with size of 5 'Method 3 : using 'Array' Parameter Dim arr3 arr3 = Array("apple","Orange","Grapes")
- Хотя размер массива указывается как 5, он может содержать 6 значений, поскольку индекс массива начинается с ZERO.
- Индекс массива не может быть отрицательным.
- Массивы VBScript могут хранить любой тип переменной в массиве. Следовательно, массив может хранить целое число, строку или символы в одной переменной массива.
Назначение значений массиву
Значения присваиваются массиву, указывая значение индекса массива для каждого из назначаемых значений. Это может быть строка.
Пример
Добавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() Dim arr(5) arr(0) = "1" 'Number as String arr(1) = "VBScript" 'String arr(2) = 100 'Number arr(3) = 2.45 'Decimal Number arr(4) = #10/07/2013# 'Date arr(5) = #12.45 PM# 'Time msgbox("Value stored in Array index 0 : " & arr(0)) msgbox("Value stored in Array index 1 : " & arr(1)) msgbox("Value stored in Array index 2 : " & arr(2)) msgbox("Value stored in Array index 3 : " & arr(3)) msgbox("Value stored in Array index 4 : " & arr(4)) msgbox("Value stored in Array index 5 : " & arr(5)) End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
Value stored in Array index 0 : 1
Value stored in Array index 1 : VBScript
Value stored in Array index 2 : 100
Value stored in Array index 3 : 2.45
Value stored in Array index 4 : 7/10/2013
Value stored in Array index 5 : 12:45:00 PM
Многомерные массивы
Массивы не ограничиваются одним измерением, однако они могут иметь максимум 60 измерений. Двумерными массивами являются наиболее часто используемые.
пример
В следующем примере многомерный массив объявляется с тремя строками и четырьмя столбцами.
Private Sub Constant_demo_Click() Dim arr(2,3) as Variant ' Which has 3 rows and 4 columns arr(0,0) = "Apple" arr(0,1) = "Orange" arr(0,2) = "Grapes" arr(0,3) = "pineapple" arr(1,0) = "cucumber" arr(1,1) = "beans" arr(1,2) = "carrot" arr(1,3) = "tomato" arr(2,0) = "potato" arr(2,1) = "sandwitch" arr(2,2) = "coffee" arr(2,3) = "nuts" msgbox("Value in Array index 0,1 : " & arr(0,1)) msgbox("Value in Array index 2,2 : " & arr(2,2)) End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
Value stored in Array index : 0 , 1 : Orange
Value stored in Array index : 2 , 2 : coffee
Объявление ReDim
Оператор ReDim используется для объявления переменных динамического массива и распределения или перераспределения пространства для хранения.
Синтаксис ReDim [Preserve] varname(subscripts) [, varname(subscripts)]
Параметр Описание
- Preserve — необязательный параметр, используемый для сохранения данных в существующем массиве при изменении размера последнего измерения.
- Varname — обязательный параметр, который обозначает имя переменной, которое должно соответствовать стандартным соглашениям об именах.
- Subscript — требуемый параметр, который указывает размер массива.
пример
В следующем примере массив был переопределен, а затем значения сохранялись при изменении существующего размера массива.
Примечание. При изменении размера массива, меньшего, чем это было первоначально, данные в устраненных элементах будут потеряны.
Private Sub Constant_demo_Click() Dim a() as variant i = 0 redim a(5) a(0) = "XYZ" a(1) = 41.25 a(2) = 22 REDIM PRESERVE a(7) For i = 3 to 7 a(i) = i Next 'to Fetch the output For i = 0 to ubound(a) Msgbox a(i) Next End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
XYZ
41.25
22
3
4
5
6
7
Методы массива
В VBScript есть встроенные функции, которые помогают разработчикам эффективно обрабатывать массивы. Все методы, которые используются вместе с массивами, перечислены ниже. Чтобы узнать об этом, нажмите на имя метода.
Функции для работы с массивами
LBound
Функция LBound возвращает наименьший индекс указанного массива.Следовательно, LBound массива — ZERO.
Синтаксис LBound(ArrayName[,dimension])
Параметы и Описание
- ArrayName — обязательный параметр. Этот параметр соответствует имени массива.
- Размер — необязательный параметр. Это принимает целочисленное значение, соответствующее размеру массива. Если это «1», то он возвращает нижнюю границу первого измерения;если это «2», то он возвращает нижнюю границу второго измерения и так далее.
пример
Добавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() Dim arr(5) as Variant arr(0) = "1" 'Number as String arr(1) = "VBScript 'String arr(2) = 100 'Number arr(3) = 2.45 'Decimal Number arr(4) = #10/07/2013# 'Date arr(5) = #12.45 PM# 'Time msgbox("The smallest Subscript value of the given array is : " & LBound(arr)) ' For MultiDimension Arrays : Dim arr2(3,2) as Variant msgbox("The smallest Subscript of the first dimension of arr2 is : " & LBound(arr2,1)) msgbox("The smallest Subscript of the Second dimension of arr2 is : " & LBound(arr2,2)) End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The smallest Subscript value of the given array is : 0
The smallest Subscript of the first dimension of arr2 is : 0
The smallest Subscript of the Second dimension of arr2 is : 0
Функция, которая возвращает целое число, соответствующее наименьшему индексу данных массивов.
UBound
Функция UBound возвращает наибольший индекс указанного массива.Следовательно, это значение соответствует размеру массива.
Синтаксис UBound(ArrayName[,dimension])
Параметры и Описание
- ArrayName — обязательный параметр. Этот параметр соответствует имени массива.
- Размер — необязательный параметр. Это принимает целочисленное значение, соответствующее размеру массива. Если это «1», то он возвращает нижнюю границу первого измерения;если он равен «2», то он возвращает нижнюю границу второго измерения и т. д.
пример
Добавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() Dim arr(5) as Variant arr(0) = "1" 'Number as String arr(1) = "VBScript 'String arr(2) = 100 'Number arr(3) = 2.45 'Decimal Number arr(4) = #10/07/2013# 'Date arr(5) = #12.45 PM# 'Time msgbox("The smallest Subscript value of the given array is : " & UBound(arr)) ' For MultiDimension Arrays : Dim arr2(3,2) as Variant msgbox("The smallest Subscript of the first dimension of arr2 is : " & UBound(arr2,1)) msgbox("The smallest Subscript of the Second dimension of arr2 is : " & UBound(arr2,2)) End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The Largest Subscript value of the given array is : 5
The Largest Subscript of the first dimension of arr2 is : 3
The Largest Subscript of the Second dimension of arr2 is : 2
Функция, которая возвращает целое число, соответствующее самому большому индексу данных массивов.
Split
Функция Split возвращает массив, который содержит определенное количество значений, разделенных на основе разделителя.
Синтаксис Split(expression [,delimiter[, count[, compare]]])
Параметры и Описание
- Выражение — требуемый параметр. Строковое выражение, которое может содержать строки с разделителями.
- Разделитель — необязательный параметр. Параметр, который используется для преобразования в массивы на основе разделителя.
- Count — необязательный параметр. Количество подстрок, которые нужно вернуть, и если указано как -1, то возвращаются все подстроки.
- Compare — Необязательный параметр. Этот параметр указывает, какой метод сравнения следует использовать.
- 0 = vbBinaryCompare — выполняет двоичное сравнение
- 1 = vbTextCompare — выполняет текстовое сравнение
пример
Добавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() ' Splitting based on delimiter comma '$' Dim a as Variant Dim b as Variant a = Split("Red $ Blue $ Yellow","$") b = ubound(a) For i = 0 to b msgbox("The value of array in " & i & " is :" & a(i)) Next End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The value of array in 0 is :Red
The value of array in 1 is : Blue
The value of array in 2 is : Yellow
Функция, которая возвращает массив, содержащий указанное количество значений. Разделить на разделитель.
Join
Это функция, которая возвращает строку, содержащую указанное количество подстрок в массиве. Это полная противоположная функция метода разделения.
Синтаксис Join(List[,delimiter])
Параметры и Описание
- Список — требуемый параметр. Массив, содержащий подстроки, которые должны быть соединены.
- Разделитель — необязательный параметр. Символ, который используется как разделитель при возврате строки. По умолчанию разделителем является
Space
.
пример
Добавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() ' Join using spaces a = array("Red","Blue","Yellow") b = join(a) msgbox("The value of b " & " is :" & b) ' Join using $ b = join(a,"$") msgbox("The Join result after using delimiter is : " & b) End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The value of b is :Red Blue Yellow
The Join result after using delimiter is : Red$Blue$Yellow
Функция, которая возвращает строку, содержащую указанное количество подстрок в массиве. Это полная противоположная функция метода разделения.
Filter
Функция фильтра, которая возвращает массив на основе нуля, который содержит подмножество массива строк на основе определенных критериев фильтра.
Синтаксис Filter(inputstrings, value[, include [,compare]])
Параметры и Описание
- Inputstrings — обязательный параметр. Этот параметр соответствует массиву строк для поиска.
- Значение — требуемый параметр. Этот параметр соответствует строке для поиска по параметру inputstrings.
- Include — необязательный параметр. Это логическое значение, которое указывает, следует ли возвращать подстроки, которые включают или исключают.
- Compare — Необязательный параметр. Этот параметр описывает, какой метод сравнения строк должен использоваться.
- 0 = vbBinaryCompare — выполняет двоичное сравнение
- 1 = vbTextCompare — выполняет текстовое сравнение
пример
Добавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() Dim a,b,c,d as Variant a = array("Red","Blue","Yellow") b = Filter(a,"B") c = Filter(a,"e") d = Filter(a,"Y") For each x in b msgbox("The Filter result 1: " & x) Next For each y in c msgbox("The Filter result 2: " & y) Next For each z in d msgbox("The Filter result 3: " & z) Next End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.p The Filter result 1: Blue
The Filter result 2: Red
The Filter result 2: Blue
The Filter result 2: Yellow
The Filter result 3: Yellow
Функция, которая возвращает массив с нулевым основанием, который содержит подмножество массива строк на основе определенных критериев фильтра.
IsArray
Функция IsArray возвращает логическое значение, указывающее, является ли указанная входная переменная переменной или переменной NOT переменной массива.
Синтаксис IsArray(variablename)
пример
Добавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() Dim a,b as Variant a = array("Red","Blue","Yellow") b = "12345" msgbox("The IsArray result 1 : " & IsArray(a)) msgbox("The IsArray result 2 : " & IsArray(b)) End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The IsArray result 1 : True
The IsArray result 2 : False
Функция, возвращающая логическое значение, указывающее, является ли входная переменная массивом.
Erase
Функция Erase используется для сброса значений массивов фиксированного размера и освобождения памяти динамических массивов.Он ведет себя в зависимости от типа массивов.
Синтаксис Erase ArrayName
- Фиксированный числовой массив, каждый элемент в массиве сбрасывается до нуля.
- Исправлен строковый массив, каждый элемент в массиве сбрасывается до нулевой длины «».
- Массив объектов, каждый элемент в массиве сбрасывается до специального значения
Nothing
.
пример
Добавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() Dim NumArray(3) NumArray(0) = "VBScript" NumArray(1) = 1.05 NumArray(2) = 25 NumArray(3) = #23/04/2013# Dim DynamicArray() ReDim DynamicArray(9) ' Allocate storage space. Erase NumArray ' Each element is reinitialized. Erase DynamicArray ' Free memory used by array. ' All values would be erased. msgbox("The value at Zeroth index of NumArray is " & NumArray(0)) msgbox("The value at First index of NumArray is " & NumArray(1)) msgbox("The value at Second index of NumArray is " & NumArray(2)) msgbox("The value at Third index of NumArray is " & NumArray(3)) End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The value at Zeroth index of NumArray is
The value at First index of NumArray is
The value at Second index of NumArray is
The value at Third index of NumArray is
Функция, которая восстанавливает выделенную память для переменных массива.
С уважением, авторы сайта Компьютерапия