Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1350 / 13644 ツリー ←次へ | 前へ→

【74961】改ページの条件 hanako 13/11/3(日) 13:12 質問[未読]
【74962】Re:改ページの条件 γ 13/11/3(日) 15:29 発言[未読]
【74963】Re:改ページの条件 hanako 13/11/3(日) 18:47 質問[未読]
【74965】Re:改ページの条件 γ 13/11/3(日) 20:42 発言[未読]
【74966】Re:改ページの条件 γ 13/11/3(日) 20:56 発言[未読]
【74969】Re:改ページの条件 γ 13/11/4(月) 8:19 発言[未読]
【74972】Re:改ページの条件 hanako 13/11/4(月) 9:57 お礼[未読]
【74973】Re:改ページの条件 13/11/4(月) 10:02 回答[未読]

【74961】改ページの条件
質問  hanako  - 13/11/3(日) 13:12 -

引用なし
パスワード
   初めまして、お世話になります。皆様のお力を貸してください。

いまA列に5行目からA列にセルごとに○記号が入力されています。
(だいたい200行くらいまで)
そしてそのA列のところどころに○記号ではなく、×記号が4個
くらい入力されていて上(A列5行目)から30行ごとに改ページをしていきたい
のですが、そこで×記号が現れたら、そのページが30行に満たな
くともそこで改ページをして、その×を先頭に数えてまた30行ごとに
改ページをしたいのです。下のようにコードを書いてみましたがうまく
いきません。皆様のお知恵をお貸し下さい。よろしくお願いいたします。

Sub Macro1()

Dim i As Long
Dim j As Long   

  ActiveSheet.ResetAllPageBreaks
  
  
  i = 6
 
  Do Until Cells(i, 1).Value = 0
  
    If Cells(i, 1).Value = "×" Then

      ActiveSheet.HPageBreaks.Add Before:=Cells(i, 1)
      
      
     Else
    
   j = i
    
  For j = 6 To j Step 30
   ActiveSheet.HPageBreaks.Add Before:=Cells(j, 1)
  Next
      
      
    End If
    i = i + 1
  Loop
  
  ActiveSheet.PrintPreview

End Sub

【74962】Re:改ページの条件
発言  γ  - 13/11/3(日) 15:29 -

引用なし
パスワード
   こんにちは。

iとは別にカウンターを用意して、
Do Loopのなかを次のようにしたら、いいんじゃないですか?

    カウンターを進める
    もし、セルが "×" か、または、カウンターが 30 だったら
      ・改ページを入れる
      ・カウンターを初期化する
    End If

コードを作ってみてください。
なお、インデントを正確に入れたほうが良いと思いますよ。

【74963】Re:改ページの条件
質問  hanako  - 13/11/3(日) 18:47 -

引用なし
パスワード
   γ さん アドバイスありがとうございます。

参考にしてコードをかいてみたのですが、走らせると無限ループに
入ってしまうみたいで、私の実力不足を痛感しています。
新しいカウンターをjとしています。カウンターを進めるやり方というのが
for next 文でよろしいのでしょうか。


ub Macro1()

Dim i As Long
Dim j As Long

   ActiveSheet.ResetAllPageBreaks
  
  i = 6
  
  Do Until Cells(i, 1).Value = 0

    
  For j = 1 To j
    
     If Cells(i, 1).Value = "×" Or j = 30 Then

      ActiveSheet.HPageBreaks.Add Before:=Cells(i, 1)
   
      j = 1 'カウンターを初期化
  
     End If
          
  Next
  
    i = i + 1
  
  
  Loop
 
   ActiveSheet.PrintPreview

【74965】Re:改ページの条件
発言  γ  - 13/11/3(日) 20:42 -

引用なし
パスワード
   ▼hanako さん:
>新しいカウンターをjとしています。カウンターを進めるやり方というのが
> for next 文でよろしいのでしょうか。
ずいぶん難しく考えますね。
カウンタを進めるは、
  j = j + 1
ですよ。

【74966】Re:改ページの条件
発言  γ  - 13/11/3(日) 20:56 -

引用なし
パスワード
   また、初期化とはゼロにすることです。

なお、インデントを正確につけるようにしたほうがいいですよ。

そして、ご自分でステップ実行して、
一行一行なにが実行されるかを確認すると、
理解が進むと思います。

【74969】Re:改ページの条件
発言  γ  - 13/11/4(月) 8:19 -

引用なし
パスワード
   書き方の一例です。
Sub test()
  Dim i As Long
  Dim counter As Long
  
  ActiveSheet.ResetAllPageBreaks
  i = 6
  Do Until Cells(i, 1).Value = 0
    counter = counter + 1
    If Cells(i, 1).Value = "×" Or counter = 30 Then
      ActiveSheet.HPageBreaks.Add Before:=Cells(i, 1)
      counter = 0
    End If
    i = i + 1
  Loop
  ActiveSheet.PrintPreview
End Sub

その脱出条件が適当かどうか確認して下さい。

Endプロパティを使って、最終行を求めてから、
For .. Nextでループさせたほうが良いと思います。
一行一行脱出条件判定をする必要が無いほか、
i = i + 1 と書く必要もないからです。

それに、心なしか、その書き方が事態を複雑にしていて、
理解を難しくしているのかもしれません。

【74972】Re:改ページの条件
お礼  hanako  - 13/11/4(月) 9:57 -

引用なし
パスワード
   γさん、コードの提示までしていただき、非常に感謝しています。
私もγさんのヒントを参考(ほとんど答えでした)に何とか望み通り
のコードを書いて、お礼のレスを書こうとしていたときに、γさん
がコードまで提示していただき、本当に感謝の気持ちでいっぱいです。
本当にありがとうございました。


Sub Macro1()

Dim i As Integer
Dim j As Intege
   ActiveSheet.ResetAllPageBreaks
 
  i = 6
  j = 0
  
  Do Until Cells(i, 1).Value = 0
    
  j = j + 1
    
     If Cells(i, 1).Value = "×" Or j = 30 Then

      ActiveSheet.HPageBreaks.Add Before:=Cells(i, 1)
      j = 0
     
     End If
         
     i = i + 1
  
  Loop
 
 ActiveSheet.PrintPreview

End Sub

【74973】Re:改ページの条件
回答    - 13/11/4(月) 10:02 -

引用なし
パスワード
   こんにちは。

30だと大きくてしづらいので 5で説明させていただきます。
なさりたいことは、おおまかには、jの値を
1,2,3,4,5,1,2,3,4,5,1,2,3,4,5....と循環させることと見ました。

つまり、jが5ならつぎは1 それ以外なら次は+1 ということ
if j = 5 then
  j = 1
else
  j = j + 1
end if

これを、外側のiのループの中に組み込めばよさそうです。

1350 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free