Как правильно получить положение курсора в Word с помощью VBA? - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь написать программу на VBA, которая записывает некоторый текст в документ Word, и я хочу, чтобы, когда текст доходил до определенного расстояния с левой стороны документа, он печатал оставшиеся символы до следующая полная остановка, а затем начинается новая строка и вкладка для каждого символа в строке. Вот пример того, что должно произойти:

enter image description here

Код, который я ниже, работает правильно на первой странице слова, но на дополнительных страницах он начинает распечатайте случайным образом, и значение, указанное в objSelection.range.Information(WdInformation.wdHorizontalPositionRelativeToPage), кажется, является причиной проблемы.

Пример неправильного вывода, напечатанного в слово:

enter image description here

Несколько вещей, которые я заметил, пытаясь решить эту проблему:

Если я устанавливаю точку останова и пошагово выполняю код по одной строке за раз, все работает нормально, и правильный вывод печатается каждый раз.

Если у меня установлено слово app, чтобы оно не было видно с самого начала, оно перестает работать каждый раз после первой страницы

Если у меня установлено приложение word как видимое, оно работает правильно на каждой странице, пока я не нажму где-нибудь на экране за пределами слова приложения.

Вот мой код:

Sub print_to_word()
        '**** SETTING UP WORD *****
        Dim wordApp As Word.Application
        On Error Resume Next
        Set wordApp = GetObject(, "Word.Application")
        If wordApp Is Nothing Then   'if word is not open then open it
            Set wordApp = CreateObject("Word.Application")
        End If
        On Error GoTo 0 'reset error warnings
        Dim objdoc As Document
        Set objdoc = wordApp.Documents.Add 'Create a new word document
        Dim objSelection As Selection
        Set objSelection = wordApp.Selection 'Selection used to write text
        wordApp.Visible = True

        Dim wirecodes As String
        wirecodes = "114.114*.98.98*.99.99*.123.123*.92*.92**.92.114.114*.98.98*.99.99*.123.123*.92*.92**.92.114.114*.98.98*.99.99*.123.123*.92*.92**.92.114.114*.98.98*.99.99*.123.123*.92*.92**.92.114.114*.98.98*.99.99*.123.123*.92*.92**.92.114.114*.98.98*.99.99*.123.123*.92*.92**.92.114.114*.98.98*.99.99*.123.123*.92*.92**.92.114.114*.98.98*.99.99*.123.123*.92*.92**.92"   

        For x = 1 To 5 'print 5 lots of wirecodes
            Dim pos As Integer
            objSelection.TypeText (Chr(9)) 'tab
            For i = 1 To Len(wirecodes) 'loop through each character
                pos = objSelection.range.Information(WdInformation.wdHorizontalPositionRelativeToPage)

                If i <> 1 And pos > 215 Then 'if the cursor is past 215 then
                    Do While Mid(wirecodes, i - 1, 1) <> "." And i <> Len(wirecodes) + 1 'print out the remaining wirecode before starting a new line
                        objSelection.TypeText (Mid(wirecodes, i, 1))
                        i = i + 1
                    Loop
                    If i < Len(wirecodes) Then 'if its not the last wirecode print a newline and tab
                        objSelection.TypeText (Chr(11) + Chr(9))
                    End If
                End If
                objSelection.TypeText (Mid(wirecodes, i, 1)) 'just print the character
            Next
            objSelection.TypeText (Chr(10)) 'new line
        Next
        'close word
        objdoc.Close
        Set objdoc = Nothing
        wordApp.Quit 'close word
        Set wordApp = Nothing
End Sub

Я использую Microsoft Office 2010 на Windows 10 любая помощь будет принята с благодарностью. * 10 29 *

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Попробуйте:

Sub Print_to_Word()
Dim wdApp As Word.Application, wdDoc As Word.Document, bNew As Boolean, wirecodes As String, i As Long
wirecodes = "114.114*.98.98*.99.99*.123.123*.92*.92**.92.114.114*.98.98*.99.99*.123.123*.92*.92**.92.114.114*.98.98*.99.99*.123.123*.92*.92**.92.114.114*.98.98*.99.99*.123.123*.92*.92**.92.114.114*.98.98*.99.99*.123.123*.92*.92**.92.114.114*.98.98*.99.99*.123.123*.92*.92**.92.114.114*.98.98*.99.99*.123.123*.92*.92**.92.114.114*.98.98*.99.99*.123.123*.92*.92**.92"
bNew = False
On Error Resume Next
Set wdApp = GetObject(, "Word.Application")
'If Word is not open then open it
If wdApp Is Nothing Then
  Set wdApp = CreateObject("Word.Application")
  bNew = True
End If
On Error GoTo 0 'reset error warnings

With wdApp
  'Hide Word if we started it
  If bNew = True Then .Visible = False
  'Turn off ScreenUpdating anyway
  .ScreenUpdating = False
  'Create a new word document
  Set wdDoc = .Documents.Add
  With wdDoc
    With .Range
      'Parse the data
      .InsertBefore vbTab
      For i = 0 To UBound(Split(wirecodes, "."))
        .InsertAfter Split(wirecodes, ".")(i) & "."
        If .Characters.Last.Information(wdHorizontalPositionRelativeToPage) > 215 Then
          .InsertAfter Chr(11) & vbTab
        End If
      Next
    End With
    'Print & close
    .PrintOut Copies:=5
    .Close False
  End With
  'Quit Word only if we started it
  If bNew = True Then .Quit
End With
Set wdDoc = Nothing: Set wdApp = Nothing
End Sub
0 голосов
/ 19 апреля 2020

Если вы просто введете текст в документ, то используйте следующий подстановочный знак Найти / Заменить:

Find = <[0-9.\*]{1,19}[!.]@.
Replace = ^&^l

(который может быть реализован в коде), вы получите:

114.114*.98.98*.99.99*.
123.123*.92*.92**.92.
114.114*.98.98*.99.99*.
123.123*.92*.92**.92.
114.114*.98.98*.99.99*.
123.123*.92*.92**.92.
114.114*.98.98*.99.99*.
123.123*.92*.92**.92.
114.114*.98.98*.99.99*.
123.123*.92*.92**.92.
114.114*.98.98*.99.99*.
123.123*.92*.92**.92.
114.114*.98.98*.99.99*.
123.123*.92*.92**.92.
114.114*.98.98*.99.99*.
123.123*.92*.92**.92

Это достаточно хорошо?

Непонятно, для чего нужна вкладка, но даже это может быть включено через:

Find = <[0-9.\*]{1,19}[!.]@.
Replace = ^&^l^t

или:

Find = <[0-9.\*]{1,19}[!.]@.
Replace = ^t^&^l
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...