Sub dataget_fin_fin()
Dim moto
Dim saki
Dim foldername
Dim filename
Dim busho
Dim shinkinyu
Dim shinkishu
Dim mitsukatta
shinkinyu = 52
shinkishu = 42
For busho = 2 To 10
foldername = Workbooks("コピー全部1つ.xls").Worksheets("部署情報").Range("F" & busho).Value
filename = Workbooks("コピー全部1つ.xls").Worksheets("部署情報").Range("G" & busho).Value
Workbooks.Open filename:="C:\Users\PCUser\Documents\ガラパゴス\ad映像16\" & foldername & "\" & filename
For moto = 2 To 51
mitsukatta = False
If Workbooks(filename).Worksheets("歳入").Range("A" & moto).Value <> " " Then
For saki = 2 To 51
If Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("A" & saki).Value = Workbooks(filename).Worksheets("歳入").Range("A" & moto).Value Then
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("E" & saki).Value = Workbooks(filename).Worksheets("歳入").Range("E" & moto).Value
mitsukatta = True
Exit For
Else
End If
Next
Else
Exit For
End If
If mitsukatta = False Then
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("A" & shinkinyu).Value = Workbooks(filename).Worksheets("歳入").Range("A" & moto).Value '24.falseだったら、新しく行を追加して記入する。以下同じ
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("B" & shinkinyu).Value = Workbooks(filename).Worksheets("歳入").Range("B" & moto).Value '24.
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("C" & shinkinyu).Value = Workbooks(filename).Worksheets("歳入").Range("C" & moto).Value '24.
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("D" & shinkinyu).Value = Workbooks(filename).Worksheets("歳入").Range("D" & moto).Value '24.
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("E" & shinkinyu).Value = Workbooks(filename).Worksheets("歳入").Range("E" & moto).Value '24.
shinkinyu = shinkinyu + 1
End If
Next
Sub dataget_fin_fin2()
Dim moto
Dim saki
Dim foldername
Dim filename
Dim busho
Dim shinkinyu
Dim mitsukatta
shinkinyu = 52
For busho = 2 To 10
foldername = Workbooks("コピー全部1つ.xls").Worksheets("部署情報").Range("F" & busho).Value
filename = Workbooks("コピー全部1つ.xls").Worksheets("部署情報").Range("G" & busho).Value
Workbooks.Open filename:="C:\Users\PCUser\Documents\ガラパゴス\ad映像16\" & foldername & "\" & filename
For moto = 2 To 51
mitsukatta = False
If Workbooks(filename).Worksheets("歳入").Range("A" & moto).Value <> " " Then
For saki = 2 To 51
If Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("A" & saki).Value = Workbooks(filename).Worksheets("歳入").Range("A" & moto).Value Then
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("E" & saki).Value = Workbooks(filename).Worksheets("歳入").Range("E" & moto).Value
mitsukatta = True
Exit For
Else
End If
Next
Else
Exit For
End If
If mitsukatta = False Then
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("A" & shinkinyu).Value = Workbooks(filename).Worksheets("歳入").Range("A" & moto).Value
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("B" & shinkinyu).Value = Workbooks(filename).Worksheets("歳入").Range("B" & moto).Value
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("C" & shinkinyu).Value = Workbooks(filename).Worksheets("歳入").Range("C" & moto).Value
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("D" & shinkinyu).Value = Workbooks(filename).Worksheets("歳入").Range("D" & moto).Value
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("E" & shinkinyu).Value = Workbooks(filename).Worksheets("歳入").Range("E" & moto).Value
shinkinyu = shinkinyu + 1
End If
Next
Workbooks(filename).Close
Next
End Sub
受講生さんの投稿
(投稿ID: 4618)
そこで正解のcodeを確認したいのですが、プロシージャー名dataget_fin_finの正解はどちらに保存されてますでしょうか。
小川 慶一さんのコメント
(コメントID: 6387)
海外のインターネット環境が整わない環境にいます。
資料のDLをできないので、とりいそぎのお返事です。
ファイルの所在ではなく、起きている現象についてのコメントです。
> 例えば、aget.xlsの追加情報が53行目から55行目に記載されるとbget.xlsの追加情報は96行目98行目に取り込まれる
「数行」というか、かなりの間隔ですね。
この数字とファイル名は、実際にマクロを実行した結果から取得したものでしょうか。
原因はいろいろ考えられそうです。
ソースを見ないとなんとも言えませんが、以下、慣れていないとハマりがちな点など、気になるところを。
[1]
exit for がきちんと実行されず、 sinkinyu = sinkinyu + 1 が aget.xls のすべてのデータについて実行されてしまっているのでは?というのがメールを読んでの感触です。
つまり、変数 sinkinyu の値が 55 から 96 に突然変更されたわけではなく、「56行目から95行目には空白を記入している」ということです。
ということで、 exit for の箇所にブレークポイントを入れて [F5] でマクロを実行したときに exit for で動作が止まるか?そのときの変数 sinkinyu の値はいくつか?というところから僕ならチェックします。
[2]
[1]が問題ではなかったならば、 aget.xls と bget.xls の処理の間に変数 sinkinyu の値を不用意に変更してしまっている箇所がありそうです。
aget.xls での処理が終わったタイミング(すなわち、動画の10:07以降であれば最後の next のところですね)にブレークポイントを入れてまずは実行。
ブレークポイントの段階での変数 sinkinyu の値をチェックする。
それ以降は変数 sinkinyu の値を都度確認しつつ、ステップイン実行 [F8] ですね。
そこまでして分からなければソースをこのコメント欄に貼りつけて相談してください。
> お世話になります。ファイルについて確認させてください。動画の通りに自分でcodeを書いたつもりなのですが、VBAを実行しますと各ブックa,b,c,,,,それぞれのブックの追加情報が取り込めてはいるのですが、a,b,c,,,,それぞれのブックの追加情報の間に数行のスペース出来てしまっています。(例えば、aget.xlsの追加情報が53行目から55行目に記載されるとbget.xlsの追加情報は96行目98行目に取り込まれる)。
> そこで正解のcodeを確認したいのですが、プロシージャー名dataget_fin_finの正解はどちらに保存されてますでしょうか。
受講生さんのコメント
(コメントID: 6393)
小川慶一さん:
> 受講生 さん:
>
> 海外のインターネット環境が整わない環境にいます。
> 資料のDLをできないので、とりいそぎのお返事です。
>
> ファイルの所在ではなく、起きている現象についてのコメントです。
>
> > 例えば、aget.xlsの追加情報が53行目から55行目に記載されるとbget.xlsの追加情報は96行目98行目に取り込まれる
>
> 「数行」というか、かなりの間隔ですね。
> この数字とファイル名は、実際にマクロを実行した結果から取得したものでしょうか。
>
> 原因はいろいろ考えられそうです。
> ソースを見ないとなんとも言えませんが、以下、慣れていないとハマりがちな点など、気になるところを。
>
> [1]
> exit for がきちんと実行されず、 sinkinyu = sinkinyu + 1 が aget.xls のすべてのデータについて実行されてしまっているのでは?というのがメールを読んでの感触です。
> つまり、変数 sinkinyu の値が 55 から 96 に突然変更されたわけではなく、「56行目から95行目には空白を記入している」ということです。
>
> ということで、 exit for の箇所にブレークポイントを入れて [F5] でマクロを実行したときに exit for で動作が止まるか?そのときの変数 sinkinyu の値はいくつか?というところから僕ならチェックします。
>
> [2]
> [1]が問題ではなかったならば、 aget.xls と bget.xls の処理の間に変数 sinkinyu の値を不用意に変更してしまっている箇所がありそうです。
> aget.xls での処理が終わったタイミング(すなわち、動画の10:07以降であれば最後の next のところですね)にブレークポイントを入れてまずは実行。
> ブレークポイントの段階での変数 sinkinyu の値をチェックする。
> それ以降は変数 sinkinyu の値を都度確認しつつ、ステップイン実行 [F8] ですね。
>
> そこまでして分からなければソースをこのコメント欄に貼りつけて相談してください。
>
>
> > お世話になります。ファイルについて確認させてください。動画の通りに自分でcodeを書いたつもりなのですが、VBAを実行しますと各ブックa,b,c,,,,それぞれのブックの追加情報が取り込めてはいるのですが、a,b,c,,,,それぞれのブックの追加情報の間に数行のスペース出来てしまっています。(例えば、aget.xlsの追加情報が53行目から55行目に記載されるとbget.xlsの追加情報は96行目98行目に取り込まれる)。
> > そこで正解のcodeを確認したいのですが、プロシージャー名dataget_fin_finの正解はどちらに保存されてますでしょうか。
>
小川 慶一さんのコメント
(コメントID: 6394)
そうしていただけないと、正確な診断ができません。
もしも「実行可能なマクロ一式」と言われても何が言いたいのか分からないようでしたら、新しく標準モジュールを作り、そこに、ここに投稿されたマクロを試しに貼り付けてみてください。
そのマクロを実行しようとしても、エラーメッセージが出るはずです。
こういうエラーが出ない状態のプログラムを渡す必要があります。
でないと、通常、「いただいたコードでは、問題を再現することができませんでした」という回答だけしかできません。
少なくとも2行追加が必要です。
というか、元のコードから取ってくるべき行が少なくともあと2行はあります。
それから、インデントも揃えましょう。
If mitsukatta = False Then
End If
の中身は、もう一段右にあるべきです。
「ブレークポイント」を使ってのデバッグでは問題発見はスキル的に難しいご様子ですので...。
もうちょっと細かく指示しますね。
上記のコード整形を行ったうえで、そのコードを先頭からステップイン実行で1行ずつ実行しつつ、以下の問いについて調べ、結果をお知らせください。
その際には、コードも再投稿してください。
[a] shinkinyu の値が 52になるのは、どの行が実行されたときですか。
[b] shinkinyu の値が 52からから変わった直後の、以下の変数の値を調べ、それぞれの変数の横に書き出しなさい。
変数 busho
変数 moto
変数 saki
変数 foldername
変数 filename
[c] shinkinyu の値が問い[b]の段階から変わった直後の、以下の変数の値を調べ、それぞれの変数の横に書き出しなさい。
変数 busho
変数 moto
変数 saki
変数 foldername
変数 filename
[d] shinkinyu の値が問い[c]の段階から変わった直後の、以下の変数の値を調べ、それぞれの変数の横に書き出しなさい。
変数 busho
変数 moto
変数 saki
変数 foldername
変数 filename
[e] shinkinyu の値が問い[d]の段階から変わった直後の、以下の変数の値を調べ、それぞれの変数の横に書き出しなさい。
変数 busho
変数 moto
変数 saki
変数 foldername
変数 filename
[f] shinkinyu の値が問い[e]の段階から変わった直後の、以下の変数の値を調べ、それぞれの変数の横に書き出しなさい。
変数 busho
変数 moto
変数 saki
変数 foldername
変数 filename
... 以下、変数 sinkinyu の値が55より大きい値になるまで同様にくり返す。
もしも[b]以降の問いで指示された調査を行う方法が分からない場合はその旨お知らせください。
受講生さんのコメント
(コメントID: 6395)
[a] shinkinyu の値が 52になるのは、どの行が実行されたときですか。 (回答)Shinkinyuが52になるのは、このプロシージャを開始直後に、shinkinyu=52を実行した時です。
[b] shinkinyu の値が 52からから変わった直後の、以下の変数の値を調べ、それぞれの変数の横に書き出しなさい。
(回答 shikinyu=53となった直後)
変数 busho 2
変数 moto 8
変数 saki 52
変数 foldername 記入済ファイル置き場a
変数 filename aget.xls
[c] shinkinyu の値が問い[b]の段階から変わった直後の、以下の変数の値を調べ、それぞれの変数の横に書き出しなさい。
(回答shinkinyu=54となった直後)
変数 busho 2
変数 moto 9
変数 saki 52
変数 foldername 記入済ファイル置き場a
変数 filename aget.xls
[d] shinkinyu の値が問い[c]の段階から変わった直後の、以下の変数の値を調べ、それぞれの変数の横に書き出しなさい。
(回答shinkinyu=55となった直後)
変数 busho 2
変数 moto 10
変数 saki 52
変数 foldername 記入済ファイル置き場a
変数 filename aget.xls
[e] shinkinyu の値が問い[d]の段階から変わった直後の、以下の変数の値を調べ、それぞれの変数の横に書き出しなさい。
(回答shinkinyu=56となった直後)
変数 busho 2
変数 moto 11
変数 saki 52
変数 foldername 記入済ファイル置き場a
変数 filename aget.xls
Sub dataget_fin_fin()
Dim moto
Dim saki
Dim foldername
Dim filename
Dim busho
Dim shinkinyu
Dim shinkishu
Dim mitsukatta
shinkinyu = 52
shinkishu = 42
For busho = 2 To 10
foldername = Workbooks("コピー全部1つ.xls").Worksheets("部署情報").Range("F" & busho).Value
filename = Workbooks("コピー全部1つ.xls").Worksheets("部署情報").Range("G" & busho).Value
Workbooks.Open filename:="C:\Users\PCUser\Documents\ガラパゴス\ad映像16\" & foldername & "\" & filename
For moto = 2 To 51
mitsukatta = False
If Workbooks(filename).Worksheets("歳入").Range("A" & moto).Value <> " " Then
For saki = 2 To 51 '7.
If Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("A" & saki).Value = Workbooks(filename).Worksheets("歳入").Range("A" & moto).Value Then
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("E" & saki).Value = Workbooks(filename).Worksheets("歳入").Range("E" & moto).Value
mitsukatta = True
Exit For
Else
End If
Next
Else
Exit For
End If
If mitsukatta = False Then
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("A" & shinkinyu).Value = Workbooks(filename).Worksheets("歳入").Range("A" & moto).Value
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("B" & shinkinyu).Value = Workbooks(filename).Worksheets("歳入").Range("B" & moto).Value
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("C" & shinkinyu).Value = Workbooks(filename).Worksheets("歳入").Range("C" & moto).Value
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("D" & shinkinyu).Value = Workbooks(filename).Worksheets("歳入").Range("D" & moto).Value
Workbooks("コピー全部1つ.xls").Worksheets("歳入").Range("E" & shinkinyu).Value = Workbooks(filename).Worksheets("歳入").Range("E" & moto).Value
shinkinyu = shinkinyu + 1
End If
Next
For moto = 2 To 41
mitsukatta = False
If Workbooks(filename).Worksheets("歳出").Range("A" & moto).Value <> " " Then
For saki = 2 To 41
If Workbooks("コピー全部1つ.xls").Worksheets("歳出").Range("A" & saki).Value = Workbooks(filename).Worksheets("歳出").Range("A" & moto).Value Then
Workbooks("コピー全部1つ.xls").Worksheets("歳出").Range("E" & saki).Value = Workbooks(filename).Worksheets("歳出").Range("E" & moto).Value
mitsukatta = True '27.
Exit For
Else
End If
Next
Else
Exit For
End If
If mitsukatta = False Then
Workbooks("コピー全部1つ.xls").Worksheets("歳出").Range("A" & shinkishu).Value = Workbooks(filename).Worksheets("歳出").Range("A" & moto).Value
Workbooks("コピー全部1つ.xls").Worksheets("歳出").Range("B" & shinkishu).Value = Workbooks(filename).Worksheets("歳出").Range("B" & moto).Value
Workbooks("コピー全部1つ.xls").Worksheets("歳出").Range("C" & shinkishu).Value = Workbooks(filename).Worksheets("歳出").Range("C" & moto).Value
Workbooks("コピー全部1つ.xls").Worksheets("歳出").Range("D" & shinkishu).Value = Workbooks(filename).Worksheets("歳出").Range("D" & moto).Value
Workbooks("コピー全部1つ.xls").Worksheets("歳出").Range("E" & shinkishu).Value = Workbooks(filename).Worksheets("歳出").Range("E" & moto).Value
shinkishu = shinkishu + 1
End If
Next
Workbooks(filename).Close
Next
End Sub
小川慶一さん:
> 質問の際は、実行可能なマクロ一式をお送りください。
> そうしていただけないと、正確な診断ができません。
>
> もしも「実行可能なマクロ一式」と言われても何が言いたいのか分からないようでしたら、新しく標準モジュールを作り、そこに、ここに投稿されたマクロを試しに貼り付けてみてください。
> そのマクロを実行しようとしても、エラーメッセージが出るはずです。
> こういうエラーが出ない状態のプログラムを渡す必要があります。
>
> でないと、通常、「いただいたコードでは、問題を再現することができませんでした」という回答だけしかできません。
>
> 少なくとも2行追加が必要です。
> というか、元のコードから取ってくるべき行が少なくともあと2行はあります。
>
> それから、インデントも揃えましょう。
> If mitsukatta = False Then
> End If
>
> の中身は、もう一段右にあるべきです。
>
>
> 「ブレークポイント」を使ってのデバッグでは問題発見はスキル的に難しいご様子ですので...。
> もうちょっと細かく指示しますね。
>
> 上記のコード整形を行ったうえで、そのコードを先頭からステップイン実行で1行ずつ実行しつつ、以下の問いについて調べ、結果をお知らせください。
> その際には、コードも再投稿してください。
>
> [a] shinkinyu の値が 52になるのは、どの行が実行されたときですか。
>
> [b] shinkinyu の値が 52からから変わった直後の、以下の変数の値を調べ、それぞれの変数の横に書き出しなさい。
> 変数 busho
> 変数 moto
> 変数 saki
> 変数 foldername
> 変数 filename
>
> [c] shinkinyu の値が問い[b]の段階から変わった直後の、以下の変数の値を調べ、それぞれの変数の横に書き出しなさい。
> 変数 busho
> 変数 moto
> 変数 saki
> 変数 foldername
> 変数 filename
>
> [d] shinkinyu の値が問い[c]の段階から変わった直後の、以下の変数の値を調べ、それぞれの変数の横に書き出しなさい。
> 変数 busho
> 変数 moto
> 変数 saki
> 変数 foldername
> 変数 filename
>
> [e] shinkinyu の値が問い[d]の段階から変わった直後の、以下の変数の値を調べ、それぞれの変数の横に書き出しなさい。
> 変数 busho
> 変数 moto
> 変数 saki
> 変数 foldername
> 変数 filename
>
> [f] shinkinyu の値が問い[e]の段階から変わった直後の、以下の変数の値を調べ、それぞれの変数の横に書き出しなさい。
> 変数 busho
> 変数 moto
> 変数 saki
> 変数 foldername
> 変数 filename
>
> ... 以下、変数 sinkinyu の値が55より大きい値になるまで同様にくり返す。
>
> もしも[b]以降の問いで指示された調査を行う方法が分からない場合はその旨お知らせください。
>
小川 慶一さんのコメント
(コメントID: 6396)
結論だけ書くと、比較演算のところでひっかかっていました。
" "だと、比較対象は「半角スペースひとつ」です。
"" だと、比較対象は「長さ0の文字列」、すなわちブランクとなります。
今後も、コードを送付されるときは、問題を再現できる、実行可能なもの送られるようにしてください。
そのほうが解決にかかる手間も時間も減らせます。
さらに言うと、次のステップは、「問題の再現可能な最低限のコードを作って送る」ということです。
たとえば、以下でもよいですね。「歳出」にかかる部分を変数宣言含めてすべて削りました。
こういうのは、「無関係な部分を削り、動作確認」ということをくりかえしていき、作ります。
というより、こういうことをしていると自分で問題を発見できます。
僕自身も、自分が書いてるプログラムがどうしても不可解な動作をしてしまうというときにはこういう対処法で問題を探します。問題解決のテクニックのひとつとして、おすすめです。
受講生さんのコメント
(コメントID: 6401)
お世話になります。ご回答ありがとうございました。見つけていただきました間違いは、全く考えの及ばない箇所でした。空白を見つけるという目的から、 "と"の間に空白を作っていました。
またcode全体のインデントについてのご指摘ありがとうございます。これからは、ご指摘いただいた点も注意して作成するようにします。
今後、codeを送付させていただくときは、各codeの挙動を再確認して、必要な箇所だけ送るようにします。
ちなみに今回見つけていただいたのは、ステップイン実行で1行ずつ実行されて問題の箇所を見つけられたのでしょうか。自分で、ステップインで実行しても見つける事が出来なかったので、質問させていただきました。
小川慶一さん:
> 添削を返送します。
> 結論だけ書くと、比較演算のところでひっかかっていました。
>
> " "だと、比較対象は「半角スペースひとつ」です。
> "" だと、比較対象は「長さ0の文字列」、すなわちブランクとなります。
>
>
>
> 今後も、コードを送付されるときは、問題を再現できる、実行可能なもの送られるようにしてください。
> そのほうが解決にかかる手間も時間も減らせます。
>
> さらに言うと、次のステップは、「問題の再現可能な最低限のコードを作って送る」ということです。
> たとえば、以下でもよいですね。「歳出」にかかる部分を変数宣言含めてすべて削りました。
>
>
>
> こういうのは、「無関係な部分を削り、動作確認」ということをくりかえしていき、作ります。
> というより、こういうことをしていると自分で問題を発見できます。
> 僕自身も、自分が書いてるプログラムがどうしても不可解な動作をしてしまうというときにはこういう対処法で問題を探します。問題解決のテクニックのひとつとして、おすすめです。
>
>
小川 慶一さんのコメント
(コメントID: 6405)
> 今回見つけていただいたのは、ステップイン実行で1行ずつ実行されて問題の箇所を見つけられたのでしょうか。
> 自分で、ステップインで実行しても見つける事が出来なかったので
以下の [*1] で示した行にブレークポイントを入れてマクロを実行しても、一度もブレークポイントで中断しません。
そのことから、[*2]で示した行の比較演算が正しく機能していないと推定できます。
この件は、「複数ファイルを開いて処理する」という以前に、その前段階の、単体のファイルを開いて処理するマクロを作った段階で発見されるべき問題でした。
個々のステップでの検証を意識してしっかりやるようにしてください。
> 見つけていただきました間違いは、全く考えの及ばない箇所でした。空白を見つけるという目的から、 "と"の間に空白を作っていました。
ブレークポイントの件もそうですが、この手の基礎的なスキルが身についていないようですと、今後も自力での解決に都度苦労するでしょう。
今回のご質問のようなレベルの課題にトライするには、より簡単な課題での演習が不足しています。
これは、コードのインデント、質問に回答者が答えるために必要な情報の過不足ない選択、すべてから感じられることです。
その状態でレベルの合わない課題にトライして苦労するより、「基礎編フォローのベーシックの問題は、見た瞬間勝手に手が動いて解ける」という状態になるまでひたすら手を動かしたほうがあなたレベルの方にはよい練習になります。
「基礎編フォローのベーシック」に何度もトライされることを強く推奨します。
結果的にはそのほうが近道です。