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

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

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

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

Q&A

解決済

3回答

1513閲覧

VBA エクセル

cat_junko

総合スコア44

VBA

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

0グッド

0クリップ

投稿2016/06/14 08:27

編集2016/06/14 08:56

いつもお世話になっていおります。
うまく動かないのでご教示ねがいます。
確認用転記シート↓
イメージ説明
入力用シート↓
イメージ説明

入力シートの内容を、確認用転記シートに転記していきたいと思ってます。

Sub 台帳転記() Dim gyod Dim gyoi Dim hir Dim hig Dim retu hir = 3 gyoi = 5 retu = 2 For gyod = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Worksheets("確認用").Cells(2, hir) = Worksheets("入力").Cells(gyod, 1) Then Worksheets("確認用").Cells(gyoi, hir - 1) = Worksheets("入力").Cells(gyod, 3) Worksheets("確認用").Cells(gyoi, hir) = Worksheets("入力").Cells(gyod, 4) gyoi = gyoi + 1 Else hir = hir + 2 gyoi = 5 End If Next End Sub

実行すると下記のようになります。
イメージ説明

5/10は、12件あるのに11件までの転記で終わってしまってます。
5/11は、20件あるのに19件で止まっていいます。
全て件数-1で止まっているようです。
何が、違うのでしょうか?
宜しくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

①入力シートの最後のセルまで処理されない問題

これは、最初に表示しているシートの問題ではないでしょうか?
ループカウンタに使用している

Cells(Rows.Count, 1).End(xlUp).Row

の部分は、アクティブシートが対象になっていると思います。
確認用シートがアクティブな状態でマクロを実行すると、40行目程度までしか処理されないと思います。
ここは明示的に

Worksheets("入力").Cells(Rows.Count, 1).End(xlUp).Row

としてあげたほうがよいでしょう。

②日付が変わった時に列移動しかしていない

他の方からも指摘があるように、日付けが変わった時にデータを書かずに読み取り行を次に進めてしまっています。
ループ内でループ変数の値を変更するのはバグや無限ループのもとになるので、行を戻してあげるよりもデータを書いてしまった方がよいでしょう。

以上を踏まえたソースコードです。

Sub 台帳転記() Dim gyod Dim gyoi Dim hir Dim hig Dim retu hir = 3 gyoi = 5 retu = 2 For gyod = 2 To Worksheets("入力").Cells(Rows.Count, 1).End(xlUp).Row If Worksheets("確認用").Cells(2, hir) <> Worksheets("入力").Cells(gyod, 1) Then hir = hir + 2 gyoi = 5 End If Worksheets("確認用").Cells(gyoi, hir - 1) = Worksheets("入力").Cells(gyod, 3) Worksheets("確認用").Cells(gyoi, hir) = Worksheets("入力").Cells(gyod, 4) gyoi = gyoi + 1 Next End Sub

結果的に「日付が違っていたら出力位置を2列移動して5行目に戻す」という判定に変更しています。

追加修正

上記のコードでは入力シートの日付の並びと出力シートの日付の並びが一緒でない場合(日付けが飛んだりしている場合)に、関係ない日付の列にデータを出力してしまうケースが存在しました。

そのようなデータが想定される場合は、出力シートで正しい日付の列を見つけるまでループしてあげる必要があります。

Sub 台帳転記() Dim gyod Dim gyoi Dim hir Dim hig Dim retu hir = 3 gyoi = 5 retu = 2 For gyod = 2 To Worksheets("入力").Cells(Rows.Count, 1).End(xlUp).Row Do If Worksheets("確認用").Cells(2, hir) = Worksheets("入力").Cells(gyod, 1) Then '日付けが一致した場合はDoループを抜ける Exit Do Else '日付けが一致しない場合は出力位置を変更 hir = hir + 2 gyoi = 5 End If '確認用シートの日付が""の列になるまでに一致する日付けが見つからなかったら処理終了 If Worksheets("確認用").Cells(2, hir) = "" Then Exit Sub Loop Worksheets("確認用").Cells(gyoi, hir - 1) = Worksheets("入力").Cells(gyod, 3) Worksheets("確認用").Cells(gyoi, hir) = Worksheets("入力").Cells(gyod, 4) gyoi = gyoi + 1 Next End Sub

投稿2016/06/14 10:11

編集2016/06/14 10:37
jawa

総合スコア3013

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

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

0

問題の1つは行のカウントにあります
gyodという変数で入力行を移動していますが、If Worksheets("確認用").Cells(2, hir) = Worksheets("入力").Cells(gyod, 1) Thenelseの処理に入った時も1行進んでいます
そのためにそれぞれの日で1件少なく処理されていますね

5/11 は20件あるのに9件で止まる
実際のデータは5/30まであるのに5/11以降は転記されずに止まる

これらはわかりません
入力データか、それぞれのシートのセルになにか問題があるのかも?

投稿2016/06/14 08:57

takito

総合スコア3111

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

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

cat_junko

2016/06/14 09:11

ほんとですね! else の処理に、「gyod=gyo-1」を追記したら動きました。 が、今度は、確認用シートで終わりを指定していないからなのかデバッグエラーが でます。 処理は、うまくいっているようなのですが。
takito

2016/06/14 09:28 編集

そうですね、今のままだと「日付が入力用にあって確認用に無い」場合にループから抜けるタイミングが無いため、hir が延々と+2されて列の上限(16384)を超えてしまいます ・日付行が空欄だったら終わりにする ・日付行の最終列を取得して`hir`がそれを越えたら終わりにする などの方法で終わりを決めてあげるとよさそうです
guest

0

勘ですが「入力用シート」の日付が、日付形式になっていないのではないでしょうか(文字列になっている)
例えば5/10の1行目のデータは飛ばされて処理されているので、セルの書式設定を見てみてください。
表示形式が「日付」になっていますか?

投稿2016/06/14 08:54

ttyp03

総合スコア16998

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

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

cat_junko

2016/06/14 09:01

早々の回答ありがとうございます。 確認してみましたが、日付形式になっていました。 全部、1行目が飛ばされているのかもしれませんね・・・。
ttyp03

2016/06/14 09:12

1行目が飛ばされているのはtakikoさんの回答の通りですね。 なので5/10の1行目の件は忘れてください。 他のデータで飛ばされているところのセルの書式設定を見てみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問