• ベストアンサー

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/17068)
回答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

  • 奇数・偶数の判断 VBA

    Sub Macro1() Dim i As Long i = 1 For i = 1 To 10 If i = ? Then '偶数ならと言うコード MsgBox "偶数です" Else MsgBox "奇数です" End If Next End Sub ここまでは自分で作れたのですが、iが奇数か偶数かを判断するコードがわかりません。 ご教授よろしくお願いします。

  • Excel・VBAのコード教えてください。

    1シートに12ずつあるまとまりを印刷したくて下記のようなものを作成しました。 Worksheets("Sheet1").Select Last = Cells(1).CurrentRegion.Rows.Count Warizan = Abs(Last / 12)    ←12個以上の場合2、3…以下は1となる。 Kaisuu = Left(Warizan, 1) For r = 1 To Kaisuu      ←回数分繰り返す For i = 2 To Last      ←シート1に書かれたデータの最終行まで。 Worksheets("Sheet1").Select Company = Cells(i, 1) Yuubin = Cells(i, 2) Address = Cells(i, 3) Worksheets("Sheet2").Select Select Case i Case (Kaisuu * 12) - 10 Range("D4") = Yuubin Case (Kaisuu * 12) - 9 Range("AF4") = Yuubin        : Case (Kaisuu * 12) - 1 Range("AF45") = Yuubin Case (Kaisuu * 12) Range("D56") = Yuubin Case (Kaisuu * 12) + 1 Range("AF56") = Yuubin End Select Next ActiveWindow.SelectedSheets.PrintPreview Next とした時に、最終ページが2回、もしくは3回…と表示されてしまいます。 例えばデータが25個あったとして、1ページ目(12個分)が終ったらプレビュー、残りの2ページ目(1個分)を表示、としたいのです。 よろしくお願いします。

  • エクセルVBAで、分岐がうまくできません。

    A,B,,Cのりんごとみかんの3種類の仕入れパターンがあり仕入の数量を算出したいですが、適正値が算出されません。 どのようにしたら、適正値を算出できるにのか教えてください。 Sub test() Dim i As Integer 'A リンゴは、500以下になったら1000個になるように仕入 'A みかんは、500以下になったら1000個になるように仕入 'A みかんまたはりんごの片方が500以下になったらみかんとりんごを1000個になるように仕入 i = 2 Do While Worksheets("sheet1").Cells(i, 1) <> "" If Cells(i, 1) = "A" And Cells(i, 2) <= 500 Or Cells(i, 3) <= 500 Then Worksheets("sheet1").Cells(i, 4) = 1000 - Cells(i, 2) Worksheets("sheet1").Cells(i, 5) = 1000 - Cells(i, 3) 'End If 'i = i + 1 'Loop 'B リンゴは、400以下になったら2000個になるように仕入 'B みかんは、400以下になったら2000個になるように仕入 'A みかんまたはりんごの片方が400以下になったらみかんとりんごを2000個になるように仕入 i = 2 'Do While Worksheets("sheet1").Cells(i, 1) <> "" ElseIf Cells(i, 1) = "B" And Cells(i, 2) <= 400 Or Cells(i, 3) <= 400 Then Worksheets("sheet1").Cells(i, 4) = 2000 - Cells(i, 2) Worksheets("sheet1").Cells(i, 5) = 2000 - Cells(i, 3) 'End If 'i = i + 1 'Loop ''C リンゴは、300以下になったら3000個になるように仕入 ''C みかんは、300以下になったら3000個になるように仕入 'A みかんまたはりんごの片方が300以下になったらみかんとりんごを3000個になるように仕入 i = 2 'Do While Worksheets("sheet1").Cells(i, 1) <> "" ElseIf Cells(i, 1) = "C" And Cells(i, 2) <= 300 Or Cells(i, 3) <= 300 Then Worksheets("sheet1").Cells(i, 4) = 3000 - Cells(i, 2) Worksheets("sheet1").Cells(i, 5) = 3000 - Cells(i, 3) End If i = i + 1 Loop End Sub

  • vba ;制御

    下記でhakkenn = 1 '******** のところから次は next iの直前にいくようにプログラムをランさせるにはどう記述すればよいか。 よろしくお願いします。 For i = 3 To d hakken = 0 For ui = CELL_S To (CELL_E - CELL_S + 1) If Worksheets("sheet2").Cells(i, "D") = Worksheets("user").Cells(ui, "A") Then Worksheets("user").Cells(ui, ichi) = "◎" hakkenn = 1 '******** Else End If Next ui If hakkenn = 1 Then Else Worksheets("user2").Cells(ui, "D") = Worksheets("sheet2").Cells(i, "D") End If Next i

  • Excel VBA グラフ作成のときのエラー

    VBA初心者です。Excel2003を使っています。 Sheet1に作りたいグラフがあります。 データは下記のとおりです。 ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A")のところで、「実行時エラー13 型が一致しません」とエラーがでます。 不思議なのは、昨日は動いていたのです。 なぜ、エラーが出るようになったのかわかりません。 ご教授よろしくお願いします。 A B 1 a 1 2 2 3 3 4 4 5 5 6 b 6 7 7 8 8 9 9 10 10 11 c 11 12 12 13 13 14 14 15 15 Sub test() Wrow = Worksheets("sheet1").Cells(Rows.Count, "A").End(xlUp).Row For i = 1 To Wrow If Worksheets("sheet1").Cells(i, "A").Value = "a" Then a_data = Worksheets("sheet1").Cells(i, "A").Row ElseIf Worksheets("sheet1").Cells(i, "A").Value = "b" Then b_data = Worksheets("sheet1").Cells(i, "A").Row ElseIf Worksheets("sheet1").Cells(i, "A").Value = "c" Then c_data = Worksheets("sheet1").Cells(i, "A").Row ElseIf Worksheets("sheet1").Cells(i, "A").Value = "d" Then d_data = Worksheets("sheet1").Cells(i, "A").Row End If Next Sheets("sheet1").Select Range(Cells(a_data, "B"), Cells(b_data, "B")).Select ActiveSheet.ChartObjects.Add(30, 10, 500, 200).Select ActiveChart.ChartType = xlLineMarkers ActiveChart.SetSourceData Source:=Sheets("sheet1").Range(Cells(a_data, "B"), Cells(b_data - 1, "B")), PlotBy:=xlColumns ActiveChart.Location where:=xlLocationAsObject, Name:="sheet1" Sheets("sheet1").Select ActiveChart.Axes(xlCategory, xlPrimary).CategoryType = xlAutomatic ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A") ←エラーがでます。 ActiveChart.SeriesCollection(2).Values = Range(Cells(b_data, "B"), Cells(c_data, "B")) ActiveChart.SeriesCollection(2).Name = Cells(b_data, "A") ActiveChart.SeriesCollection(3).Values = Range(Cells(c_data, "B"), Cells(d_data, "B")) ActiveChart.SeriesCollection(2).Name = Cells(c_data, "A") End Sub

  • ExcelのVBAでシート選択・最終行取得がうまくいかない。

    シートA・Bがあり、シートAの変数markが★だったら、シートBへいき、最終行を取得、ということをしたくて以下のようなコードをかきました。 Worksheets("A").Select Last3 = Cells(6).CurrentRegion.Rows.Count Worksheets("B").Select Last1 = Cells(6).CurrentRegion.Rows.Count For w = 1 To Last1 Worksheets("B").Select Mark = Cells(w, 26) If Mark = "★" Then Sheets("A").Select Last3 = Cells(6).CurrentRegion.Rows.Count MsgBox Last3 End If Next ですが、シートAの最終行が表示されます。 どこがちがうのでしょうか?

  • IF 分岐処理がうまくできません

    エクセルVBAで、分岐がうまくできません。 A、B,Cのリンゴとみかんの3種類の仕入れパターンがあり仕入の数量を算出したいですが、適正値が算出されません。 どのようにしたら、適正値を算出できるにのか教えてください。 Sub 仕入計算() Dim i As Integer 'A リンゴは、500以下になったら1000個になるように仕入 'A みかんは、500以下になったら1000個になるように仕入 i = 2 Do While Worksheets("sheet1").Cells(i, 1) <> "" If Cells(i, 1) = "A" And Cells(i, 2) <= 500 Or Cells(i, 3) <= 500 Then Worksheets("sheet1").Cells(i, 4) = 1000 - Cells(i, 2) Worksheets("sheet1").Cells(i, 5) = 1000 - Cells(i, 3) End If i = i + 1 Loop 'B リンゴは、400以下になったら2000個になるように仕入 'B みかんは、400以下になったら2000個になるように仕入 i = 2 Do While Worksheets("sheet1").Cells(i, 1) <> "" If Cells(i, 1) = "B" And Cells(i, 2) <= 400 Or Cells(i, 3) <= 400 Then Worksheets("sheet1").Cells(i, 4) = 2000 - Cells(i, 2) Worksheets("sheet1").Cells(i, 5) = 2000 - Cells(i, 3) End If i = i + 1 Loop 'C リンゴは、300以下になったら3000個になるように仕入 'C みかんは、300以下になったら3000個になるように仕入 i = 2 Do While Worksheets("sheet1").Cells(i, 1) <> "" If Cells(i, 1) = "C" And Cells(i, 2) <= 300 Or Cells(i, 3) <= 300 Then Worksheets("sheet1").Cells(i, 4) = 3000 - Cells(i, 2) Worksheets("sheet1").Cells(i, 5) = 3000 - Cells(i, 3) End If i = i + 1 Loop End Sub 結果は以下になってしまいます。 id  りんご みかん りんご仕入 みかん仕入 A 500 700   500 300 A 400 600 600 400 A 300 500 700 500 A 300 400 1700 1600 A 200 300 2800 2700 A 100 200 2900 2800 B 500 400 1500 1600 B 400 600 1600 1400 B 340 500 1660 1500 B 260 400 1740 1600 B 180 300 2820 2700 B 100 200 2900 2800 C 200 700 2800 2300 C 500 200 2500 2800 C 300 500 2700 2500 C 200 400 2800 2600 C 100 300 2900 2700 C 100 200 2900 2800 Cは、適正値ですが、A,Bの1部の計算ができません。

  • Excel VBA .xlsm→.xls変換

    VBAマクロの初心者です。 Office2010で作ったプログラムをOffice2000で実行したいのですが、 *.xlsmなら問題なく実行できるプログラムが、*.xlsでは 「エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。」となります。作ったプログラムの詳細は以下の通りです。 *.xlsmで実行した際も、繰り返しが多いせいかどうも遅いので、効率化できる方法がありましたら、併せてご教授いただけると幸いです。 よろしくお願いいたします。 目的:Sheet1にある表AをSheet2にある表Bに変換する。(添付画像参照)    ※年月と国名は、あらかじめSheet2に入力してあります。     また、空白にゼロを入れる作業は省いています。 以下、実行したプログラムです。 Sub paste() Dim name11 Dim name12 Dim name13 Dim name21 Dim name22 Dim name2k For i = 2 To 150 'Sheet1の行はiで定義し、2行目から150行目まで繰り返し For j = 2 To 300 'Sheet2の行はjで定義し、2行目から300行目まで繰り返し name11 = Worksheets("Sheet1").Cells(i, 1).Value 'Sheet1の"年" name12 = Worksheets("Sheet1").Cells(i, 2).Value 'Sheet1の"月" name13 = Worksheets("Sheet1").Cells(i, 3).Value 'Sheet1の"国名" name21 = Worksheets("Sheet2").Cells(j, 1).Value 'Sheet2の"年" name22 = Worksheets("Sheet2").Cells(j, 2).Value 'Sheet2の"月" For k = 3 To 100 'Sheet2の列はkで定義し、3列目から100列目まで繰り返し name2k = Worksheets("Sheet2").Cells(1, k).Value 'Sheet2の1行目(国名)※*.xlsで実行し、デバッグすると、この行がエラー1004になります。 If (name11 = name21 And name12 = name22 And name13 = name2k) Then '年と月が一致し、かつSheet1の3列目(国名)とSheet2の1行目(国名)が一致したら Worksheets("Sheet1").Cells(i, 4).Copy Destination:=Worksheets("Sheet2").Cells(j, k) 'Sheet1のi行4列目の"量"を、Sheet2のj行k列に貼り付ける。 '(j行は正しい年月の横、k列は正しい国名の下。) Exit For '検索→貼り付けのループを抜けて最初に戻る。 End If Next Next Next End Sub

  • VBAでの説明がわかりません

    以下のコードは、都道府県ごとに1枚のデータシートを作成する処理なんですが、コードが1行づつどんな作業を意味しているのかがわかりません。1行ごとにどのような処理をしているのかの説明をよろしくお願いします。長文で申し訳ありません。 Sub まとめ() Dim i As Integer 'カウンタ変数iの宣言 Dim n As Integer  Dim MyS1 As Worksheet 'ワークシート型オブジェクトMyS1を宣言 Dim MyC As Worksheet Worksheets.Add before:=Worksheets("全国") ActiveSheet.Name = "data" Set MyS1= Worksheets("data") With Worksheets("全国") MyS1. Range(MyS1.Cells(1,1),MyS1.Cells(11,12))=.Range(Cells(1,1),.Cells(11,12)).Value End With i=12 For Each MyC In Worksheets If MyC.Name<> "data" Then n = 12 MyS1.Cells(i,1)=MyC.Name i=i+1 Do While MyC.Cells(n,2).Value<>"" MyS1.Range(MyS1.Cells(i,1),MyS1.Cells(i,12))=MyC.Range(MyC.Cells(n,1),Mc.Cells(n,12)).Value i=i+1 n=n+1 Loop End If Next Myc End Sub

  • EXCEL VBA 取得したセルの列の最終行

    お客さんからいただいたEXCELフォーマットに沿って、集計ツールを作成していますが 下記でつまってしまいました。 Wb.Worksheets("Sheet1").Cells.Find("実施日").Select Sel_Col = Selection.Column Last_Row = Wb.Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row ※1 For i = Last_Row To 2 Step -1 If Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Value = Day Then ※2 If Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "A" Then A_count = A_count + 1 ElseIf Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "B" Then B_count = B_count + 1 ElseIf Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "C" Then C_count = C_count + 1 End If Else End If Next i まず※1の箇所ですが、Sheet1の実施日と入力されているセルの列番号を取得して その列の最終行を取得したいのですが、上記作成したものですと入力されている列全部の 中での最終行が取得されてしまいます。 この場合、Sel_Col をどのように使えばよろしいでしょうか? 次に※2ですが、※1で取得した列の最終行から1つずつ上に上がりながら 日付が今日であれば、そのセルから5つ左のセルのA、B、Cいずれかを カウントするという造りにしたいと思っています。 実行すると1004エラーでアプリケーション定義、オブジェクト定義のエラーと 出てしまいます。 Wbはset Wbとして開いたブックを定義しています。 DayはDay = Dateで今日の日付を取得しています。 独学で無茶苦茶なコードですが、 どなたか詳しい方、ご教示お願いいたします。

専門家に質問してみよう