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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2009, 22:03   #31
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
viter.alex:
— Обязательно комментировать код, особенно если вы его передаете другому человеку.

Ух как этого не хватает на данном форуме!!!
Этого вообще не хватает. Считают, что и так понятно. Буду рад честной оценке моего труда.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 13.01.2009, 13:51   #32
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

tolikman, тебе хватит такой функциональности макроса, или нужно еще? Там есть небольшой баг. Сразу я его не увидел. Когда линии для таблицы группируются, то якорь для новой фигуры ставится к абзацу, после которого стоит сама таблица. Если удалить этот абзац, то сетка сместится и привяжется уже к таблице. После этого двигаться уже будет только вместе с таблицей.
Но, если файл после этого не редактируется (абзацы не смещаются), то можно и так оставить.
ЗЫ: самый главный вопрос остался без ответа: зачем это нужно?
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 15.01.2009, 16:27   #33
tolikman
Форумчанин
 
Регистрация: 25.08.2008
Сообщений: 159
По умолчанию

Все делается кодом, так что можно и удалить абзац, у фигур же есть параметр anchor который можно редактировать, т.е. если ....anchor=.....Tables(X).Range, то якорь должен приявязаться к таблице, попробую - скажу результат.
Я делаю файл-программу для создания курсовых по логистике для института, т.е. препода должно все устраивать. Он создает файл, размечает, считает и вносит результаты в файл как надо, сохраняет, закрывает - и опля логистика. причем работает она достаточно долго из-зи работы непосредственно с текстом, думаю вся курсовая будет делаться за 15!!! минут, долго для кода но оперативно для студентов, ведь что-такое 15 на создание курсовой.
Да думаю кому-нибудь еще пригодится!
tolikman вне форума Ответить с цитированием
Старый 15.01.2009, 16:37   #34
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от tolikman Посмотреть сообщение
Все делается кодом, так что можно и удалить абзац, у фигур же есть параметр anchor который можно редактировать, т.е. если ....anchor=.....Tables(X).Range, то якорь должен приявязаться к таблице, попробую - скажу результат.
Я делаю файл-программу для создания курсовых по логистике для института, т.е. препода должно все устраивать. Он создает файл, размечает, считает и вносит результаты в файл как надо, сохраняет, закрывает - и опля логистика. причем работает она достаточно долго из-зи работы непосредственно с текстом, думаю вся курсовая будет делаться за 15!!! минут, долго для кода но оперативно для студентов, ведь что-такое 15 на создание курсовой.
Да думаю кому-нибудь еще пригодится!
Пробовал. Если якорь ставить уже для готового объекта, который получился после группировки, то этот объект просто удаляется. В справке написано, что «…the anchor is positioned at the beginning of the first paragraph that contains the anchoring range. If you don't specify the anchoring range, the anchoring range is selected automatically and the shape is positioned relative to the top and left edges of the page», т.е. якорь располагается в начале первого абзаца, который содержится в диапазоне, к которому якорь привязывается. Если не указать якорь при создании фигур, то он будет выбран автоматически и фигура будет расположена относительно верхней и левой границы страницы.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 15.01.2009, 18:13   #35
tolikman
Форумчанин
 
Регистрация: 25.08.2008
Сообщений: 159
По умолчанию

я тоже это уже понял. На счет привязки к следующему параграфу группы линий, так это только тогда, когда таблица стоит в начале страницы, а когда она стоит в другом месте, то якорь вешается на ближайший верхний абзац.
Я немного отредактировал твой код, ID таблицы по умолчанию не хранит ни какой информации, т.е. ID="", он предназначен для web
Код:
Option Explicit
Private nHorLinesCounter, nVertLinesCounter As Integer
Private WWTTable As Table
Private ID As Long
Public Sub ClearLines()
  Dim oline As Shape
  For Each oline In ActiveDocument.Shapes
    oline.Delete
  Next oline
End Sub
Public Sub ConnectTable(ByRef NewTable)
    Set WWTTable = NewTable
    ID = Round(Rnd() * 10000000)
End Sub
Public Sub disconnectTable()
    If Not WWTTable Is Nothing Then
        WWTTable = Nothing
    End If
End Sub
Public Sub DrawLine(Optional ByVal X As Integer = 0, Optional ByVal Y As Integer = 0, Optional ByVal additionalSize As Double = 5)
    Dim nXStartPoint, nWidthOfLine As Double
    Dim nYStartPoint, nLenghtOfLine As Double
    Dim oAnchor As Range
    Dim oline As Shape
    Dim oRow As Row
    Dim oCol As column
    If WWTTable Is Nothing Then Exit Sub
    With WWTTable
        If Y > 0 Then
            Set oRow = WWTTable.Rows(Y)
            'положение X
            nXStartPoint = -1 * (MillimetersToPoints(additionalSize) + .Cell(oRow.Index, 1).LeftPadding)
            'ширина горизонтальной линии
            nWidthOfLine = dfGetTableWidth() + Abs(nXStartPoint) + .Cell(oRow.Index, 1).RightPadding
            'переходим в первую ячейку строки
            .Cell(oRow.Index, 1).Select: Selection.Collapse
            'Якорь к тексту в ячейке
            Set oAnchor = Selection.Range
            'Рисуем линию
            Set oline = ActiveDocument.Shapes.AddLine(nXStartPoint, 0, 1, 0, oAnchor)    '
            nHorLinesCounter = nHorLinesCounter + 1
            'ключевой момент. В имя линии записываем ID таблицы, которой она принадлежит
            oline.name = "Table_" & ID & "HorLine" & nHorLinesCounter
            'относительная позиция по строке
            oline.RelativeVerticalPosition = wdRelativeVerticalPositionLine
            'расстояние от верха строки
            oline.Top = (oRow.height) / 2 '+ oRow.Height / 6
            'Устанавливаем ширину горизонтальной линии
            oline.Width = nWidthOfLine
            Set oline = Nothing
            Set oAnchor = Nothing
        End If
        If X > 0 Then
            Set oCol = WWTTable.Columns(X)
            'положение Y
            nYStartPoint = -1 * (MillimetersToPoints(additionalSize) + .Cell(1, oCol.Index).TopPadding)
            'длина вертикальной линии
            nLenghtOfLine = dfGetTableHeight() + 2 * Abs(nYStartPoint) + .Cell(1, oCol.Index).BottomPadding - .Cell(1, oCol.Index).TopPadding
            'перейтив первую ячейку столбца
            .Cell(1, oCol.Index).Select: Selection.Collapse
            'Якорь к тексту в ячейке
            Set oAnchor = Selection.Range
            'Рисуем линию
            Set oline = ActiveDocument.Shapes.AddLine(0, nYStartPoint, 0, 1, oAnchor)
            nVertLinesCounter = nVertLinesCounter + 1
            'ключевой момент. В имя линии записываем ID таблицы, которой она принадлежит
            oline.name = "Table_" & ID & "VertLine" & nVertLinesCounter
            'выравниваем линию относительно центра колонки
            oline.RelativeHorizontalPosition = wdRelativeHorizontalPositionColumn
            oline.Left = wdShapeCenter
            'запрет на перемещение линии мышкой
            oline.LockAnchor = True: oline.LayoutInCell = True
            'устанавливаем длину вертикальной линии
            oline.height = nLenghtOfLine
        End If
    End With
End Sub
Private Function dfGetTableWidth() As Double
  Dim oCurrCol As column: Dim dTableWidth As Double
  For Each oCurrCol In WWTTable.Columns
    dTableWidth = dTableWidth + oCurrCol.Width
  Next oCurrCol
  dfGetTableWidth = dTableWidth
End Function
Private Function dfGetTableHeight() As Double
  Dim oCurrRow As Row: Dim dTableHeight As Double
  For Each oCurrRow In WWTTable.Rows
    dTableHeight = dTableHeight + oCurrRow.height
  Next oCurrRow
  dfGetTableHeight = dTableHeight
End Function
Public Sub finishTable()
  Dim oShape As Shape
  If WWTTable Is Nothing Then Exit Sub
  With WWTTable
    For Each oShape In ActiveDocument.Shapes
      If InStr(oShape.name, "Table_" & ID) <> 0 Then ActiveDocument.Shapes.Range(oShape.name).Select (False)
    Next oShape
    With Selection.ShapeRange.Group
      .LockAnchor = True
    End With
  End With
End Sub
не могу понять, почуме стали такие веселые комментарии)
tolikman вне форума Ответить с цитированием
Старый 15.01.2009, 18:19   #36
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Рад, что помог.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 15.01.2009, 18:40   #37
tolikman
Форумчанин
 
Регистрация: 25.08.2008
Сообщений: 159
По умолчанию

Рад, что получил помощь! спасибо в N-ный раз)))
tolikman вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка SMS через клик по строке таблицы RUBEY Microsoft Office Excel 4 25.12.2008 11:07
Как нарисовать линию по пикселям DenLab Общие вопросы Delphi 4 03.12.2008 09:34
Как же нарисовать линию на форме? (Вопрос новичка) grey Помощь студентам 11 24.11.2008 10:31
хочу стереть линию с канвы.КАК? harmager Общие вопросы Delphi 1 24.11.2008 10:28