title | keywords | f1_keywords | ms.prod | api_name | ms.assetid | ms.date | ms.localizationpriority |
---|---|---|---|---|---|---|---|
Range object (Word) |
vbawd10.chm2398 |
vbawd10.chm2398 |
word |
Word.Range |
15a7a1c4-5f3f-5b6e-60e9-29688de3f274 |
05/23/2019 |
medium |
Range object (Word)
Represents a contiguous area in a document. Each Range object is defined by a starting and ending character position.
Remarks
Similar to the way bookmarks are used in a document, Range objects are used in Visual Basic procedures to identify specific portions of a document. However, unlike a bookmark, a Range object only exists while the procedure that defined it is running. Range objects are independent of the selection. That is, you can define and manipulate a range without changing the selection. You can also define multiple ranges in a document, while there can be only one selection per pane.
Use the Range method to return a Range object defined by the given starting and ending character positions. The following example returns a Range object that refers to the first 10 characters in the active document.
Set myRange = ActiveDocument.Range(Start:=0, End:=10)
Use the Range property to return a Range object defined by the beginning and end of another object. The Range property applies to many objects (for example, Paragraph, Bookmark, and Cell). The following example returns a Range object that refers to the first paragraph in the active document.
Set aRange = ActiveDocument.Paragraphs(1).Range
The following example returns a Range object that refers to the second through fourth paragraphs in the active document.
Set aRange = ActiveDocument.Range( _ Start:=ActiveDocument.Paragraphs(2).Range.Start, _ End:=ActiveDocument.Paragraphs(4).Range.End)
For more information about working with Range objects, see Working with Range objects.
Methods
- AutoFormat
- Calculate
- CheckGrammar
- CheckSpelling
- CheckSynonyms
- Collapse
- ComputeStatistics
- ConvertHangulAndHanja
- ConvertToTable
- Copy
- CopyAsPicture
- Cut
- Delete
- DetectLanguage
- EndOf
- Expand
- ExportAsFixedFormat
- ExportAsFixedFormat2
- ExportFragment
- GetSpellingSuggestions
- GoTo
- GoToEditableRange
- GoToNext
- GoToPrevious
- ImportFragment
- InRange
- InsertAfter
- InsertAlignmentTab
- InsertAutoText
- InsertBefore
- InsertBreak
- InsertCaption
- InsertCrossReference
- InsertDatabase
- InsertDateTime
- InsertFile
- InsertParagraph
- InsertParagraphAfter
- InsertParagraphBefore
- InsertSymbol
- InsertXML
- InStory
- IsEqual
- LookupNameProperties
- ModifyEnclosure
- Move
- MoveEnd
- MoveEndUntil
- MoveEndWhile
- MoveStart
- MoveStartUntil
- MoveStartWhile
- MoveUntil
- MoveWhile
- Next
- NextSubdocument
- Paste
- PasteAndFormat
- PasteAppendTable
- PasteAsNestedTable
- PasteExcelTable
- PasteSpecial
- PhoneticGuide
- Previous
- PreviousSubdocument
- Relocate
- Select
- SetListLevel
- SetRange
- Sort
- SortAscending
- SortByHeadings
- SortDescending
- StartOf
- TCSCConverter
- WholeStory
Properties
- Application
- Bold
- BoldBi
- BookmarkID
- Bookmarks
- Borders
- Case
- Cells
- Characters
- CharacterStyle
- CharacterWidth
- Columns
- CombineCharacters
- Comments
- Conflicts
- ContentControls
- Creator
- DisableCharacterSpaceGrid
- Document
- Duplicate
- Editors
- EmphasisMark
- End
- EndnoteOptions
- Endnotes
- EnhMetaFileBits
- Fields
- Find
- FitTextWidth
- Font
- FootnoteOptions
- Footnotes
- FormattedText
- FormFields
- Frames
- GrammarChecked
- GrammaticalErrors
- HighlightColorIndex
- HorizontalInVertical
- HTMLDivisions
- Hyperlinks
- ID
- Information
- InlineShapes
- IsEndOfRowMark
- Italic
- ItalicBi
- Kana
- LanguageDetected
- LanguageID
- LanguageIDFarEast
- LanguageIDOther
- ListFormat
- ListParagraphs
- ListStyle
- Locks
- NextStoryRange
- NoProofing
- OMaths
- Orientation
- PageSetup
- ParagraphFormat
- Paragraphs
- ParagraphStyle
- Parent
- ParentContentControl
- PreviousBookmarkID
- ReadabilityStatistics
- Revisions
- Rows
- Scripts
- Sections
- Sentences
- Shading
- ShapeRange
- ShowAll
- SpellingChecked
- SpellingErrors
- Start
- StoryLength
- StoryType
- Style
- Subdocuments
- SynonymInfo
- Tables
- TableStyle
- Text
- TextRetrievalMode
- TextVisibleOnScreen
- TopLevelTables
- TwoLinesInOne
- Underline
- Updates
- WordOpenXML
- Words
- XML
See also
- Word Object Model Reference
[!includeSupport and feedback]
Последнее время я часто сталкиваюсь с его использованием. На изученных мною ресурсах, посвященных VBA для Word, почему-то мало внимания уделяется такому важному представителю объектной модели. С его помощью можно, поистине, творить чудеса с документом.
Этот объект гораздо удобнее Selection, потому что позволяет не выделять нужную область на экране, а работать прямо с представлением документа в памяти. Это заметно ускоряет работу макросов, которые, по правде сказать, не отличаются быстродействием. При отладке программ бывает полезно воспользоваться методом Range.Select, чтобы убедиться, что вы работаете с нужным вам диапазоном.
Что же это за объект? Сразу хочу предупредить, что писать я буду, основываясь на своем понимании найденного и прочитанного в других источниках. В дословном переводе Range означает «Диапазон». Применительно к Word — это означает диапазон свойств или методов, доступных для того или иного объекта. Например, как узнать текст второго абзаца в документе? Вот так:
1 | ActiveDocument.Paragraphs(2).Range.Text |
Стоит отметить, что это вернет весь текст в абзаце с символом конца абзаца (¶). Его можно удалить функцией Replace заменив символ vbCr на пустую строку.
Но главная фишка объекта Range совсем не в этом. А в том, что его можно передвигать и изменять в размерах практически произвольно (в пределах документа, естественно). У каждого объекта Range есть два свойства: Range.Start и Range.End. Начальный и конечный символ диапазона, считая от начала документа. Начало и конец диапазона можно задавать, указывая эти свойства напрямую, а можно такой конструкцией:
1 2 | Dim oRng As Range Set oRng = ActiveDocument.Range(20, 50) |
Изменить размер уже существующего диапазона можно с помощью метода SetRange, в котором указать номер символа, с которого диапазон начинается, и каким заканчивается. Этот метод используется тогда, когда нужно изменить уже существующий диапазон. Этот метод ничего не возвращает, а работает со своим родительским объектом
1 2 3 | Dim oRng As Range Set oRng = ActiveDocument.Range oRng.SetRange 20, 50 |
С помощью Range можно получить такие объекты документа, для которых не предусмотрено коллекций, как, например, для абзацев (коллекция Paragraphs). Такими «бесхозными» объектами являются строки и страницы. Кто знает другие, пусть напишет.
Как получить страницу из документа со всем ее содержимым? Коллекции Pages не существует, что же делать? Вот здесь и понадобится Range и его метод GoTo
1 2 3 4 5 6 7 8 9 10 11 12 13 | Sub TestGoTo() Dim oRng As Range 'Даем в переменную oRng начало третьей страницы в документе. Set oRng = ThisDocument.Range.GoTo(wdGoToPage, wdGoToNext, , "3") MsgBox "Третья страница начинается с " & oRng.Start & " символа.", 64, "Метод GoTo" 'Расширяем диапазон oRng на всю третью страницу Set oRng = ThisDocument.Range(oRng.Start, oRng.GoToNext(wdGoToPage).Start) MsgBox "На третьей странице находится " & oRng.Paragraphs.Count & " абзацев.", 64, "Метод GoTo" 'Берем 10 строку с третьей страницы Set oRng = oRng.GoTo(wdGoToLine, wdGoToNext, 10) Set oRng = ThisDocument.Range(oRng.Start, oRng.GoToNext(wdGoToLine).Start) MsgBox "В десятой строке третьей страницы содержится " & oRng.Characters.Count & " символов.", 64, "Метод GoTo" End Sub |
Таким образом можно, например, сохранить каждую страницу документа в файл. На одном форуме я выкладывал пример такого макроса, нашлись даже добровольцы, которые довели его почти до совершенства.
Знакомство с объектами Range
Если вы редактируете документ самостоятельно, вы должны поместить указатель мыши в нужное место либо выделить определенный фрагмент, прежде чем добавлять, удалять или форматировать текст. Однако в Word объекты Range избавляют вас от подобной необходимости. Объект Range определяет неразрывный блок текста в документе. Объекты Range полностью независимы от точки вставки или выделенного раздела, которые пользователь видит в окне документа. После создания объекта Range вы сможете манипулировать текстом, используя команды VBA, полные аналоги мощных команд редактирования Word, точно так же, как при использовании объектов Selection.
Вы можете определить объекты Range в программном коде одним из двух следующих способов:
* работая с диапазонами с помощью свойства Range;
* определив диапазоны с помощью метода Range объекта Document.
Использование свойства Range
Открытый документ Word уже содержит объекты Range, соответствующие многим его элементам. Каждый абзац, а также таблица, отдельная ячейка таблицы, комментарий или нижний колонтитул (и это далеко не полный список) определяют диапазоны. Вы можете считать, что все эти диапазоны существуют в некотором виртуальном мире, пока не вы не обратитесь к ним с помощью свойства Range соответствующего объекта. Например, для определения объекта Range, соответствующего первому абзацу активного документа, вам следует использовать объектную ссылку следующего вида.
ActiveDocumep.t. Paragraphs (1) . Range
Поскольку подобные стандартные диапазоны уже существуют в Word, вы можете использовать объектные ссылки на них напрямую, обходясь без каких-либо переменных. Это особенно хорошо подходит для тех ситуаций, когда вам необходим один конкретный диапазон для одной операции. Например, приведенная ниже инструкция копирует вторую таблицу в документе в буфер обмена, используя метод Сору объекта Range:
ActiveDocument.Tabl es[2) .Range.Copy
Если несколько инструкций используют один и тот же диапазон, вы можете использовать конструкцию With… для ускорения как ввода кода программы, так и ее выполнения. Ниже приведен пример кода, который проводит сортировку абзацев в третьем разделе документа, отображая первое предложение полужирным:
With ActiveDocument.Section(3).Range
.Sort Sort Order := wdSortOrderAscending
.Sentences ( 1).Range.Bold = True
End With
Приведенный выше пример иллюстрирует, как объект Range содержит другие объекты, в свою очередь содержащие диапазоны. Инструкция в третьей строке обращается к дипазону, соответствующему первому предложению в исходном диапазоне, после чего отображает его полужирным. Также обратите внимание на то, что вы не можете применить форматирование непосредственно к объектам, таким как слова, предложения или абзацы; для того чтобы это сделать, вам следует использовать их свойства Range.
Если вы планируете использовать диапазон в нескольких инструкциях, которые не следуют одна за другой, вам придется присвоить диапазон переменной. Это позволит вам быстрее составить код программы, а также в конечном итоге ускорить ее выполнение.
Объекты Selection также обладают свойством Range. Это значительно упрощает использование свойств и методов, принадлежащих объектам Range существующих выделенных областей. Приведенный ниже пример присваивает диапазон выделенной области переменной, перемещает выделенную область, после чего преобразует текст прописными буквами:
Set deRange = Selection.Range
Selection.Move Unit := wdParagraph, Count := 3
DeRange.Case = wdLowerCase
Читайте также
Использование свойства Range
Использование свойства Range
Открытый документ Word уже содержит объекты Range, соответствующие многим его элементам. Каждый абзац, а также таблица, отдельная ячейка таблицы, комментарий или нижний колонтитул (и это далеко не полный список) определяют диапазоны. Вы можете
Определение диапазонов с помощью метода Range
Определение диапазонов с помощью метода Range
Если существующие объекты не содержат текст, с которым вы хотите работать, создайте собственный объект Range. В любом открытом документе вы сможете определить столько объектов Range, сколько вам нужно. При этом используется метод
Использование в коде объектов Range для работы с ячейками
Использование в коде объектов Range для работы с ячейками
Весьма неожиданно, что в Excel нет объекта Cell (Ячейка). Поэтому при написании кода следует руководствоваться следующим подходом: для указания ячейки в VBA-коде используется объект Range. В Excel объект Range может заключать в
Определение объекта Range
Определение объекта Range
В Excel имеется несколько возможных методов идентификации диапазона из одной или нескольких ячеек, на который должен воздействовать написанный код. Для достижения данной цели используются следующие.Стандартная ссылка на ячейку. Так называемый
Работа с MBV-объектами
Работа с MBV-объектами
Наши первые приложения удаленного взаимодействия позволяли доступ клиентов к одному WKO-типу. Напомним, что WKO-типы (по определению) являются MBR-типами, поэтому доступ клиента к ним осуществляется через агента-посредника. В противоположность этому,
Работа с объектами команд
Работа с объектами команд
Теперь, когда вы понимаете роль объекта соединения, мы выясним, как предъявить SQL-запрос базе данных. Тип SqlCommand (который получается из DbCommand) является объектом представлением SQL-запроса, имени таблицы или хранимой процедуры. Вид соответствующей
Операции с объектами
Операции с объектами
Взглянем еще раз на нашу будущую визитку. Вы увидите, что каждый ее отдельный элемент заключен в пунктирную рамочку. А если вы щелкнете по нему, то на линиях рамки проявятся кружочки – по углам и в центре каждой линии.
Эти рамки нужны лишь для того,
Действия с созданными объектами
Действия с созданными объектами
К основным операциям с объектами относятся изменение размеров и свойств, удаление, копирование, вырезание и др. Также после размещения нескольких объектов на рабочих страницах mimio Блокнота может понадобиться их преобразовать,
Действия с созданными объектами
Действия с созданными объектами
К основным операциям с объектами относятся изменение размеров и свойств, удаление, копирование, вырезание, упорядочивание и др.Пропорциональное изменение размера объекта1. Выделить объект инструментом Выбрать.2. Прижать маркер к
Работа с объектами и ссылками
Работа с объектами и ссылками
Вернемся к более приземленным проблемам и рассмотрим, как программные системы работают с объектами, как создают и используют гибкие структуры данных.
Что происходит с объектами
Что происходит с объектами
ОО-программа создает объекты. Предыдущая лекция показала, как полезно полагаться на динамическое создание для получения гибких объектных структур, подстраивающихся автоматически к нуждам
Работа с утилизированными объектами
Работа с утилизированными объектами
Для реализации fresh и recycle, можно среди других возможных вариантов представить available как стек: fresh будет удалять элемент из стека, а recycle будет помещать элемент в стек. Создадим класс STACK_OF_LINKABLES для этого случая и добавим следующие
6.3.6. Управляем объектами
6.3.6. Управляем объектами
Для выполнения заданий нам понадобится материал разд. 5.3.3.Вспомним, какие действия будут происходить на слайде.? Звук начинает проигрываться с самого начала С самого же начала появляется текст с фоном.? Затем при чтении слова «Ивашка» появляется
Show All
Working with Range Objects
A common task when using Visual Basic is to specify an area in a document and then do something with it, such as insert text or apply formatting. For example, you may want to write a macro that locates a word or phrase within a portion of a document. The portion of the document can be represented by a Range
object. After the Range object is identified, methods and properties of the Range object can be applied in order to modify the contents of the range.
A Range object refers to a contiguous area in a document. Each Range object is defined by a starting and ending character position. Similar to the way bookmarks are used in a document, Range objects are used in Visual Basic procedures to identify specific portions of a document. A Range object can be as small as the insertion point or as large as the entire document. However, unlike a bookmark, a Range object only exists while the procedure that defined it is running.
The Start, End
and StoryType
properties uniquely identify a Range object. The Start and End properties return or set the starting and ending character positions of the Range object. The character position at the beginning of the document is zero, the position after the first character is one, and so on. There are eleven different story types represented by the WdStoryType constants of the StoryType property.
Note Range objects are independent of the selection. That is, you can define and modify a range without changing the current selection. You can also define multiple ranges in a document, while there is only one selection per document pane.
Using the Range method
The Range
method is used to create a Range object in the specified document. The Range method (which is available from the Document
object) returns a Range object located in the main story given a start and end point. The following example creates a Range object that is assigned to a variable.
Sub SetNewRange()
Dim rngDoc As Range
Set rngDoc = ActiveDocument.Range(Start:=0, End:=10)
End Sub
The variable refers to the first ten characters in the active document. You can see that the Range object has been created when you apply a property or method to the Range object stored in a variable. The following example applies bold formatting to the first ten characters in the active document.
Sub SetBoldRange()
Dim rngDoc As Range
Set rngDoc = ActiveDocument.Range(Start:=0, End:=10)
rngDoc.Bold = True
End Sub
When you need to refer to a Range object multiple times, you can use the Set statement to set a variable equal to the Range object. However, if you only need to perform a single action on a Range object, there’s no need to store the object in a variable. The same results can be achieved using just one instruction that identifies the range and changes the Bold
property.
Sub BoldRange()
ActiveDocument.Range(Start:=0, End:=10).Bold = True
End Sub
Like a bookmark, a range can span a group of characters or mark a location in a document. The Range object in the following example has the same starting and ending points. The range does not include any text. The following example inserts text at the beginning of the active document.
Sub InsertTextBeforeRange()
Dim rngDoc As Range
Set rngDoc = ActiveDocument.Range(Start:=0, End:=0)
rngDoc.InsertBefore "Hello "
End Sub
You can define the beginning and end points of a range using the character position numbers as shown above, or use the Start and End properties with objects such as Selection, Bookmark, or Range. The following example creates a Range object beginning at the start of the second paragraph and ending after the third paragraph.
Sub NewRange()
Dim doc As Document
Dim rngDoc As Range
Set doc = ActiveDocument
Set rngDoc = doc.Range(Start:=doc.Paragraphs(2).Range.Start, _
End:=doc.Paragraphs(3).Range.End)
End Sub
For additional information and examples, see the Range
method.
Using the Range property
The Range property appears on multiple objects, such as Paragraph, Bookmark, and Cell, and is used to return a Range object. The following example returns a Range object that refers to the first paragraph in the active document.
Sub SetParagraphRange()
Dim rngParagraph As Range
Set rngParagraph = ActiveDocument.Paragraphs(1).Range
End Sub
After you have a Range object, you can use any of its properties or methods to modify the Range object. The following example selects the second paragraph in the active document and then centers the selection.
Sub FormatRange()
ActiveDocument.Paragraphs(2).Range.Select
Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
End Sub
If you need to apply numerous properties or methods to the same Range object, you can use the With…End With structure. The following example formats the text in the first paragraph of the active document.
Sub FormatFirstParagraph()
Dim rngParagraph As Range
Set rngParagraph = ActiveDocument.Paragraphs(1).Range
With rngParagraph
.Bold = True
.ParagraphFormat.Alignment = wdAlignParagraphCenter
With .Font
.Name = "Stencil"
.Size = 15
End With
End With
End Sub
For additional information and examples, see the Range
property topic.
Redefining a Range object
Use the SetRange
method to redefine an existing Range object. The following example defines a range as the current selection. The SetRange method then redefines the range so that it refers to current selection plus the next ten characters.
Sub ExpandRange()
Dim rngParagraph As Range
Set rngParagraph = Selection.Range
rngParagraph.SetRange Start:=rngParagraph.Start, _
End:=rngParagraph.End + 10
End Sub
For additional information and examples, see the SetRange method.
Note When debugging your macros, you can use the Select
method to ensure that a Range object is referring to the correct range of text. For example, the following example selects a Range object, which refers the second and third paragraphs in the active document, and then formats the font of the selection.
Sub SelectRange()
Dim rngParagraph As Range
Set rngParagraph = ActiveDocument.Paragraphs(2).Range
rngParagraph.SetRange Start:=rngParagraph.Start, _
End:=ActiveDocument.Paragraphs(3).Range.End
rngParagraph.Select
Selection.Font.Italic = True
End Sub
Объект
Range можно создать несколькими способами:
Первый
способ — воспользоваться методом
Range() объекта Document. В этом случае вам
потребуется передать номера начального
и конечного символов диапазона, а также
текст документа, в который будут
отсчитываться эти символы. Например,
создать диапазон, который будет включать
в себя первые 10 символов документа,
можно так:
Dim
rngDoc As Range
Set
rngDoc = ActiveDocument.Range(Start:=0, End:=10)
Второй
способ — воспользоваться свойством
Range, которое предусмотрено для большого
количества объектов (Bookmark, Selection,
Table-Row-Cell, Paragraph и т. п.). В этом случае при
помощи этого свойства мы получаем
объект Range, представляющий данный объект;
Третий
способ — воспользоваться большим
количеством вспомогательных свойств
(Characters, Words, Sentences и т. п.), которые делят
текст на отрезки — объекты Range. Эти
свойства возвращают коллекции объектов
Range
45.
VBA
в WORD.Сжатие
диапазона или выделенной области
Collapse
– для сжатия. Область стягивается в
начальную или конечную позицию.
Направление сжатия задает параметр
Direction(wdCollapse_Start,
wdCollapseEnd).
По умолчанию область сжимается в начало.
Пример:
сжатие выделенной области в начальную
точку.
Selection.Collapse(Direction:=wdCollapseEnd)
Удаление
текста – Delete,
копирование – Copy,
вставка – Paste.
Если объект назначение еще не сжат,
выделенный текст просто заменит исходный
текст в объекте.
46.
VBA
в WORD.Поиск
и замена текста. Работа с найденным
текстом..
Основная
работа метода Execute — обнаружение первого
экземпляра искомого текста или
форматирования в указанном диапазоне
или выделенной области. После выполнения
этого метода вам прежде всего следует
определить, было ли найдено то, что вы
ищете. Для подобной проверки используйте
свойство Found объекта Find совместно с
инструкцией If…Then, как показано на
примере следующей заготовки программного
кода:
If
.Found = True Then
(выполнение
определенных действий с найденным
текстом)
Else
(отображение
соответствующего сообщения)
End
If
47.VBA
в WORD.
Замена текста или форматирования.
Используется
объект
Replacement.
With.ActiveDocument.Content.Find
.ClearFormatting
.Text=”ptt”
With.Replacement
.ClearFormatting
.Text=”my”
End
With
.Executive
Replace:=wdReplaceAll
End
With
Replace
используется для контроля: будут ли
заменены все найденные экземпляры.
44 .Vba в word. Перемещение диапазона или выделенной области.
Word
VBA позволяет вам повторно определять
начало и конец диапазона или выделенной
области. Только имейте в виду, что методы,
в имени которых присутствует слово
Move, изменяют расположение диапазона
или выделенной области: они не перемещают
текст, который содержится в указанном
объекте. Метод Move изменяет диапазон или
выделенную область, начиная с их сжатия,
отмечая их расположение, а в них уже нет
никакого текста. Расположение совпадает
с началом исходного объекта. После этого
метод Move перемещает «сжатый» объект
в соответствии с ваши ми инструкциями.
По окончании перемещения вы можете
использовать методы Expand и MoverEnd для
наполнения объекта текстом. Приведенный
ниже пример перемещает именованный
диапазон в документе на два абзаца
назад. Обратите внимание на то, что вы
используете именованную константу в
качестве значения аргумента Unit (список
всех допустимых именованных констант
приведен в разделе «Расширение
диапазонов и выделенных областей»
раньше в этой главе). Аргумент Count
представляет собой целое положительное
число, если вы хотите перемешать объект
вперед по документу (т.е. к его концу),
или отрицательное, если вы хотите
перемещать объект назад по документу.
В приведенном ниже примере аргументы
не заключены в скобки, поскольку
возвращенное методом значение (количество
перемещенных элементов) здесь не
используется:
SelectRange.Move
Unit : = waParagraph, Count, : = -2
Методы
MoveStart. и MoveEnd работают практически так
же, как и метод Move, только они изменяют
начальную или конечную точку диапазона
или выделенной области соответственно.
Приведенная ниже инструкция перемешает
начало выделенной области натри слова
ближе к концу документа:
Selection.MoveStart
Unit : = wdWord, Count := 3
Обратите
внимание на то, что если вы перемещаете
начальную точку объекта в конец, Word
сожмет диапазон или выделенную область
и переместит их в соответствии с
указанными инструкциями.
Еще
одна пара методов, StartOf или EndOf, перемешает
или расширяет начало или конец диапазона
или выделенной области. Метод StartOf
перемещает начало объекта обратно к
началу текущего блока, в то время как
метод EndOf перемещает конец объекта
вперед к концу текущего блока.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #