Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10全般 : Excel 2016)
差し込み印刷の連続印刷〜続〜
投稿日時: 19/10/15 23:13:05
投稿者: ひろやまさん

以前simple様から作っていただいた、VBAを改造したいのです。
 
 
以前作っていただたものが、こちらになります。
--------------------
Sub test()
    Dim wsリスト As Worksheet
    Dim ws印刷 As Worksheet
    Dim k As Long
     
    Set wsリスト = Worksheets("Sheet1")
    Set ws印刷 = Worksheets("Sheet2")
     
    For k = 1 To 3
        ws印刷.Range("C1").Value = wsリスト.Cells(k, "A").Value
        ws印刷.PrintOut
    Next
End Sub
--------------------------
 
ですが、これだと、結果して印刷されるのが3枚になってしまいます。そこでリストが空白セルになるようにしたいので、自分なりにやってみたのですが、どうもうまく動きません。
 
自分なりに作ったVBA
------------------------------
Sub test()
    Dim wsリスト As Worksheet
    Dim ws印刷 As Worksheet
    Dim k As Long
    Dim i
    Dim s
     
    Set wsリスト = Worksheets("Sheet1")
   Set ws印刷 = Worksheets("Sheet2")
         
    For k = 1 To k
         
    Range("A1").Select
 
    k = 0
     
    Do
 
        s = ActiveCell.Offset(k, 0).Value
         
        If s = "" Then
 
            Exit Do
        End If
                k = k + 1
    Loop
        ws印刷.Range("C1").Value = wsリスト.Cells(k, "A").Value
         
        ws印刷.PrintOut
    Next
  
     
End Sub
------------------------------
 
どなたかわかる方ご教授寝返ると助かります。よろしくお願いいたします。

回答
投稿日時: 19/10/16 10:11:34
投稿者: simple

> リストが空白セルになるようにしたいので
の意味が採れないのですが、
「空白セルになるまでの範囲で」という意味だと解釈します。
(印刷済みのセルは空白セルになるように消して行って、という意味ともとれる)
 
こうした空白になる直前までの範囲でというのは、定番の書き方があります。
予め空白でない行を調べて For..Nextを使う方法です。

Sub test1()
    Dim wsリスト As Worksheet
    Dim ws印刷 As Worksheet
    Dim k As Long

    Set wsリスト = Worksheets("Sheet1")
    Set ws印刷 = Worksheets("Sheet2")

    For k = 1 To wsリスト.Cells(wsリスト.Rows.Count, "A").End(xlUp).Row
        ws印刷.Range("C1").Value = wsリスト.Cells(k, "A").Value
        ws印刷.PrintOut
    Next
End Sub
Endプロパティの使い方が肝ですが、"VBA 最終行"などとネット検索して調べてみて下さい。
 
あなたのトライの延長線で書くなら、こんなことになりますか?
Sub test2()
    Dim wsリスト As Worksheet
    Dim ws印刷 As Worksheet
    Dim k As Long
    Dim s

    Set wsリスト = Worksheets("Sheet1")
    Set ws印刷 = Worksheets("Sheet2")
    k = 1
    Do
        s = wsリスト.Cells(k, "A").Value
        If s = "" Then Exit Do
        ws印刷.Range("C1").Value = s
        ws印刷.PrintOut
        k = k + 1
    Loop
End Sub

このほか、Do Until や Do Whileを使った書き方がありますが、
予め最終行を得る方法があるのですから、それを使って For Nextで書くのが、
間違えにくいと思います。お薦めします。
また Endプロパティを使った手法は頻出しますので、
今後のため是非使えるようにされたらよいでしょう。
# 一部修正しました。

回答
投稿日時: 19/10/19 12:02:06
投稿者: simple

ひょっとして、
ストが空白セルになるようにしたいので
というつもりでしたか。
質問の意図をこちらが誤解しているとしたら、修正の指摘をしてください。
いずれにしても返事くらいしてください。

回答
投稿日時: 19/10/19 13:32:52
投稿者: simple

自作のコードへのコメントが無いのが問題だったでしょうか。
 
まず、きちんとインデントをつけることを推奨します。
繰り返しなどの構造が分かり易くなると思います。

Sub test()
    Dim wsリスト As Worksheet
    Dim ws印刷 As Worksheet
    Dim k As Long
    Dim i
    Dim s

    Set wsリスト = Worksheets("Sheet1")
    Set ws印刷 = Worksheets("Sheet2")

    For k = 1 To k
        Range("A1").Select
        k = 0
        Do
            s = ActiveCell.Offset(k, 0).Value
            If s = "" Then
                Exit Do
            End If
            k = k + 1
        Loop
        ws印刷.Range("C1").Value = wsリスト.Cells(k, "A").Value
        ws印刷.PrintOut
    Next
End Sub

 For k = 1 To kですけれど、繰り返しにつかう変数(ループ変数とも言います)k を
そのまま終了する条件にすることは、まずありません。
ループ変数は普通は1ずつ増えていく、つまり、kは1,2,3....と変わっていくわけで、
それを終了条件にはできません。
 
実際にステップ実行すると明確ですが、
初期化されたk(つまり、0)が終了条件ですから、
そのループは直ちに抜けてしまって、なにも作業は行われません。
 
また、ループ変数 k を途中で、 k = k + 1 と変更していますが、
こうしたことも普通はやりません。Nextに任せます。
 
こうした部分は、自分で工夫していくよりも、
定型の書き方をいくつか学習されるほうが効率が良いと思います。
されたいことが少し明確ではないですが、たぶん、それほど複雑なことではないようですから、
標準的な方法で対応できるはずです。
 
頑張って下さい。私はこれまでとします。

トピックに返信