#16
|
||||
|
||||
That seems a whole lot more bother for the user than simply answering a few input box prompts. It's also more error-prone. How would the parameters be differentiated there, and what would you have in the paragraph for the colouring?
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#17
|
||||
|
||||
Your code reads the first row of the table outside the loop then starts the loop with the second data line. This is probably the best solution. My only reluctance is that means the code to read the data is in the macro in two places, which always opens up the possibility of them not being identical. I always try to never duplicate code if I can help it.
The other solution that I have used is to check inside the loop if it's the first iteration, but that puts code inside the loop that is unnecessary after the first iteration, which I also don't like. What if I change the datatype of the variable to Variant? Is there a value, like Null, that I can initialize it to that can never be a match for anything that could ever be in a Word table? |
#18
|
||||
|
||||
Quote:
Quote:
Quote:
StrTitle = "" (or not even bother initialising it), but then the shading would necessarily start at the second data row (undesirable), though the code could be modified to make it start at the first data row.
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#19
|
||||
|
||||
Quote:
I envision a line containing text something like this or whatever is easy to read and easy to parse in the macro. I'd play with it a bit. Code:
Parms: Col=3, Hdrs=0, RGB=215,199,244 Also, if I had more than one table in the document, or even in different documents, the parameters would be set and could be different for each one. If the macro doesn't find a line that has the right syntax, it would use the default values. Last edited by Jennifer Murphy; 02-20-2020 at 10:52 PM. Reason: Typo |
#20
|
||||
|
||||
The point is, as I said, initializing it to something that cannot be in the table. That way, the compare in the first pass through the loop will always fail, which is what I need.
But even if you cannot see a point, do you know if there is a Variant value that will fail a compare with any possible text value? Quote:
|
#21
|
||||
|
||||
OK, try the following:
Code:
Sub TblHiLite() Application.ScreenUpdating = False Dim Hdr As Long, S As Long, W As Long, C As Long, R As Long, H As Long Dim StrTitle As String, StrParms As String, StrRGB As String 'Abort if the cursor is not in a table If Selection.Information(wdWithInTable) = False Then MsgBox "The selection is not in a table!", vbOKOnly, "TblHiLite" GoTo ErrExit End If 'Get Parameters On Error GoTo ErrExit StrParms = Split(Selection.Tables(1).Range.Previous.Paragraphs.Last.Range.Text, vbCr)(0) C = Trim(Split(Split(StrParms, "=")(1), ",")(0)) Hdr = Trim(Split(Split(StrParms, "=")(2), ",")(0)) StrRGB = Trim(Split(StrParms, "=")(3)) S = RGB(Split(StrRGB, ",")(0), Split(StrRGB, ",")(1), Split(StrRGB, ",")(2)) On Error GoTo 0 W = RGB(255, 255, 255) 'process the table With Selection.Tables(1) If C > .Columns.Count Then MsgBox "There is no column " & C & " in the table!", vbOKOnly, "TblHiLite" End End If If Hdr > .Rows.Count Then MsgBox "There is no row " & Hdr & " in the table!", vbOKOnly, "TblHiLite" End End If StrTitle = Split(.Cell(1 + Hdr, C).Range.Text, vbCr)(0) .Rows(1 + Hdr).Shading.BackgroundPatternColor = W: H = W For R = 2 + Hdr To .Rows.Count If Split(.Cell(R, C).Range.Text, vbCr)(0) <> StrTitle Then If H = W Then H = S Else H = W StrTitle = Split(.Cell(R, C).Range.Text, vbCr)(0) End If .Rows(R).Shading.BackgroundPatternColor = H Next End With Application.ScreenUpdating = True End ErrExit: MsgBox "Invalid Parameter", vbExclamation End Sub
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#22
|
||||
|
||||
Wow! Thank you very much. I'll work on that today.
Quote:
What is "+ve"? |
#23
|
||||
|
||||
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#24
|
||||
|
||||
Is there a way for me to test whether there is a line before the table? That is, whether the table is the first thing in the document?
|
#25
|
||||
|
||||
Ok, but what does "ve" stand for? Maybe I'm too dense, but I've never seen that expression before? Is it an Aussie expression?
|
#26
|
||||
|
||||
Quote:
Code:
Sub Demo() If Selection.Tables(1).Range.Start = ActiveDocument.Range.Start Then ' code for table at top of document End If End Sub Quote:
I'd have thought -ve was fairly common, +ve less so. See: What do -ve and +ve mean? - Quora
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#27
|
||||
|
||||
Quote:
Quote:
|
#28
|
||||
|
||||
It just occurred to me that there would be no need to pass a parameter to declare the number of header rows if the macro could test for it. After a little research, I came up with this code, which seems to work:
Code:
Dim Row as long With Selection.Tables(1) 'Skip over any header rows For Row = 1 To .Rows.Count If .Rows(Row).HeadingFormat <> -1 Then Exit For Next Row Last edited by Jennifer Murphy; 02-22-2020 at 08:26 AM. Reason: Typo: Change "=" to "<>" |
#29
|
||||
|
||||
Hi Jennifer,
An approach like that could be made to work for tables that do have the 'Repeat Heading Rows' option checked, but I'd question whether that's likely on tables that fit wholly within a page. In any event, it's a once-off exercise to add that parameter and you'd still have to supply the others.
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#30
|
||||
|
||||
Quote:
I started on this "little" project for a table that spans a lot of pages, currently 10 and growing. So I had that in mind. And I always check that option because I never know if a table might grow and eventually split across a page. I think I'll include the Headers=n parameter. If it's present, I'll use it. If not, I'll check for the Repeat option and use that. If neither are present, I'll assume no headers and start highlighting with row 1. Thanks again |
Thread Tools | |
Display Modes | |
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Macro to highlight a list of words | bakerkr | Word VBA | 4 | 10-19-2017 02:23 PM |
Word 2010 VBA Print Macro - Specified Sections | Benbon | Word VBA | 3 | 03-30-2017 02:31 PM |
Macro Question: Need help making a macro to highlight the first word in every sentence | LadyAna | Word | 1 | 12-06-2014 10:39 PM |
Macro to highlight words | bertietheblue | Word VBA | 9 | 07-01-2013 12:39 PM |
find - reading highlight - highlight all / highlight doesn't stick when saved | bobk544 | Word | 3 | 04-15-2009 03:31 PM |