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

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

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

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

Q&A

解決済

1回答

1449閲覧

WorksheetFunction.matchで取得したデータが複写先に正しく反映しない

mowmowmilk1

総合スコア11

VBA

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

0グッド

1クリップ

投稿2019/06/02 04:55

以下のマクロについて教えてください。
最初のデータ入力時にはsheet1、sheet2ともに同じ管理番号があります。(1枚目の画像参照)
その後sheet1の工事会社を変えて管理番号を削除することがあります。
その場合マクロを実行するとsheet1に違った管理番号のデータが反映されることがあります。(2枚目の画像)
このようなパターンでもsheet2の管理番号に対応するデータを、sheet1に正しく反映させるのにはどのように対処すればいいのでしょうか?

sheet1=管理台帳
sheet2=(B社)管理台帳

Sub 工事会社工程コピー()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim ws1Key As Range
Dim i As Long
Dim r As Long
MsgBox "管理番号は入力済みですか?"
ActiveSheet.AutoFilterMode = False
On Error Resume Next

Set ws1 = Worksheets("管理台帳") Set ws1Key = ws1.Range("C10", ws1.Cells(Rows.Count, "C").End(xlUp)) ' Set ws2 = Worksheets("(B社)管理台帳") For i = 10 To ws2.Cells(Rows.Count, "C").End(xlUp).Row r = WorksheetFunction.match(ws2.Cells(i, 3).Value, ws1Key, 0) + 9 ws1.Range(ws1.Cells(r, 4), ws1.Cells(r, 9)).Value _ = ws2.Range(ws2.Cells(i, 4), ws2.Cells(i, 9)).Value Next

End Sub
イメージ説明
イメージ説明

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

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

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

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

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

coco_bauer

2019/06/02 05:12

「その後sheet1の工事会社を変えて管理番号を削除する」という操作をしたら、sheet1の内容はどうなるのですか? 「その場合マクロを実行するとsheet1に違った管理番号のデータが反映されることがあります」ということは、sheet1に正しい管理番号のデータが反映される場合と、違った管理番号が反映されることがあるという事ですか? 正しいデータが反映される場合のsheet1の内容と、違った管理番号が反映される場合のsheet1の内容を示してください。
mowmowmilk1

2019/06/03 14:06

ご検討いただきありがとうございます。 2番目の画像にもありますが、12行目のデータは正しく反映されませんでした。そのほかの行は正しく反映されました。
guest

回答1

0

ベストアンサー

なぜかはよくわかりませんが(動作確認してないので)、
ステップインで1行づつ実行しながら、
ローカルウィンドウでそれぞれの変数の値が期待通りに、
変化しているかを確認したらわかるかと思います。

参考サイト>>
プロパティ、メソッドの探り方 マクロ記録とF1のHelpを使う

ExcelVBA

1Sub test2() 2 Const cmyCCount As Long = 6 3 Dim rngListB As Range 4 Dim rngTable As Range 5 Dim c As Range 6 7 With Worksheets("(B社)管理台帳").Range("B9").CurrentRegion 8 Set rngListB = Intersect(.Cells, .Offset(1)) 9 End With 10 With Worksheets("管理台帳").Range("B9").CurrentRegion 11 Set rngTable = Intersect(.Cells, .Offset(1)) 12 End With 13 14 For Each c In rngTable.Columns(2).Cells 15 If Not IsEmpty(c.Value) Then '値が空白でない時に処理 16 r = 0 '変数の初期化 17 On Error Resume Next 18 r = WorksheetFunction.Match(c.Value, rngListB.Columns(2), 0) 19 On Error GoTo 0 20 If r > 0 Then 21 c.Offset(, 1).Resize(, cmyCCount).Value _ 22 = rngListB.Cells(r, 3).Resize(, cmyCCount).Value 23 End If 24 End If 25 Next 26End Sub

ポイントとしては、
1)on errorステートメントは必要以外の範囲に限定して適用してください。
エラーを全体で無視すると、必要な時に不具合の原因が分からなくなります。
2)If文で不要な処理は除外しましょう。
無駄なループを減らし処理速度が改善します。
3)変数を使いまわす時は初期化を忘れずに。
前の値が残ったままだと、意図しない動作の原因になります。
4)セルの位置は、指定のセルからの相対位置でも示せます。
一旦、変数にセル範囲を取り込んだなら、
改めてシート全体の位置から示さなくても、
変数にあるセルを基準に相対位置で示せるといいと思いました。

注)サンプルコードは、動作確認していません。
上手く動かなければごめんなさいです。

参考になれば。。。

投稿2019/06/02 08:05

編集2019/06/02 08:06
mattuwan

総合スコア2136

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

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

mowmowmilk1

2019/06/03 14:06

早速の回答ありがとうございました。無事解決することができました。今後もなにかありましたらお力を貸してください。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問