[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ActiveSheet.PageSetup.PrintArea に代入できる文字列の数について』(kaba)
同じ帳票フォーマットが100人分下につながっています。
(たとえば 1ページ目"A1:Z10"、2ページ目"A11:Z20・・・100ページ目"A990:Z1000")
必要なページのみを印刷対象にしたいため、ループでまわして
str ← "A1:Z10,A31:Z40,A51:Z60・・・" のように代入していき
ActiveSheet.PageSetup.PrintArea = str
とするとエラーが出る場合があります。
調査するとどうも256バイトまでしか代入できないようです。
また、マクロの記録で「範囲指定」→「印刷範囲」の追加を繰り返したあと内容を見てみると、
256バイトまでに有効な文字列までしか記述されておらず、その後のマクロ記述も256文字までのものの繰り返しでした。
ちなみに、名前の管理で print_area を見てみると指定した印刷範囲がちゃんと設定されていました。
そこで、
@VBAには「256バイトの壁」のようなものがあるのでしょうか?
A上記の問題を回避する方法がありましたらお教えくださいませ。
(できなければ、「連続するページはまとめてセットする」ような方法で作成しようとは思いますが、エラーの出現を遅らせているだけですし・・・)
よろしくお願いします。
[WinXP,Excel2007]
検索してみたけど、明確に仕様として説明しているところはなかったけど、以下でやると確かに 256 を超えたところで エラーになるねぇ。
Sub Test() Dim myStr As String Dim x As Long Dim i As Long myStr = "A1:A10" ActiveSheet.PageSetup.PrintArea = myStr For i = 1 To 100 For x = 66 To 90 myStr = myStr & "," & Chr(x) & "1:" & Chr(x) & "10" ActiveSheet.PageSetup.PrintArea = myStr Next Next End Sub
印刷すべきところが明確なので(だから必要な部分のみを代入できるんだよね) 一度に設定して印刷せずに、ループで必要なところを1ページずつ設定して印刷をすればいいんじゃない?
(ぶらっと)
こんにちは 改ページはセットしてあれば不要ですけど、必要な範囲だけ取得して印刷するようにしてはどうですか? 一人おきに印刷するとして、 Sub test() Dim i As Long Dim r As Range Dim s As Range Set r = Range("A1:Z10") For i = 11 To 1001 Step 10 ActiveSheet.HPageBreaks.Add Before:=Cells(i, 1) Next For i = 0 To 100 If i Mod 2 = 0 Then If s Is Nothing Then Set s = r.Offset(i * 10) Else Set s = Union(s, r.Offset(i * 10)) End If End If Next ' s.PrintPreview True s.PrintOut Copies:=1, Collate:=True Set r = Nothing Set s = Nothing End Sub (ウッシ)
こうなりますと、抽出するデータ量を(人間が)制限するくらいしかないでしょうか・・・
また、エラーメッセージで喚起するくらいしてみます。
みなさま、ありがとうございました。
>VBAには「256バイトの壁」のようなものがあるのでしょうか? Excel2002で試した限りでは、255までセーフで256でアウトでしたが・・・。
Sub test1() Dim add As String Dim g0 As Long add = "a1" For g0 = 1 To 60 add = add & ",a" & (g0 * 2 + 1) Next add = add & ",c1,c3" MsgBox Len(add) Sheet1.PageSetup.PrintArea = add End Sub
Sub test2() Dim add As String Dim g0 As Long add = "a1" For g0 = 1 To 60 add = add & ",a" & (g0 * 2 + 1) Next add = add & ",c1,c33" MsgBox Len(add) Sheet1.PageSetup.PrintArea = add End Sub
test1は、OKでtest2は、
Sheet1.PageSetup.PrintArea = add ↑でエラーが発生しました。
これRangeオブジェクトでも同じですよね!!
Sub test3() Dim add As String Dim g0 As Long add = "a1" For g0 = 1 To 60 add = add & ",a" & (g0 * 2 + 1) Next add = add & ",c1,c3" MsgBox Len(add) Range(add).Select End Sub Sub test4() Dim add As String Dim g0 As Long add = "a1" For g0 = 1 To 60 add = add & ",a" & (g0 * 2 + 1) Next add = add & ",c1,c33" MsgBox Len(add) Range(add).Select End Sub
test3は、OKでtest4は、エラーになります。
データの長さの領域に1バイトしか用意してないのでしょうかねえ!!
255の壁ってありますよねえ、他にはオートシェイプのテキスト長
Sub test5() Dim add As String Dim g0 As Long add = "a1" For g0 = 1 To 60 add = add & ",a" & (g0 * 2 + 1) Next add = add & ",c1,c3" MsgBox Len(add) With ActiveSheet.Rectangles.add(0, 0, 200, 200) .Text = add DoEvents MsgBox "255文字までは、表示されたでしょう" .Delete End With End Sub Sub test6() Dim add As String Dim g0 As Long add = "a1" For g0 = 1 To 60 add = add & ",a" & (g0 * 2 + 1) Next add = add & ",c1,c33" MsgBox Len(add) With ActiveSheet.Rectangles.add(0, 0, 200, 200) .Text = add DoEvents MsgBox "256文字だと表示されないでしょう" .Delete End With End Sub
test5は、テキストが表示されますが、test6は、テキストの表示がされませんよね?
Rangeやオートシェイプは、回避方法がありますけどねえ!!
ichinose
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.