- ベストアンサー
ワード VBA 差込印刷 テキストボックスの書式設
- WORDのVBAはアクセスやエクセルとはちょっと違って戸惑っています。
- 大学の卒業証書を印刷する際に、WORDで差し込み印刷をしています。
- テキストボックスの指定と書式・記述がわかりません。どなたかご存知の方ご教示お願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#4です。 下記をやってみましたので、参考に。 テキストボックスに氏名文字を入れて、インドネシア?などの形方なの長い名前の場合、 (1)縦方向に1字1字を縮小する。 (2)テキストボックスの幅を2倍にする(広げたくても2倍が限界かなと思うが?) (3)(1)(2)併用型 のうちの (1)のテストとVBAコード例です。 ーーー Wordの標準モジュールに Sub test03() Set myTbox = ActiveDocument.Shapes _ .AddTextbox(Orientation:=msoTextOrientationVertical, _ Left:=100, Top:=100, Width:=50, Height:=200) myTbox.TextFrame.TextRange = "アアア" MsgBox myTbox.TextFrame.TextRange.Text myTbox.TextFrame.TextRange.Font.Size = 33 myTbox.TextFrame.TextRange.Font.Scaling = 100 '---- Set myTbox2 = ActiveDocument.Shapes _ .AddTextbox(Orientation:=msoTextOrientationVertical, _ Left:=200, Top:=100, Width:=50, Height:=200) myTbox2.TextFrame.TextRange = "アアア" MsgBox myTbox2.TextFrame.TextRange.Text myTbox2.TextFrame.TextRange.Font.Size = 33 myTbox2.TextFrame.TextRange.Font.Scaling = 50 End Sub を入れて実行する。 ーー 2つのテキストボックスが文書に現れ、Scalingの効果の比較ができて、効果が実感できるでしょう。前半は普通のもの、後半のコードがFont.Scalingをやっている部分です。 ==== 質問者は、補足情報などから、印刷や筆耕の業者なんですかね。 Word VBAはエクセルVBAとは、微妙な点で違いがあり、悩まされます。前にも書いた通り、情報がWEBでも少なく、苦労して、時間ばかり食います。米国のサイトの方がWordVBAに関しては質問・回答が出ているようです。しかし見に行きにくいし、縦書きなど、日本独自の事項もありますので、米国発のサイトにすべては頼れません。 また試行錯誤が必要で、やってみて確かめないと、理論だけで、イメージするのがむつかしい。1行のVBAコード(1課題)にも迷って、1日無駄にして、結局、放棄するケースなど多いです。 印刷業者で、WordVBAに興味と実益で、精通しておられる方がおられるように感じますが、そういう方に教えを乞うのも、普通はできず、たとえ文書でやコードで教えてもたっても、WordのVBAの諸概念の理解も、すぐは、むつかしいと思います。 ーー 本回答でも TextFrame.TextRange.Text などの部分でエクセルの方式と違って、エラーがでて、時間を取ったりしました。 オブジェクトの垂直構成とその意味やコードがわからない場合です。 素人には、WordVBAは、こんなのばかりです。 ーー 小生、凡人の感想ですが、WordVBAは「やめときなはれ」と言いたいですね。小生は、昔は会社が出す表彰状などの名前入れは、書道のできる、専門の方に頼んでいましたね。1枚500円ぐらいだったかな。
その他の回答 (6)
- kkkkkm
- ベストアンサー率66% (1731/2601)
> 印刷の時このマクロが働くようにするのはどうしたらよいのでしょうか。 印刷の時にというか、マクロの中に印刷をするというコードを書くのではないでしょうか。 テキストボックスのフォーマットをセットしてから印刷するのではないでしょうか。
お礼
ありがとうございました。
補足
ありがとうございます。 アクセスの感覚があるので 印刷している時さまざまな文字数がでてくるので先にテキストボックスの設定を変えて出力と考えていました。 マクロの中でセットして印刷の命令、ちょっと考えてみます。
- kkkkkm
- ベストアンサー率66% (1731/2601)
'ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecordnext これは、はがきの先込み印刷(ウィザードでできた)の次のレコードへのボタンをクリックしたときにできるコードですので、ご自身の差し込み状態でマクロの記録で次のレコードのボタンをクリックしてコードを取得してそこに入れ込んでください。
お礼
ありがとうございました。
補足
ありがとうございます。 ご指摘の通り自分のマクロの記録の記述です。 同じということですかね。 それにしましても、印刷の時このマクロが働くように するのはどうしたらよいのでしょうか。もしご存じでしら ご教示いただけましたらありがたいです。
- imogasi
- ベストアンサー率27% (4737/17069)
Wordの差し込み印刷は、Wordの当初の(Word95以前)から、フィールドという仕組みで処理されています。fieldにはスイッチであったか、フォントサイズやフォント種類などを指定するパラメータがあったように記憶します。文字の羅列で覚えにくいものです。しかしその情報WEB記事や書籍を見つけるのが、むつかしいと思います。 (参考 後刻に http://office-qa.com/Word/wd601.htm に見つけました。) 市販本は過去に数冊(書店店頭になし)、現在1冊?出ていますが、そこまで細部にわたる記事は見つからないでしょう。 ーー そこで、質問者が証書のコピーを取って、名前など記入する場所に四角を書き(テキストボックスに当たる)そこの中だけ印刷することを考えてはどうか。 下記は1か所だけの例で、証書に名前を入れる例を挙げます。 名前データはエクセルシートに持って、そこから引っ張ってきて、セットして、1名分印刷します。データ行を行番号を切りまわして、 指定列のデータ(学部、氏名のような)を採って、証書のテキストボックスに張り付け(代入す)ればよい。 質問者は、そのエクセルVBAの技量はあるようなので、こういう案を考えました。 実際は差し込むテキストボックス相当の箇所は、数か所あるでしょうが、下記のVBAコードを類推して、テキストボックスの部分のコードをコピーして、下に重ねて一部(位置や大きさなど)変えてください。 ーー Public Sub テキストボックスを追加する() 'ActiveDocument With ActiveDocument.PageSetup .Orientation = wdOrientLandscape End With '--- lf = CentimetersToPoints(20#) tp = CentimetersToPoints(11#) wd = CentimetersToPoints(2.5) Set tb1 = ActiveDocument.Shapes.AddTextbox(Orientation:=msoTextOrientationVertical, _ Left:=lf, Top:=tp, Width:=wd, Height:=230) tb1.Select Selection.Text = "山村 新之介" 'tb1.Line.Visible = msoFalse tb1.TextFrame.TextRange.Font.Size = 36 'tb1.TextFrame.TextRange.Font.Name = "MS Pゴシック" tb1.TextFrame.TextRange.Font.Name = "HGP行書体" ActiveDocument.PrintOut End Sub ーーー 上記は、(小生にはA4プリンターしかないので)A4用紙を横に使い、左から20センチ、上から11センチのところに、幅2.5センチのテキストボックスの中に、名前を書くでしょう。また1人分(証書1枚相当)印刷します。 最終はテキストボックスの枠線は見えなくします。(上記コメント化を外す) ーーー なぜワードVBAでやるかというと、個人的な経験から(理由は薄弱かも) CentimetersToPoints(センチ指定)の、印刷したときの寸法的再現性が1mm単位以内で実現する経験をしているからです。エクセルVBAでやれれば、VBAコードが簡単になるのですからそちらの方がよいでしょうが。 小生は最近年賀状印刷でもMergeFieldと付き合っていますが、行当たる点があって、立ち往生しているので、データ差し込みはエクセルをお勧めします。
お礼
ありがとうございます。少し考えてみます。
補足
ありがとうございます。 ご指摘のように30年ぐらい宛名の仕事をしてますが ほとんどアクセスとエクセルで処理しています。今回の仕事は7,8年前から受注していますが平体ができる特殊なソフト (DMの達人)を使用していましたが、バージョンアップが 高くてワードでたきないか挑戦しているところです。
- kkkkkm
- ベストアンサー率66% (1731/2601)
はがきの差し込み印刷でマクロの記録で記録したら次へのボタンで以下のコードが取れましたのでマクロの記録で取れるのではないでしょうか。 ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecord
お礼
ありがとうございました。
- kkkkkm
- ベストアンサー率66% (1731/2601)
> 差込印刷でページを送っていく方法と どのような状態なのかよくわからないのでこれはわかりません。 > テキストボックスの中身の文字列の取得がわかりません。 Dim Tbox As Object Set Tbox = ActiveDocument.Shapes.Range(Array("Text Box 1")) Debug.Print Tbox.TextFrame.TextRange.Text Set Tbox = Nothing もしくは直接 Debug.Print ActiveDocument.Shapes.Range(Array("Text Box 1")).TextFrame.TextRange.Text でいかがでしょうか。 複数一度に処理するのであればご覧になったかもしれませんが テキストボックスの文字列を取得するサンプルマクロ https://www.relief.jp/docs/word-vba-get-strings-text-boxes.html
お礼
ありがとうございます。 試してみます。
補足
すみません、ありがとうございます。テキストボックスの文字は取得できました。少し前にすすみました。しかし for~nextでレコードを進めているつもりなんですがいかないんです。ここはあきらて、目的が「差込印刷のページが替わったらマクロを実行して文字間などの値を変える」、なので出力の時テキストボックスの中の文字数が4,6,10文字の時、文言を入れるところの大きさがが決まっているので、文字を小さくしないで平体にして収まるようにしたいのです。違う仕事ですがアクセスのフォーマット時のイベントプロシージャでポイントを小さくするのは簡単なのですがどうもその知識がじゃましてうまくいかないようです。すみませんが教えていただけますでしょうか。 文字数の取得もできました、設定も変わりました、印刷時ページが替わったらのマクロの実行するがわかりません。 Sub Macro2() Dim i As Integer Dim tbox As Object Dim TXT As String Dim MOJICHO As Integer ''For i = 1 To 20 ""20頁までテストしたかったのですが"" Set tbox = ActiveDocument.Shapes.Range(Array("Text Box 10")) TXT = tbox.TextFrame.TextRange.Text MOJICHO = Len(TXT) - 1 Debug.Print Left(TXT, MOJICHO), MOJICHO If MOJICHO < 4 Then ActiveDocument.Shapes.Range(Array("Text Box 10")).Select Selection.Range.FitTextWidth = MillimetersToPoints(3.8) Selection.ParagraphFormat.Alignment = wdAlignParagraphDistribute Selection.Font.Scaling = 100 Selection.Font.Spacing = -4 ElseIf MOJICHO < 6 Then ElseIf MOJICHO < 10 Then End If ''ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecordnext 'Next End Sub
- kkkkkm
- ベストアンサー率66% (1731/2601)
マクロの記録に手を加えたものですが以下のようなものでしょうか Text Box 1はマクロの記録時に「選択」「オブジェクトの選択と表示」で表示された名前でもいけますし、記録の時に選択すると勝手に選択したボックスの名前が入ります。 ActiveDocument.Shapes.Range(Array("Text Box 1")).Select Selection.Range.FitTextWidth = MillimetersToPoints(50) Selection.ParagraphFormat.Alignment = wdAlignParagraphDistribute Selection.Font.Scaling = 200 Selection.Font.Spacing = 10
お礼
早速のご回答ありがとうございます。 試してみます
補足
ありがとうございます、マクロの記録でテキストボックスの指定と設定はできたのですが、差込印刷でページを送っていく方法と テキストボックスの中身の文字列の取得がわかりません。 文字列の桁数によって文字間や倍率、均等割り付けの文字数をIFで設定したいところです。 Selection.textframe.textrange.textでテキストボックスの文字列を取得しようとするとメンバーにありませんとエラーになってしまいます。書式が間違っているのでしょうか。教えてもらえますか。
お礼
ありがとうございます。試してみます。 ご指示の通りあきらめかけていましたが ちょっとやってみようかなと思い直していますが、 ワードの動きがわからなくて、仕事に使うにはちょっと 怖い気がします。