Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Resizing pictures with VBA

7,707 views
Skip to first unread message

Roderick O'Regan

unread,
Feb 13, 2007, 7:31:13 PM2/13/07
to
I want to resize a selected picture using VBA but I only want to
change the width of the picture to say, 2cm and the height should
adjust to scale automatically.

Manually, using the Format>Picture command I can achieve this by
ensuring that Lock aspect ratio checkbox is True.

However, if I translate this to VBA using the following commands:
with Selection
.InlineShapes(1).LockAspectRatio = msoTrue
.InlineShapes(1).Width = CentimetersToPoints(2)
End With
...I would expect the same to happen as when I did it manually. Even
though the Lock aspect ratio is set to True it reduces the width to
2cm but leaves the height at its original value.

Am I using the correct commands, please?

Karl E. Peterson

unread,
Feb 13, 2007, 7:51:34 PM2/13/07
to

Maybe you need to actually do the math, and set the height correspondingly?
--
.NET: It's About Trust!
http://vfred.mvps.org


Jay Freedman

unread,
Feb 13, 2007, 9:38:38 PM2/13/07
to
Somewhere in the bowels of the VBA interpreter, the code that handles
.LockAspectRatio is broken. What works in the dialog doesn't work at
all in VBA.

Here's some code from one of my macros to handle proportional
resizing.

' change these numbers to the maximum width and height
' (in inches) to make the inserted pictures
Const PicWidth = 1.9
Const PicHeight = 2.25

Dim Photo As InlineShape

Set Photo = .InlineShapes.AddPicture(FileName:=FName, _
LinkToFile:=False, SaveWithDocument:=True, _
Range:=PicRg)
With Photo
RatioW = CSng(InchesToPoints(PicWidth)) / .Width
RatioH = CSng(InchesToPoints(PicHeight)) / .Height

' choose the smaller ratio
If RatioW < RatioH Then
RatioUse = RatioW
Else
RatioUse = RatioH
End If

' size the picture to fit the cell
.Height = .Height * RatioUse
.Width = .Width * RatioUse
End With

--
Regards,
Jay Freedman
Microsoft Word MVP FAQ: http://word.mvps.org
Email cannot be acknowledged; please post all follow-ups to the
newsgroup so all may benefit.

Roderick O'Regan

unread,
Feb 14, 2007, 6:13:31 PM2/14/07
to
Thanks Jay for the help.

Just some small adjustments to fit my circumstances and it works a
treat!

I would never have known about the code in the Interpreter being
broken.

Regards

Roderick

Karl E. Peterson

unread,
Feb 14, 2007, 7:12:52 PM2/14/07
to
Roderick O'Regan <ro...@removethis.theoregans.com> wrote:
> Thanks Jay for the help.
>
> Just some small adjustments to fit my circumstances and it works a
> treat!
>
> I would never have known about the code in the Interpreter being
> broken.

I'm not sure it's right to say it's "broken." You're just given full control. What
you do with it may even surprise you, but it seems to me it's just executing
instructions as you enter them.

Jay Freedman

unread,
Feb 14, 2007, 10:47:11 PM2/14/07
to
On Wed, 14 Feb 2007 16:12:52 -0800, "Karl E. Peterson" <ka...@mvps.org>
wrote:

Hi Karl,

I'd say it's broken. If you explicitly set the .LockAspectRatio
parameter to True, you have every right to expect that setting one
dimension of the picture will adjust the other dimension to... *lock*
the damn aspect ratio! You don't expect to have to fiddle around with
floating point math and maintain your own variables. If you want to do
those things, then you can set .LockAspectRatio to False, or ignore it
and let it take its default value of False.

Karl E. Peterson

unread,
Feb 15, 2007, 4:17:53 PM2/15/07
to
Jay Freedman <jay.fr...@verizon.net> wrote:
> I'd say it's broken. If you explicitly set the .LockAspectRatio
> parameter to True, you have every right to expect that setting one
> dimension of the picture will adjust the other dimension to... *lock*
> the damn aspect ratio! You don't expect to have to fiddle around with
> floating point math and maintain your own variables. If you want to do
> those things, then you can set .LockAspectRatio to False, or ignore it
> and let it take its default value of False.

Well, you can say _whatever_ you want, it doesn't change one simple fact: If you
rely on assumptions and expectations, as a developer, you will spend many
frustrating hours banging your head against the wall and pulling out your own hair.
If you actually write you code to *do* what you want it to do, and not rely on any
sort of default behavior, you spend far less time wondering why the code isn't doing
what you _want_ it to do (especially when it is, in fact, doing what you *told* it
to do! <g>). Note I'm not saying your expectations are unreasonable. The only
thing that's unreasonable here is the expectation that a compiler will act on your
expectations rather than what it's actually provided code to do. These are
machines, afterall. :-)

0 new messages