• ベストアンサー

excel・VBAで奇数・偶数の分岐がうまくいかない。

一覧が入っているシートから宛名用のシール印刷をするために、VBAを使用しています。 ラベル印刷は ┏━━━━┓┏━━━━┓ ┃ 奇数 ┃┃ 偶数 ┃ ┗━━━━┛┗━━━━┛ みたいな感じです。 奇数:一覧シートの奇数行 偶数:一覧シートの偶数行 ですが、奇数の方はうまく出るのですが、偶数の方が1つおきになってしまいます。 これのどこが間違っているのでしょうか? Worksheets("Sheet1").Select Last = Cells(1).CurrentRegion.Rows.Count For i = 2 To Last Worksheets("Sheet1").Select Yuubin = Cells(i, 1) Name = Cells(i, 6) Dim AllCount As Integer Worksheets("TEST").Select Kotae = i / 2 Amari = i Mod 2 AllCount = i / 12 If Amari = 0 Then Ichi = (((Kotae - 1) * 9) + 1) - AllCount Cells(Ichi, 2) = "〒" & Left(Yuubin, 3) & "-" & Right(Yuubin, 4) Cells(Ichi + 7, 4) = Name & " 様" ElseIf Amari = 1 Then Ichi = (((Kotae - 1) * 9) + 1) - AllCount Cells(Ichi, 17) = "〒" & Left(Yuubin, 3) & "-" & Right(Yuubin, 4) Cells(Ichi + 7, 19) = Name & " 様" & i End If '奇数偶数分岐 Next ' 全件分終るまで よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

#2で回答した者です。 #4さんがおっしゃるように Integer宣言した場合には、 1.5→2になります。(四捨五入されています) #4さんの回答の kotae = i / 2 - 0.3 でも1にはなりますが、 このような場合、Int関数により小数点以下切り捨てで kotae = Int(i / 2) のように記述した方が、 後々、修正等する場合に、分かりやすいと思います。 後、Allcountが気になっているのですが、 12人分で1ページとして次のページで1行分上にずらしたいという事でしょうか? この場合も、上で述べたように i=6でallcount = 1になってしまうので allcount = int(i/12) のようにしてください。 (この場合、i=2から始まっているので、1ページは2~11(10人分) 2ページは12~23(12人分)となってしまうので allcount = int((i-2)/12) にしないといけないと思います。) 私のプログラムでなら y = Int((i - 2) / 2) * 9 + 1 - int((i-2)/12) でしょうか? 私の考えが、KODAMARさんの考えているものかどうかよくわかりません。 KODAMARさんが考えている処理をもう少し具体的にあげていただかないと、 KODAMARさんが考えている処理にならないプログラムを提示されて、よろしくお願いしますと言われても 回答者も難しいと思います。 もし、考え違いをしているようなら、補足してください。

KODAMAR
質問者

お礼

回答ありがとうございます。 Intを使って無事完成させることができました。 ありがとうございます。 >KODAMARさんが考えている処理にならないプログラムを提示されて、よろしくお願いしますと言われても 回答者も難しいと思います。 そうですね。すいませんでした。 >もし、考え違いをしているようなら、補足してください。 いえ、ちゃんと的を得た回答になっていました。 言葉足らずの説明でわかっていただきありがとうございました。

その他の回答 (5)

回答No.6

たびたび、すいません。 #5の最後の方は悪いように取らないで下さい。 私としては、処理内容だけ書いて、どうすればよいでしょうか? という質問よりも好感をもっています。 ただ、人のプログラムを解析するのは、大変だという事も頭に入れて欲しいという事です。 文章を作るのが苦手なので、不快に思われたらすみません。

KODAMAR
質問者

お礼

>私としては、処理内容だけ書いて、どうすればよいでしょうか? という質問よりも好感をもっています。 そういっていただけて嬉しいです。 >ただ、人のプログラムを解析するのは、大変だという事も頭に入れて欲しいという事です。 その通りですよね。 私だって人のプログラム読むの好きじゃないし。 (自分がかいたのだって時間がたてば読むのイヤなくらいですから) それなのに回答くださってありがとうございました。

  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.4

変数を明示的に宣言して Dim last As Integer, i As Integer, kotae As Integer Dim amari As Integer, ichi As Integer >Kotae = i / 2 を次のように変えてください。 kotae = i / 2 - 0.3 理由 エクセルが、0.5をどう処理して良いか、迷っているみたいだから。

KODAMAR
質問者

お礼

回答ありがとうございます。 言われてきづきました。 そうですよね、「0.5」ですよね。 ここが原因だったんですね。 ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

私は2列のラベルをワークシート上に作るとき、項目の列を行により左右する(一定列数加える)ことにより、制御しています。 Sub test06() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("sheet1") Set sh2 = Worksheets("sheet2") a = 4 For i = 1 To 10 j = Int((i - 1) / 2) + 1 k = (i - 1) Mod 2 ' MsgBox j & "=" & k sh2.Cells(j, 1 + k * a) = sh1.Cells(i, "A") Next i End Sub を参考にして考えて見てください。i-1などがミソです。 この例では簡単にするため、例えばA列の郵便番号だけの 例にしています。

KODAMAR
質問者

お礼

回答ありがとうございます。 ちょっと自分とは違った視点でみられていて 参考になりました。 今後参考にさせていただきます。 ありがとうございました。

回答No.2

このプログラムを[F8]で1行ずつデバッグするようにしましょう。 (1)Kotae = i / 2    Ichi = (((Kotae - 1) * 9) + 1) - AllCount    i=2の時、kotae = 1    i=3の時、kotae = 1.5    が入っています。 (2)Kotae = i / 2    Amari = i Mod 2    AllCount = i / 12    が正しい求め方かもう一度考えて見てください。 一応このように変更してみました。 Sub test()   Worksheets("Sheet1").Select   Last = Cells(1).CurrentRegion.Rows.Count      For i = 2 To Last     With Worksheets("Sheet1")       Yuubin = .Cells(i, 1)       Name = .Cells(i, 6)     End With          y = Int((i - 2) / 2) * 9 + 1     x = (i Mod 2) * 15 + 2     With Worksheets("TEST")       .Cells(y, x) = "〒" & Left(Yuubin, 3) & "-" & Right(Yuubin, 4)       .Cells(y + 7, x + 2) = Name & " 様"     End With   Next ' 全件分終るまで End Sub 確認してみてください。

KODAMAR
質問者

お礼

回答ありがとうございます。 普段変数を宣言?する時にwithとかは使わないんですが、 使ったほうがいいんですか? 今後参考にさせていただきます。 ありがとうございました。

  • yomo3
  • ベストアンサー率32% (88/269)
回答No.1

こんばんは。 全部解析したわけではありませんが、 とりあえず、KotaeとAmariをIntegerで宣言したらどうでしょう。 具体的に数値を入れて見るとわかる気がしますが、まだそこまでやってません。

KODAMAR
質問者

お礼

週末が入ってしまい、回答が遅れてしまいました。 すいません。 質問のコードには書き切れなかったので(文字数の制限で)省いてしまいましたが、 実際はIntegerで宣言はしてあります。 回答ありがとうございました。

関連するQ&A

専門家に質問してみよう