John Bartow
john at winhaven.net
Wed Feb 9 21:31:21 CST 2005
Stuart,
Thanks a bunch! That sparked my brain. BTW the InputBox and other items are
general VBA - none of what you posted it was Access specific.
I owe you one - John B.
Here's my (almost) final code. (I have an issue with one set of bullet
characters in a list. I will have find out whether there is some exception
to how they may need to be handled. It could an import from an older version
or soemthing.)
'Code: WinHaven LLC Last Update: 2-9-05 Thanks to Shyam Pillai and Stuart
McLachlan for their most kind assistance
Option Explicit
Public intCountObjects As Integer
Sub ProcessShapes()
'Loops through all objects in a PowerPoint presentation and changes the
color to grayscale (unless noted as an exception)
Dim objSlide As Slide
Dim objShape As Shape
Dim I As Integer
Dim intUseGray As Integer
Dim lngNewRGB As Long
Dim strPages() As String
Dim strSkipPages As String
Dim lngLoop As Long
'ask user for the slide numbers that aren't to be processed
strSkipPages = InputBox("Enter the slide numbers that you do not want
converted to grayscale." & vbCrLf & vbCrLf & _
"Separated the slide numbers with commas." & vbCrLf & vbCrLf & _
"Example: 1,5,12,35,67", "Special Process - Convert Pages to Gray: List
Exceptions", , 3600, 3600)
'strip out any spaces
strSkipPages = StripChars_TSB(strSkipPages, " ") 'in another module
'use split and join to change format of each element to three digits
'build array
strPages() = Split(strSkipPages, ",")
'pad elements
For lngLoop = 0 To UBound(strPages())
strPages(lngLoop) = Right$("000" & strPages(lngLoop), 3)
Next
'Rebuild String
strSkipPages = Join(strPages(), ",")
For Each objSlide In ActivePresentation.Slides
intCountObjects = intCountObjects + 1 'running count of objects
'test whether we should process this slide
If InStr(strSkipPages, Format$(objSlide.SlideNumber, "000")) = 0 Then
'---------------------------------------------
For Each objShape In objSlide.Shapes
intCountObjects = intCountObjects + 1 'running count of objects
If objShape.Type = msoGroup Then
For I = 1 To objShape.GroupItems.count
intCountObjects = intCountObjects + 1 'running count of
objects
Call ChangeToGray(objShape.GroupItems(I))
Next I
Else
Call ChangeToGray(objShape)
End If
Next objShape
End If
Next objSlide
MsgBox intCountObjects & " objects have been processed to gray scale.",
vbOKOnly, "Convert Pages to Gray: Complete!"
End Sub
Function CalcGray(lngRGB As Long) As Long
'find rgb values divide by three to get a gray tone value to return
Dim lngRed As Long
Dim lngGreen As Long
Dim lngBlue As Long
Dim lngGray As Long
Dim intGray As Integer
lngRed = lngRGB Mod 256
lngGreen = lngRGB \ 256 Mod 256
lngBlue = lngRGB \ 65536 Mod 256
lngGray = (lngRed + lngGreen + lngBlue)
If lngGray <> 0 Then
lngGray = (lngGray / 3)
End If
intGray = CInt(lngGray)
CalcGray = RGB(intGray, intGray, intGray)
End Function
Function ChangeToGray(objShape As Shape)
Dim lngNewRGB As Long
Dim I As Integer
Dim oTxtRng As TextRange
On Error Resume Next
If objShape.HasTextFrame Then
'change text objects
If objShape.TextFrame.HasText Then
Set oTxtRng = objShape.TextFrame.TextRange
For I = 1 To oTxtRng.Runs.count
intCountObjects = intCountObjects + 1 'running count of
objects
With oTxtRng.Runs(I).Font.Color
lngNewRGB = CalcGray(.RGB)
.RGB = lngNewRGB
End With
Next I
End If
End If
If objShape.Fill.Visible Then
'forecolor fill
lngNewRGB = CalcGray(objShape.Fill.ForeColor.RGB)
objShape.Fill.ForeColor.RGB = lngNewRGB
'backcolor fill
lngNewRGB = CalcGray(objShape.Fill.BackColor.RGB)
objShape.Fill.BackColor.RGB = lngNewRGB
End If
If objShape.Line.Visible Then
'line color
lngNewRGB = CalcGray(objShape.Line.ForeColor.RGB)
objShape.Line.ForeColor.RGB = lngNewRGB
End If
'picture color
objShape.PictureFormat.ColorType = msoPictureGrayscale
End Function