質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

4294閲覧

VBAを使用して1枚の用紙に2名分の得点表を印刷したい

BiigBlueSea

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2016/08/31 01:26

###前提・実現したいこと
ここに質問したいことを詳細に書いてください
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

###発生している問題・

イメージ説明

試験結果の得点表を作成しています。 A4用紙1枚の左右に2名分の得点表を印刷する設定です。 得点入力シート(添付画像左側)のA列の学生番号に基いて、氏名と各教科の得点を得点表印刷シート(添付画像右側)へ転記したいのですが、このとき得点表印刷シートの左側と右側へ1名ごとに交互に転記する(Aさん左側→Bさん右側→Cさん左側…)ためのコードを教えて下さい。 ※得点入力シートの一覧表はテーブルに変換します。 ※得点表印刷シート1行目の学生番号は印刷範囲に含めません。印刷範囲は(添付画像上では)、I2:M9 です。

###該当のソースコード

ここにご自身が実行したソースコードを書いてください

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

交互に繰り返し処理するような流れは、カウンタに対する偶数/奇数の判定で行うことが多いです。

今回のケースも、何人目かのカウントを数えておき、n人目のnが偶数か奇数かの判断で出力列を変更してあげればいいと思います。

偶数/奇数の判定方法ですが、
・n/2の値と、少数部を切り捨てたInt(n/2)の値が同じなら偶数と判断
・2で割った余りが0なら偶数、1なら奇数という判断
のようにいくつか方法あります。

以下サンプルです。

Dim rng as Range '読込セル Dim shtRead as Sheet '読込シート Dim shtWrite as Sheet '出力シート Set shtRead = Sheets("得点入力シート") '読込シートを設定 Set shtWrite = Sheets("得点表印刷シート") '出力シートを設定 Dim iCnt as Integer '読込件数カウンタ Dim iWriteCol as Integer '出力基準列 'カウンタ初期化 iCnt = 0 'A4~A9の範囲をループ処理 For Each rng In shtRead.Range("A4:A9") 'カウンタをインクリメント iCnt = iCnt + 1 'カウンタの偶数/奇数を判断 'If (iCnt / 2) <> Int(iCnt / 2) Then '判定方法① Int型で整数にした値と同じかどうかで判断(同じ:偶数 異なる:奇数) If (iCnt Mod 2) = 1 Then '判定方法② 2で割った余りで判断(余り0:偶数 余り1:奇数) '奇数の場合:I列 iWriteCol = 9 Else '奇数の場合:L列 iWriteCol = 12 End If '読込セルの行から各列の値を取得し、出力シートに転記する shtWrite.Cells(1 , iWriteCol + 1) = shtRead.Cells(rng.Row, 1).Value '学生番号 shtWrite.Cells(4 , iWriteCol + 0) = shtRead.Cells(rng.Row, 2).Value '名前 shtWrite.Cells(5 , iWriteCol + 1) = shtRead.Cells(rng.Row, 3).Value '国語 shtWrite.Cells(6 , iWriteCol + 1) = shtRead.Cells(rng.Row, 4).Value '算数 shtWrite.Cells(7 , iWriteCol + 1) = shtRead.Cells(rng.Row, 5).Value '英語 Next

机上で書いたコードなのでそのまま動くかはわかりませんが、参考までに。

追記

VBA初学者ということでしたので、提示したソースのポイントを解説させていただきます。


ポイント①:対象範囲をループ処理

For Each rng In shtRead.Range("A4:A9") ~ Next

の部分で読込シートのA4~A9の範囲をループ処理しています。
これによりrng変数には、
1週目:A4セル
2週目:A5セル
・・・
6週目:A9セル
という具合に、範囲内のセルが1セルずつ繰り返し処理されるようになっています。


ポイント②:偶数/奇数判定
今回のコードでは、参考までに2つの判定方法を記述してあります。
(判定方法①はコメント化してあるので、実際には判定方法②で動作しています。)

判定方法①は、n/2についてInt型で整数にした値と同じかどうかで判断する方法です。

例えば3人目の場合、n/2 は 3÷2 = 1.5です。
これに対し、Int型は整数値しか持たないため、Int(1.5)は1に丸められます。
このため 1.5 ≠ Int(1.5)となります。

これが4人目の場合だと、n/2 は 4÷2 = 2.0、Int(n/2)もInt(2.0)=2となるため、
2.0 = Int(2.0)となります。

これを利用して、n/2 が Int(n/2)と同じなら偶数、異なれば奇数と判断しています。

判定方法②は、2で割った時の余りを求めて判断する方法です。

VBAには割り算の余りを返すMODという演算子が用意されています。
偶数なら2で割った余りは0、奇数なら1となることを利用して判断しています。


ポイント③:出力基準列の設定

先の偶数/奇数判断の結果によって、
・奇数なら iWriteCol = 9
・偶数なら iWriteCol = 12
を設定しています。

これはコード内のコメントにも記載したとおり、出力シートのI列、L列を指すための値ものです。

出力する際には、この基準列に対して
・学生番号:iWriteCol + 1 (奇数なら9+1 = J列、偶数なら12+1=M列に出力)
・名前  :iWriteCol + 0 (奇数なら9+0 = I列、偶数なら12+0=L列に出力)
・国語  :iWriteCol + 1 (奇数なら9+1 = J列、偶数なら12+1=M列に出力)
というように位置調整して出力しています。
※Cellsの座標指定はX,Y座標のように勘違いしやすいですが、Cells(行,列)なのでY,Xのイメージになります。

投稿2016/08/31 04:44

編集2016/09/07 07:30
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BiigBlueSea

2016/09/04 09:49

ご回答いただき有難うございました。 また返信が遅くなってしまいだいへん申し訳ありませんでした。 当方はVBA初学者なもので(初心者マークを表示し忘れてしまいました…)、ご教示いただいた方法をしっかり理解した上で試してみるのに四苦八苦しおりますが、なんとか問題を解決したいと思います。
jawa

2016/09/07 07:33

ちょっと説明が不足していたようですね。すみませんでした。 コード内にコメントを追記させていただきました。 また、コードのポイント解説も追記させていただきました。 わかりにくい長文・駄文で恐縮ですが、理解の助けになれば幸いです。 がんばってください。
BiigBlueSea

2016/09/11 10:24

ご丁寧に追記までしていただき感謝致します。 誠に有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問