[[20121120115412]] 『ActiveSheet.PageSetup.PrintArea に代入できる文』(kaba) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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.