VBA Debug Print создает неожиданный и, казалось бы, случайный выход

Может кто-нибудь пролить свет на это. В MS Word VBA у меня есть тривиальный Sub, который дает довольно неожиданные результаты. [Изменить: эта проблема была воспроизведена на нескольких разных установках MS Word, но пока только Win10]

Среды Repro:

  • Win10, Word 2010 (32-разрядный) ПК
  • Win10, Word 2010 (32-разрядная версия) VM-Azure
  • Win10, Word 2016 (32-разрядный) ПК
  • Win10, Word 2010 (64-разрядная версия) VM-Azure
  • Win10, Word 2016 365 @VincentG
  • Win10, Word 2007 (32 бит) @Ambie
  • Win10 (64), Word XP @ThunderFrame
  • Win10 (64), Excel XP @ThunderFrame
  • Win8.1 (64), Word 2013 @miroxlav (сначала воспроизводится вне Win10)
  • Win8.1 (64), Office 2016 (32) @GSerg
  • Win10 (64), Word 2007 (x86) @PartricK
  • Win10 (64), Excel 2007 (x86) @PartricK

Но не воспроизводится в:

  • Win7 (64), Word 2007 (32-разрядная версия) VM Azure
  • Win7 (64), Word 2010 (32?) @JohnColeman
  • Win7 (64), Word 2007 (32) @Slai
  • Win7 (64), Word 2003 (32) @GSerg
  • WinXP (32), Word 2010 (32) @GSerg
  • Win7 (64), Office 2010 (32)

Шаги для воспроизведения: Открыть новый документ Word Открыть IDE (Alt + F11) Введите этот код

Option Explicit

Sub test()
Dim i As Integer
For i = 1 To 100
Debug.Print vbCr
Next
End Sub

Запустите тестовый Sub.

Мой вывод меняется каждый раз, когда цикл запущен:

]Œ[p^"î;{Ñ[

]Œ[p^"î;{Ñ[

\ÒZžUÖè;qÑZ

или

ÿÿ

þþ@øø"¶(3

ÿÿ

или

>O

>O

>O

или

p

G   P‚j Ž¶&[email protected]

p

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

Это было довольно неловко, пока я не воспроизвел в других установках Word, теперь это больше отвлекает и озадачивает.

Любые идеи о том, что происходит?

Ответ 1

Не ответ, но здесь дамп p-кода слова doc в формате .doc:

Похоже, что vbCr не поврежден

_VBA_PROJECT parsing done.
-------------------------------------------------------------------------------
Module streams:
Macros/VBA/ThisDocument - 932 bytes
Macros/VBA/Module1 - 1478 bytes
Line #0:
        Option  (Explicit)
Line #1:
Line #2:
        FuncDefn (Sub test())
Line #3:
        Dim
        VarDefn i (As Integer)
Line #4:
        StartForVariable
        Ld i
        EndForVariable
        LitDI2 0x0001
        LitDI2 0x0064
        For
Line #5:
        Debug
        PrintObj
        Ld vbCr
        PrintItemNL
Line #6:
        StartForVariable
        Next
Line #7:
        EndSub

Ответ 2

@Comintern и я давно предположил, что Immediate Window на самом деле является трубой или каналом для stdIn/stdOut.

Если мы работаем на этой основе, то этот ответ имеет некоторые идеи:

fooobar.com/info/458098/...

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

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

Итак, кажется, что Windows 10 может быть что-то неправильно, когда обрабатывает потоки?

Обходной путь состоит в том, чтобы гарантировать, что операторы Debug.Print никогда не заканчиваются на vbCr, Chr(10) или Chr$(10)