Excel VBA / Импорт изображения WMF с размером по умолчанию приводит к огромному изображению

#excel #vba

#excel #vba

Вопрос:

добавление этого же вопроса на этот форум.

Следующее поведение началось несколько месяцев назад на некоторых компьютерах после обновлений Office / Excel. По крайней мере, затронуты версии Excel 2016 и 365.

Если вы вставляете изображение WMF в Excel, используя следующий макрос (-1 означает использование ширины и высоты изображений по умолчанию), изображение становится очень, очень большим. Если вы откроете изображение в любом другом приложении для обработки изображений, размер может быть как 11 см * 10 см, но в Excel он равен 800 см * 558 см. (Другие форматы изображений все еще работают, как ожидается)

     Sub InsertPicture(picture As String)   
    Dim x As Integer
    x = ActiveWindow.Zoom
    ActiveWindow.Zoom = 100
    Set p = ActiveSheet.Shapes.AddPicture(picture, False, True, Selection.Left, Selection.Top, -1, -1)
    ActiveWindow.Zoom = x
    Set p = Nothing
End Sub
 

Пример: установлен Office 2016 из ISO на пустую виртуальную машину — образы WMF работали. Установил все обновления office, после этого WMF не работал.

Похоже, что импорт изображения в Excel правильно вычисляет размер из заголовка метафайла, где DpiX и DpiY в одном примере составляют 8640, а высота — 25040, а ширина — 32760 -> размер в Excel — 661 см * 866 см

Комментарии:

1. попробуйте установить прямую ширину и высоту фигуры. сначала dim p as shape после добавления формы p.width= x и shape.height = y

2. >> попробуйте напрямую установить ширину и высоту фигуры, мы используем разные размеры изображений в одной и той же позиции в Excel в зависимости от параметров производства в другом приложении. В настоящее время мы конвертируем WMF в PNG на лету перед вызовом VBA, но эта ошибка раздражает и влияет на наши старые версии приложений.

3. но вы можете добавить условие для установки масштаба изображения, например, если размер фигуры (ширина)> 2000, затем установите размер 600 и т.д. Вы можете выбрать множество вариантов размеров. Вы также можете попробовать установить pictureSizeMode 0,1,3 или создать функцию MaxWidth для проверки размера изображения после рисования и масштабирования изображения, если соблюдены некоторые условия.