- ベストアンサー
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 ' 全件分終るまで よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#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さんが考えている処理にならないプログラムを提示されて、よろしくお願いしますと言われても 回答者も難しいと思います。 もし、考え違いをしているようなら、補足してください。
その他の回答 (5)
- taisuke555
- ベストアンサー率55% (132/236)
たびたび、すいません。 #5の最後の方は悪いように取らないで下さい。 私としては、処理内容だけ書いて、どうすればよいでしょうか? という質問よりも好感をもっています。 ただ、人のプログラムを解析するのは、大変だという事も頭に入れて欲しいという事です。 文章を作るのが苦手なので、不快に思われたらすみません。
お礼
>私としては、処理内容だけ書いて、どうすればよいでしょうか? という質問よりも好感をもっています。 そういっていただけて嬉しいです。 >ただ、人のプログラムを解析するのは、大変だという事も頭に入れて欲しいという事です。 その通りですよね。 私だって人のプログラム読むの好きじゃないし。 (自分がかいたのだって時間がたてば読むのイヤなくらいですから) それなのに回答くださってありがとうございました。
- ki-aaa
- ベストアンサー率49% (105/213)
変数を明示的に宣言して 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をどう処理して良いか、迷っているみたいだから。
お礼
回答ありがとうございます。 言われてきづきました。 そうですよね、「0.5」ですよね。 ここが原因だったんですね。 ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
私は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列の郵便番号だけの 例にしています。
お礼
回答ありがとうございます。 ちょっと自分とは違った視点でみられていて 参考になりました。 今後参考にさせていただきます。 ありがとうございました。
- taisuke555
- ベストアンサー率55% (132/236)
このプログラムを[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 確認してみてください。
お礼
回答ありがとうございます。 普段変数を宣言?する時にwithとかは使わないんですが、 使ったほうがいいんですか? 今後参考にさせていただきます。 ありがとうございました。
- yomo3
- ベストアンサー率32% (88/269)
こんばんは。 全部解析したわけではありませんが、 とりあえず、KotaeとAmariをIntegerで宣言したらどうでしょう。 具体的に数値を入れて見るとわかる気がしますが、まだそこまでやってません。
お礼
週末が入ってしまい、回答が遅れてしまいました。 すいません。 質問のコードには書き切れなかったので(文字数の制限で)省いてしまいましたが、 実際はIntegerで宣言はしてあります。 回答ありがとうございました。
お礼
回答ありがとうございます。 Intを使って無事完成させることができました。 ありがとうございます。 >KODAMARさんが考えている処理にならないプログラムを提示されて、よろしくお願いしますと言われても 回答者も難しいと思います。 そうですね。すいませんでした。 >もし、考え違いをしているようなら、補足してください。 いえ、ちゃんと的を得た回答になっていました。 言葉足らずの説明でわかっていただきありがとうございました。