AIと戦って、あなたの人生のリスク診断 >>

一般的にプログラミングで文字列長というと、文字数やバイト数を意味しますが、今回の質問は、文字列が表示時または印刷時に占める長さを何とか入手できないだろうかとの質問です。

バックグラウンドとしては、あるセルに長さが分からない文字列が入るときに、それが印刷時に紙面上の印刷範囲あるいは想定している印刷位置に収まるかどうかを確認したいのです。

お知恵を拝借できれば幸です。よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (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行ずつ確かめています。
    • good
    • 0
この回答へのお礼

最後までご教授頂きありがとうございました。頂いた関数を上手く使うことができずお返事が遅くなってしまいました。これで、どの行がはみ出しているかを確認することができます。

色々やってみたことで分かったことは:
1. 画面上では境界を越えていなくても、印刷時には超えてしまうケースがある。
2. VPageBreaks.Count が0→1に変わるのは、画面上で文字列がページ境界に至っていなくても発生する。
これらは、プロポーショナルでもモノスペースでも同じなので、多分安全を見て実際よりも手前で改ページしてしまうのでしょうね。
どうもありがとうございました。

お礼日時:2009/07/21 15:53

>表のどこではみ出しているかを直接的に知ることができない


VPageBreaks.Count > 0 の場合に限り、以下の方法で調べられる。
.VPageBreaks.Item(1).Location.Cells.Column
垂直方向に分割された2番目のブロックの左端セルの列位置を示す。

>どのタイミングで
セルの内容が変更され、垂直方向の分割数が変わる時
問題はこの数が0→1になる条件ですが、垂直分割ブロックの最右端に
文字、あるいは印刷対象が掛かった時です。実際には印刷幅として、
十分に余裕があっても、このセルに少しでもはみ出すと分割数が
増えます。(Excelのバグだろうけど、仕方ないです)
つまり、右端に幅の広いセルを置くと、誤認する確率が高くなるという
ことです。よって、右側の印刷限界に、極狭い幅の列(捨て列)を
置いて回避します。
    • good
    • 0
この回答へのお礼

大変感謝です。

画面上でまだセルや縦改ページまでに余裕があってもはみ出していると判断されているのは、Excelの特徴(?)なんですね。まさに、右端に幅の広いセルを置いておりました。回避方法もありがとうございます。

>>表のどこではみ出しているかを直接的に知ることができない
では言葉足らずでした。はみ出しを発生させたセルの位置を知ることでそのセルへの文字の割り当てをやり直すような処理にしようとしていました。教えていただいた

>.VPageBreaks.Item(1).Location.Cells.Column
のうち、
.VPageBreaks.Item(1).Location.Cells
でもって来られるセルは縦改ページ後の左上のセルで、はみ出しを発生させたセルのRow方向の位置は分かりませんから、どこのセルではみ出しを発生させたかは直接的にはわからないようです。
いずれにせよページ右端のセルに割り当てを行う際に毎回はみ出しチェックすることで、これは回避することができますから、やりたいことはできそうです。

ご指導頂き、どうもありがとうございました。心よりお礼申し上げます。

お礼日時:2009/07/09 11:12

>印刷範囲をはみ出した


それが知りたい?
If Worksheets(n).VPageBreaks.Count = 0 Then
  MsgBox "はみ出していません"
Else
  MsgBox "はみ出しています"
End If
n番目のシートの垂直方向のページ分割数を求めました。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
違った視点からのアプローチをありがとうございます。

マクロで生成される表が数十ページから100ページあまりとなり、目視でどこがはみ出しているかを毎回チェックするのが大変であったり、時として目視では分かりづらかったりするので、有るセルに割り当てられた文字列が印刷時に印刷範囲を超えているかどうかを知ることで、マクロでの処理中に改行なりなんなりの処理をすることを考えています。

VPageBreaksを使う方法は、垂直ページの分割数でみていますから、
1. 表のどこではみ出しているかを直接的に知ることができない。
2. どのタイミングでExcelが自動的に垂直ページ分割をするかを知る必要があります。

1.については縦ページ境界に近いセルに文字列を割り当てた後に毎回チェックを入れることで、どこで印刷範囲を超えたかを知ることができます。(あまりきれいではないですが…)

2.について試してみているのですが、どのタイミングでWorksheets(n).VPageBreaks.Count が0から1に設定されるかを知ることができていません。たとえば、新規作成→印刷プレビューでどのセルまでが1ページ内に印刷されるか=システム側の印刷設定が分かります。列1の各カラムに1,2,3,4...と入力し(私の場合はカラムIまでが1ページとなりますのでIまで)、印刷プレビューで9が表示されることを確認した上で(つまりはみ出していない)このマクロを適用すると、「はみ出しています」といわれます。どういうタイミングでVPageBreakが設定されるかご存知でしたら、追加で教えていただけないでしょうか?

お礼日時:2009/07/04 10:47

> 残念ですが、おっしゃるとおり印刷してしまえば分かるのですが、印刷前にVBAで文字列の調整をするのが目的なんです。



いや、だから #1 さんは 「印刷前に印刷プレビューで確認してみれば?」 という提案をしているのですよ。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。

「印刷前に印刷プレビューで確認してみれば?」
というのは、「印刷プレビュー表示にして目視ではみ出しを確認したらどうですか?」という提案と受け取りました。これは実際に今やっていることで、これを自動化したく質問させていただいた次第です。

印刷プレビューを使用することで、印刷範囲をはみ出したことをVBAマクロ上から検出する手法があるのでしたら、教えていただけますでしょうか?お手数をおかけします。

お礼日時:2009/07/03 09:01

最近、


『プロポーショナルフォントの文字列から印刷幅を求める関数』
http://oshiete1.goo.ne.jp/qa5071261.html
このようなスレッドがありました。参考になれば。

#しばらくお待ちになれば、この質問者のnoah7150さんから回答がはいるかもしれませんね :)
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。

教えていただいたスレッドを読ませていただきました。
使えそうなやり方がありそうですので、試してみたいと思います。

Excelで文字列を使うと必ず表示/印刷の問題に引っかかるので、折り返しや縮小以外でも簡易で一般的な解決策が有るのかと思ってました。皆さん印刷前にプレビューして小編集して印刷するという手順でやっていらっしゃるのでしょうかね。

どうもありがとうございました。おすすめにしたがって、もう少し待ってみます。

お礼日時:2009/07/03 10:51

VBAでの解決方法ではありませんが、文字列を入れた状態で印刷プレビューで見るとだいたいわかると思うのですが、それでは済まないんでしょうか?



Excelは印刷すると画面より相当右まで文字が行ってしまうので、書式作るのに苦労するんですよねぇ。わかります…。
    • good
    • 0
この回答へのお礼

早速のお返事ありがとうございます。
残念ですが、おっしゃるとおり印刷してしまえば分かるのですが、印刷前にVBAで文字列の調整をするのが目的なんです。

お礼日時:2009/07/02 21:24

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qプロポーショナルフォントの文字列から印刷幅を求める関数

フォントと文字列を指定して必要なピクセル数を求める関数はありますか

備考欄なのですが2文字程度のあふれなら縮小、それ以上なら改行して全体表示させるマクロを作りたいのです

固定長フォントにすれば文字数から判断できますがPフォントなので

別シートに該当文字列を入れてAutoFitして求めることも考えましたがあまりスマートじゃないで
何かで見た記憶があるのですがVBAじゃなかったのか探しても見つから無かったので質問させていただきます。

Aベストアンサー

検索してみたら、APIのGetTextExtentPoint32関数で取れそうな感じですが...
http://msdn.microsoft.com/ja-jp/library/cc410400.aspx
よくわかってないのでハズしてたらすみません。

『No16666.テキストボックスからはみ出た文字を削除する方法』
http://www.accessclub.jp/bbs2/0051/beginter16666.html
ここを参考にテストしてみて、Pフォントの各文字幅が取れるところまでは確認しました。(文字列全体も)
Function GetTextExtent にControlではなくFontを渡すように修正したり、
dxdy.cx取得後の変換が必要だったりするような感じではありますが。

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

QEXCEL VBAで全選択範囲の解除

EXCEL VBAで
Cells.Select
と書くと、全セルが選択状態になりますが、
これを解除するには、どう書けばよいのでしょうか?

Aベストアンサー

その1
A1 など、適当なセルを選択する。
(回答#1と同じ)

その2
全選択する前の選択範囲に戻る。

全選択前に
変数 = Selection.Address で記憶

全選択後
Range(変数).Select で元の選択範囲を選択

QVBAマクロで、図形等のオブジェクトを選択(特定)する方法ってありますか

こんにちは。VBAマクロを少しかじっています。
顔写真付きの従業員の検索システムを作りました。名前を入力(選択)したら、データシートから職員コード、住所、電話番号などの情報を検索し検索画面に表示します。この際、別のシートに顔写真を貼り付けたもの(1セルに1枚。セルに従業員名を入力してある。)から、VLOOKUP関数を使ってセル照会することで、画像も同時に表示することができます。
別の職員に切り換えたり、クリアする場合の画像の処理は、削除用のシートを用意し、そこにセルごと移動し、終了時にシートごと削除する方法をとりました。(当然、確認用のダイアログボックスが表示されます。)
前置きが長くなりましたが、問題は、用済みの画像を選択するプロシージャがあれば、あえて削除用のシートを用意する必要はありません。セルの場合は、Rangeプロパティやcellsプロパティで特定できますが、画像などのオブジェクトをセル番地などを使って特定する方法ってあるのでしょうか。
因みに、画像の選択処理を、マクロ記録でプロシージャを作成したら、
ActiveSheet.Shapes("Picture 1").Select などとなります。
よろしくお願いします。

こんにちは。VBAマクロを少しかじっています。
顔写真付きの従業員の検索システムを作りました。名前を入力(選択)したら、データシートから職員コード、住所、電話番号などの情報を検索し検索画面に表示します。この際、別のシートに顔写真を貼り付けたもの(1セルに1枚。セルに従業員名を入力してある。)から、VLOOKUP関数を使ってセル照会することで、画像も同時に表示することができます。
別の職員に切り換えたり、クリアする場合の画像の処理は、削除用のシートを用意し、そこにセルごと移動し、終了時...続きを読む

Aベストアンサー

検索シートにシェイプが1つしかなければ
ActiveSheet.Shapes(1).Select
で選択
ActiveSheet.Shapes(1).Delete
で削除できます。

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

Q結合したセルの高さを内容に合わせてVBAで設定したい

EXCELのVBAで質問です。

ファイルから文章を取り出し、
別のファイルの指定された位置に
その文章をはめ込む作業を行っています。

文章を入れるセルは結合されたセルで、
折り返して全体を表示する設定にしてあります。
セルの幅は固定、フォントはプロポーショナルフォントを使用します。
(英文の場合半角で入力されるので)

この時、文章の長さに合わせて、
文字が切れることなく印刷されるように
マクロでセルの高さを設定したいと考えています。
そういう方法はありますでしょうか? 
あれば教えていただきたいと思います。

文章の長さは数文字~数百文字とまちまちで、
あらかじめ適当な高さを取るわけにはいきません
(はめ込む文章は1つではなく、複数あり、
はめ込む先も複数行あるため、
1つ1つのセルの高さを多めに取ると、
文章が短い場合にやたら空白ができてしまうため)

宜しくお願いいたします。

Aベストアンサー

こんばんは。KenKen_SP です。

例えば、

  1. テンポラリーなシートを用意
  2. 本番で流し込む結合セルと同じ環境に A1 セルを設定
    ・セル幅
    ・フォント&フォントサイズ
    ・ボールド等のフォント属性
  3. A1 セルを「折り返して表示」にする
  4. データを流しこんで、行の AutoFit 実行
    Rows(1).AutoFit
  5. Range("A1").Height で必要なセルの高さが求められる
  6. 本番用シートで結合セルのセルの高さを調整
  7. データを流し込む
  8. 最後に 1. のシート削除

のような手順でできませんか?

計算でセルの高さを求めるのは、#1 ご回答のように複雑な要素が絡んで
難しいですね。 AutoFit を利用した方が簡単です。

Qエクセル VBA セルの個数を所得する

いつも皆様には大変お世話になっております。

早速の質問ですが、

    A    B     C     D     E
1
2       123
3       123
4       123
5       123
6
7       123
とエクセルのセルがなっている場合の
上のB2から下のB7までのセルの個数を所得したいのです
B8以降にも数字が入る場合があるのと間に空白が入る場合があるので
困っています。
B2のセルは固定となっているのでB2からの判別で問題ない状況です。
どうぞ皆様お知恵をお借りしたく思っておりますのでよろしくお願いいたします。

Aベストアンサー

質問が非常に不明確なのですが・・・

所得?取得ですよね?

単にB2:B7のセルの個数をVBAで取得するなら
MsgBox Range("B2:B7").Count

B2:B7の空白でないセルの個数なら
MsgBox Application.CountA(Range("B2:B7"))

B7まででなくB2からB列のデータがある最後までのセル個数なら
MsgBox Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row).Count

B2からB列のデータがある最後までの空白でないセル個数なら
MsgBox Application.CountA(Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row))


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング