Word VBA Row/Cell .Height property - ?!?!?!?

Posted on 2003-12-05
Last Modified: 2007-12-19
Dear everyone,

Am I like the last loneliest idiot in the world or something? It appears that the Word (2000) VBA Row (or Cell) property .Height doesn't actually return the height of the Row (or Cell).

For example:

(assume I've created a single cell table)


will NOT give me the HEIGHT of the FIRST ROW of the FIRST TABLE in the ACTIVE WORD DOCUMENT.

I dunno, I would have said I was pretty specific there...
Instead, the output is dependant on the value of a certain .HeightRule property. There are three possible values:
wdRowHeightAtLeast - Now the row has to be 'At least' .Height tall.
wdRowHeightAuto - The row height is determined by the amount of text therein.
wdRowHeightExactly - The row is exactly .Height tall (.Height is in points)

Here's the really good fun part. When .HeightRule is set to wdRowHeightExactly then .Height is, well, the height of the row. No probs. except we don't know how tall we want it do we, because that rather depends on whetehr the text will fit or not. Ok, next one. When .HeightRule is wdRowHeightAtLeast well now .Height returns the minimum height for the Row. How tall is the row actually? don't ask word, it hasn't got a clue. And finally, wdRowHeightAuto. The row height is determined automatically by the amount of text in it. and what does .Height return? 99999999 - or more specifically wdUndefined. GREAT. THANKYOU MICROSOFT.

So despite the fact that Word MUST know how big that damn Row is - it has to draw and print the damn thing doesn't it? - it WILL NOT tell you how big it is.

OK, I said, it's a little problem, but nothing a good workaround won't solve:

(MyRow as Row, PleaseWork as Long)

MyRow.HeightRule = wdRowHeightAuto
MyRow.Cells(1).Range.Text = "Horses"
MyRow.HeightRule = wdRowHeightExactly
PleaseWork = MyRow.Height

No such luck. Instead, the bit about wdRowHeightExactly actually RESIZED my bloody Row! So that whilst .Height is now accurate, the bottom of the text is chopped off in my Table.

So exactly what the hell is the point in having a .Height property that is readable if you can't actually learn anything from its use? Why not just have a .Height method? hmm? Why not finish the job and have it pop up a little window that says "Screw you programmer! Ha ha! - The boys at MS"

Or maybe it's me. I really hope so. Any ideas anyone? (BTW I'm not just ranting, I really need to sort this out, so beg, grovel etc etc)


  • 4
  • 4
  • 2
LVL 37

Assisted Solution

by:Joanne M. Orzech
Joanne M. Orzech earned 100 total points
ID: 9882733
Not sure if this will help but worth a shot:


Accepted Solution

gilbar earned 100 total points
ID: 9883179
It's the same deal as when finding fontsize for a selection with deferent fontsizes, you get 99999999 returned. so here's my plan (which involves lots of loops)

gothrough each table
   gothrough each row
       gothrough each cell
          Select text, copy&paste to scratch document
          gothrough each character, selecting one at a time
          if Siz < Selection.font.size then Siz = Selection.font.size
    Siz should now be the Biggest fontsize in that row, which determined how high row is
    fancy calculation to figure how high a font size is

this is the best idea i can come up with, IF you go through with that I can help you flesh out the loops (if you need help, I'm guessing you don't).  Don't know if this is anyuse but you sounded desperate


Expert Comment

ID: 9883195
I paste it into a scratch doc to help looping, when done with that cell, you'd delete the scratch doc& goto next cell
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

ID: 9883467
Thanks for your input guys, I eventually used a workaround in my prog, but I've just come up with this, which covers the general idea to some degree:

Sub test()

  Dim MyRange As Range
  Dim MyHeight As Long
  Dim RandomString As String
  'Some random text...
  Randomize Timer
  Do While (Int(Rnd * 30) > 0)
    RandomString = RandomString + "horses "
  'The table...
  ThisDocument.Tables.Add Selection.Range, 1, 1
  ThisDocument.Tables(1).Rows(1).Cells(1).Range.Text = RandomString
  'Take a sounding...
  MyHeight = Selection.Range.Information(wdVerticalPositionRelativeToPage)
  'Then another...
  'Advanced algebraics...
  MyHeight = Selection.Range.Information(wdVerticalPositionRelativeToPage) - MyHeight
  'Display results...
  MsgBox (Str(MyHeight))
End Sub

I think one could probably use this principle to make it happen.

I'll split the points, since I'm not sure who's input led me here :)
LVL 37

Expert Comment

by:Joanne M. Orzech
ID: 9883482
You can give to gilbar - but thanks anyway :)

Expert Comment

ID: 9883525
thanxs www (and thank you too JO)
LVL 37

Expert Comment

by:Joanne M. Orzech
ID: 9883538
Should I give you a "points for" question gilbar??  I'm not sure - can I give you my points?

Expert Comment

ID: 9883595
nope, i'm good, you keep 'em (i'll never be able to catch you and dreamboat any way ;) , your link was as least as good as my simple idea
LVL 37

Expert Comment

by:Joanne M. Orzech
ID: 9883612
Thanks gilbar :)
ID: 9886487
hehe, gosh you guys are altruistic. kinda makes me feel all warm and fuzzy inside!

I had some problems dishing out the points this afternoon. EE seemed to be having some kinda probs...

I'll have another crack now...


Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

If you work with Word a lot, you probably use styles. If you use styles a lot, you've probably balled your fist more often than not when working with the ribbon. In Word 2007/2010, one of the things that I find missing when using styles is a quic…
I'm writing to share my clumsy experience in using this elegant tool so you can avoid every stupid mistake I made. (I leave it to the authorities to decide if this deserves a place in the Knowledge archives.)  Now that I am on the other side of my l…
This video walks the viewer through the process of creating envelopes and labels, with multiple names and addresses. Navigate to the “Start Mail Merge” button in the Mailings tab: Follow the step-by-step process until asked to find the address doc…
Office 365 is currently available in five editions. Three of them are for business use: Office 365 Business Essentials, Office 365 Business, and Office 365 Business Premium. Two of them are for home/personal use: Office 365 Home and Office 365 Perso…

808 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question