- ベストアンサー
Excel VBAで文字列の可視長を得るにはどうしたよいでしょうか?
一般的にプログラミングで文字列長というと、文字数やバイト数を意味しますが、今回の質問は、文字列が表示時または印刷時に占める長さを何とか入手できないだろうかとの質問です。 バックグラウンドとしては、あるセルに長さが分からない文字列が入るときに、それが印刷時に紙面上の印刷範囲あるいは想定している印刷位置に収まるかどうかを確認したいのです。 お知恵を拝借できれば幸です。よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
ちょっと時間がかかりますが、どの行ではみ出したか調べるには 次のようにします。 Function はみ出し行() Dim X&, Y&, C& ReDim G&(0) C = -1 X = WorkSeets(n).Cells.SpecialCells(xlCellTypeLastCell).Row For Y = 1 To X WorkSeets(n).PageSetup.PrintArea = "$" & CStr(Y) & ":$" & CStr(Y) If WorkSeets(n).VPageBreaks.Count > 0 Then C = C + 1 ReDim Preserve G(C) G(C) = Y End If Next If C >= 0 Then はみ出し行 = G End Function はみ出しのあった行番号の配列、またはEmpty(はみ出し行がない)が 返ります。 もしかしたら、もっと上手い方法があるかも知れないけど、今は 分からないので、泥臭いけど、1行ずつ確かめています。
その他の回答 (5)
- nda23
- ベストアンサー率54% (777/1415)
>表のどこではみ出しているかを直接的に知ることができない VPageBreaks.Count > 0 の場合に限り、以下の方法で調べられる。 .VPageBreaks.Item(1).Location.Cells.Column 垂直方向に分割された2番目のブロックの左端セルの列位置を示す。 >どのタイミングで セルの内容が変更され、垂直方向の分割数が変わる時 問題はこの数が0→1になる条件ですが、垂直分割ブロックの最右端に 文字、あるいは印刷対象が掛かった時です。実際には印刷幅として、 十分に余裕があっても、このセルに少しでもはみ出すと分割数が 増えます。(Excelのバグだろうけど、仕方ないです) つまり、右端に幅の広いセルを置くと、誤認する確率が高くなるという ことです。よって、右側の印刷限界に、極狭い幅の列(捨て列)を 置いて回避します。
お礼
大変感謝です。 画面上でまだセルや縦改ページまでに余裕があってもはみ出していると判断されているのは、Excelの特徴(?)なんですね。まさに、右端に幅の広いセルを置いておりました。回避方法もありがとうございます。 >>表のどこではみ出しているかを直接的に知ることができない では言葉足らずでした。はみ出しを発生させたセルの位置を知ることでそのセルへの文字の割り当てをやり直すような処理にしようとしていました。教えていただいた >.VPageBreaks.Item(1).Location.Cells.Column のうち、 .VPageBreaks.Item(1).Location.Cells でもって来られるセルは縦改ページ後の左上のセルで、はみ出しを発生させたセルのRow方向の位置は分かりませんから、どこのセルではみ出しを発生させたかは直接的にはわからないようです。 いずれにせよページ右端のセルに割り当てを行う際に毎回はみ出しチェックすることで、これは回避することができますから、やりたいことはできそうです。 ご指導頂き、どうもありがとうございました。心よりお礼申し上げます。
- nda23
- ベストアンサー率54% (777/1415)
>印刷範囲をはみ出した それが知りたい? If Worksheets(n).VPageBreaks.Count = 0 Then MsgBox "はみ出していません" Else MsgBox "はみ出しています" End If n番目のシートの垂直方向のページ分割数を求めました。
お礼
お返事ありがとうございます。 違った視点からのアプローチをありがとうございます。 マクロで生成される表が数十ページから100ページあまりとなり、目視でどこがはみ出しているかを毎回チェックするのが大変であったり、時として目視では分かりづらかったりするので、有るセルに割り当てられた文字列が印刷時に印刷範囲を超えているかどうかを知ることで、マクロでの処理中に改行なりなんなりの処理をすることを考えています。 VPageBreaksを使う方法は、垂直ページの分割数でみていますから、 1. 表のどこではみ出しているかを直接的に知ることができない。 2. どのタイミングでExcelが自動的に垂直ページ分割をするかを知る必要があります。 1.については縦ページ境界に近いセルに文字列を割り当てた後に毎回チェックを入れることで、どこで印刷範囲を超えたかを知ることができます。(あまりきれいではないですが…) 2.について試してみているのですが、どのタイミングでWorksheets(n).VPageBreaks.Count が0から1に設定されるかを知ることができていません。たとえば、新規作成→印刷プレビューでどのセルまでが1ページ内に印刷されるか=システム側の印刷設定が分かります。列1の各カラムに1,2,3,4...と入力し(私の場合はカラムIまでが1ページとなりますのでIまで)、印刷プレビューで9が表示されることを確認した上で(つまりはみ出していない)このマクロを適用すると、「はみ出しています」といわれます。どういうタイミングでVPageBreakが設定されるかご存知でしたら、追加で教えていただけないでしょうか?
- temtecomai2
- ベストアンサー率61% (656/1071)
> 残念ですが、おっしゃるとおり印刷してしまえば分かるのですが、印刷前にVBAで文字列の調整をするのが目的なんです。 いや、だから #1 さんは 「印刷前に印刷プレビューで確認してみれば?」 という提案をしているのですよ。
お礼
お返事ありがとうございます。 「印刷前に印刷プレビューで確認してみれば?」 というのは、「印刷プレビュー表示にして目視ではみ出しを確認したらどうですか?」という提案と受け取りました。これは実際に今やっていることで、これを自動化したく質問させていただいた次第です。 印刷プレビューを使用することで、印刷範囲をはみ出したことをVBAマクロ上から検出する手法があるのでしたら、教えていただけますでしょうか?お手数をおかけします。
- end-u
- ベストアンサー率79% (496/625)
最近、 『プロポーショナルフォントの文字列から印刷幅を求める関数』 http://oshiete1.goo.ne.jp/qa5071261.html このようなスレッドがありました。参考になれば。 #しばらくお待ちになれば、この質問者のnoah7150さんから回答がはいるかもしれませんね :)
お礼
お返事ありがとうございます。 教えていただいたスレッドを読ませていただきました。 使えそうなやり方がありそうですので、試してみたいと思います。 Excelで文字列を使うと必ず表示/印刷の問題に引っかかるので、折り返しや縮小以外でも簡易で一般的な解決策が有るのかと思ってました。皆さん印刷前にプレビューして小編集して印刷するという手順でやっていらっしゃるのでしょうかね。 どうもありがとうございました。おすすめにしたがって、もう少し待ってみます。
VBAでの解決方法ではありませんが、文字列を入れた状態で印刷プレビューで見るとだいたいわかると思うのですが、それでは済まないんでしょうか? Excelは印刷すると画面より相当右まで文字が行ってしまうので、書式作るのに苦労するんですよねぇ。わかります…。
お礼
早速のお返事ありがとうございます。 残念ですが、おっしゃるとおり印刷してしまえば分かるのですが、印刷前にVBAで文字列の調整をするのが目的なんです。
お礼
最後までご教授頂きありがとうございました。頂いた関数を上手く使うことができずお返事が遅くなってしまいました。これで、どの行がはみ出しているかを確認することができます。 色々やってみたことで分かったことは: 1. 画面上では境界を越えていなくても、印刷時には超えてしまうケースがある。 2. VPageBreaks.Count が0→1に変わるのは、画面上で文字列がページ境界に至っていなくても発生する。 これらは、プロポーショナルでもモノスペースでも同じなので、多分安全を見て実際よりも手前で改ページしてしまうのでしょうね。 どうもありがとうございました。