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)