- 締切済み
Word文書のワードアートのテキストをマクロで変更
お世話になります。 Word文書のワードアートのテキストをExcelマクロで変更する方法を教えてください。 Wordアプリケーションへの参照と、該当Word文書への参照と、変更したいテキストがあります。 試したこと: 1)Word2007で、マクロを記録してからワードアートのテキストを変更してみたが、マクロには何も記録されなかった。 2)該当Word文書のShapes や InlineShapes を参照してMsgboxで表示してみたが、テキストボックスに設定したテキストしか画面に表示されなかった。 何をやっているのか?: 教室のパンフレットを作ろうとしています。同じような書式で、曜日とか時間とか講座名とか費用とか・・だけ違うパンフレットを大量に作るのですが、いちいちデータを変更していると面倒なので、 Excelシートにデータを出力しておいて、Wordで作った雛形のなかの、曜日とか時間とか講座名とか費用とかの部分だけ変換してやればいいじゃないか、と考えたわけです。 そこで、Excelシートのどのシートのどのセルに、曜日とか時間とか講座名とか費用とか・・・が入っているかというデータを用意しまして、そのブック(ブックM)に、こんなマクロを作ったのです。 1.Excelデータ(ブックD)をオープン 2.ワード文書の雛形をオープン 3.ブックMの1行目から順に・・・ 3-1.曜日とか時間とか・・という項目名などを取得 3-2.ブックDから該当するデータを取得 3-3.データの先頭や末尾の、不要な部分を適宜切捨て 3-4.ワード文書で置換を実行 こんな感じのマクロです。 ワード文書の雛形には、「開講する講座:#講座名#(#コース名#)」などと記述してありますので、 #講座名#を「陶芸を楽しむ」 #コース名#を「入門」 などと変更してやれば、パンフレットが出来上がるのです。 しかし、ワードアートのテキストを#講座名#にしておいても変更されないし、マクロの記録もできないし・・で困っております。 お答えをいただければ幸いです。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17070)
お礼
遅くなりました。ようやく「多少」動くようになりましたのでこちらのコードも公開させていただきます。 参考になるコードをありがとうございました。 'オートシェイプも変更をかける Sub doChangeShapeText(myDoc As Word.Document, ByVal strReplace As String, ByVal strData As String) Dim tmpStr As String Dim idx As Integer Dim idxStr As Integer For idx = 1 To myDoc.Shapes.Count If myDoc.Shapes(idx).Type = MsoShapeType.msoTextEffect Then tmpStr = myDoc.Shapes(idx).TextEffect.Text idxStr = InStr(tmpStr, strReplace) If idxStr > 0 Then tmpStr = Left(tmpStr, idxStr - 1) _ & strData _ & Mid(tmpStr, idxStr + Len(strReplace)) myDoc.InlineShapes(idx).TextEffect.Text = tmpStr End If ElseIf (True = myDoc.Shapes(idx).TextFrame.HasText) Then tmpStr = myDoc.Shapes(idx).TextFrame.TextRange.Text idxStr = InStr(tmpStr, strReplace) If idxStr > 0 Then tmpStr = Left(tmpStr, idxStr - 1) _ & strData _ & Mid(tmpStr, idxStr + Len(strReplace)) myDoc.Shapes(idx).TextFrame.TextRange.Text = tmpStr End If End If DoEvents Next For idx = 1 To myDoc.InlineShapes.Count On Error GoTo lpNext: If myDoc.InlineShapes(idx).Type = wdInlineShapePicture Then tmpStr = myDoc.InlineShapes(idx).TextEffect.Text idxStr = InStr(tmpStr, strReplace) If idxStr > 0 Then tmpStr = Left(tmpStr, idxStr - 1) _ & strData _ & Mid(tmpStr, idxStr + Len(strReplace)) myDoc.InlineShapes(idx).TextEffect.Text = tmpStr End If End If lpNext: DoEvents Next End Sub
補足
文書の提出先が「全国各地から集めるからWordでなきゃ困る」と言っておりまして・・。 Word文書でもShapes(i).TextEffect.TextなりInLineShapes(i)の何かなりを設定すればよさそうですので、ちょっと応用させていただきます。 多少はまともに動くようになったらソースコードとともにお礼に伺います。