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

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

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

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

Q&A

解決済

5回答

1192閲覧

不足分データを別シートに追記

hajihaji

総合スコア18

VBA

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

0グッド

0クリップ

投稿2018/10/05 07:15

Sheet1にSheet2にあって足らないデータを追記できるものを作っていますが、
Or以降のsh1.Cells(n, "A") = sh2.Cells(I, "A") And sh1.Cells(n, "L") <> sh2.Cells(I, "F")
の判定がうまくいきません。
A列で同じデータでも、もう一列で違うデータの場合には不足分とし追記できるようにしたいと考えています。
どこがいけないかわからないのでよろしくお願いします。

Sub 転記() Dim sh1 As Worksheet Dim sh2 As Worksheet Start = Time Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") R1 = sh1.Cells(sh1.Rows.Count, "A").End(xlUp).row R2 = sh2.Cells(sh2.Rows.Count, "A").End(xlUp).row Application.ScreenUpdating = False Application.Calculation = xlCalculationManual n = R1 + 1 For I = 1 To R2 Set x = sh1.Range(sh1.Cells(1, "A"), sh1.Cells(R1, "A")).Find(What:=sh2.Cells(I, "A"), LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) If x Is Nothing And sh2.Cells(I, "AB") <> "" Or _ sh1.Cells(n, "A") = sh2.Cells(I, "A") And sh1.Cells(n, "L") <> sh2.Cells(I, "F") And sh2.Cells(I, "AB") <> "" Then sh1.Cells(n, "A") = sh2.Cells(I, "A") sh1.Cells(n, "B") = sh2.Cells(I, "B") n = n + 1 End If Next I Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True Finish = Time MsgBox "取得が完了しました" & vbLf & "実行時間は" & Format(Finish - Start, "nn分ss秒") & "でした" End Sub

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

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

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

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

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

guest

回答5

0

すみません。1点見落としました。
A列の検索は大文字/小文字を区別して検索しますか。
もし、そうなら、
MatchCase:=True
にしてください。
区別しないなら、転記2のほうの修正が必要になります。その時は、その旨返信ください。

投稿2018/10/06 02:17

tatsu99

総合スコア5438

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

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

0

ベストアンサー

連投になります。前回と同じ機能をdictionaryを使って実装しました。
まず、同じ結果になることを確認してください。そして、実行時間を確認してください。

VBA

1Option Explicit 2Sub 転記2() 3 Dim sh1 As Worksheet 4 Dim sh2 As Worksheet 5 Dim dicT As Object 6 Dim Start As Date 7 Dim Finish As Date 8 Dim lrow As Long 9 Dim I As Long 10 Dim n As Long 11 Dim R1 As Long 12 Dim R2 As Long 13 Dim key As Variant 14 Start = Time 15 Set dicT = CreateObject("Scripting.Dictionary") 16 Set sh1 = Worksheets("Sheet1") 17 Set sh2 = Worksheets("Sheet2") 18 19 R1 = sh1.Cells(sh1.Rows.Count, "A").End(xlUp).Row 20 R2 = sh2.Cells(sh2.Rows.Count, "A").End(xlUp).Row 21 Application.ScreenUpdating = False 22 Application.Calculation = xlCalculationManual 23 For lrow = 2 To R1 24 key = sh1.Cells(lrow, "A").Value & "|" & sh1.Cells(lrow, "L").Value 25 dicT(key) = True 26 Next 27 n = R1 + 1 28 For I = 2 To R2 29 If sh2.Cells(I, "AB").Value <> "" Then 30 key = sh2.Cells(I, "A").Value & "|" & sh2.Cells(I, "F").Value 31 If dicT.exists(key) = False Then 32 sh1.Cells(n, "A").Value = sh2.Cells(I, "A").Value 33 sh1.Cells(n, "B").Value = sh2.Cells(I, "B").Value 34 n = n + 1 35 End If 36 End If 37 Next I 38 Application.Calculation = xlCalculationAutomatic 39 Application.ScreenUpdating = True 40 Finish = Time 41 MsgBox "取得が完了しました" & vbLf & "実行時間は" & Format(Finish - Start, "nn分ss秒") & "でした" 42End Sub

投稿2018/10/06 02:08

tatsu99

総合スコア5438

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

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

hajihaji

2018/10/09 00:34

ご回答ありがとうございます。うまくいくました。 dictionaryの使い方がいまいちわかってないのでじっくりコードを読んで勉強させていただきます。
hajihaji

2018/10/09 01:56

もしお答えいただけましたらご教示いただきたいのですが、 key = sh1.Cells(lrow, "A").Value & "|" & sh1.Cells(lrow, "L").Value の"|"とはどのような意味なのでしょうか。
tatsu99

2018/10/09 02:39

以下の理由です。 Aの項目とLの項目を連結して1つのキーにしますが、直接連結すると、 Aの項目=AB、Lの項目=CDの場合、連結結果=ABCD Aの項目=ABC、Lの項目=Dの場合、連結結果=ABCD となり、同じ連結結果になってしまします。 それは、望んだ結果ではありません。 それを防止する為に、|をいれて Aの項目=AB、Lの項目=CDの場合、連結結果=AB|CD Aの項目=ABC、Lの項目=Dの場合、連結結果=ABC|D とすると、異なる連結結果が得られます。 区切り文字は|でなくても構いませんが、通常、データとして使われない文字を選択します。
hajihaji

2018/10/09 04:04

ご回答ありがとうございます。 大変勉強になります。
guest

0

>Sheet2のF列の値がSheet1のL列と異なり・・・・の箇所のがうまくいかず転記しません。コードnがいけないのでしょうか。
nはこれから設定する箇所のセルの行です。その行を参照すること自体がおかしいです。
あなたのソースのおかしいところを修正しました。
こちらでになります。

VBA

1Sub 転記() 2 Dim sh1 As Worksheet 3 Dim sh2 As Worksheet 4 Start = Time 5 Set sh1 = Worksheets("Sheet1") 6 Set sh2 = Worksheets("Sheet2") 7 8 R1 = sh1.Cells(sh1.Rows.Count, "A").End(xlUp).Row 9 R2 = sh2.Cells(sh2.Rows.Count, "A").End(xlUp).Row 10 Application.ScreenUpdating = False 11 Application.Calculation = xlCalculationManual 12 n = R1 + 1 13 For I = 2 To R2 14 flag = flase 15 Set x = sh1.Range(sh1.Cells(2, "A"), sh1.Cells(R1, "A")).Find(What:=sh2.Cells(I, "A"), LookIn:=xlValues, LookAt:= _ 16 xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) 17 If x Is Nothing Then 18 If sh2.Cells(I, "AB") <> "" Then flag = True 19 Else 20 If x.Value = sh2.Cells(I, "A") And x.Offset(0, 11).Value <> sh2.Cells(I, "F") And sh2.Cells(I, "AB") <> "" Then 21 flag = True 22 End If 23 End If 24 If flag = True Then 25 sh1.Cells(n, "A") = sh2.Cells(I, "A") 26 sh1.Cells(n, "B") = sh2.Cells(I, "B") 27 n = n + 1 28 End If 29 Next I 30 Application.Calculation = xlCalculationAutomatic 31 Application.ScreenUpdating = True 32 Finish = Time 33 MsgBox "取得が完了しました" & vbLf & "実行時間は" & Format(Finish - Start, "nn分ss秒") & "でした" 34End Sub

投稿2018/10/06 02:05

tatsu99

総合スコア5438

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

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

hajihaji

2018/10/09 00:36

ご回答ありがとうございます。 重複して転記してしまうようです。 わたしの知識が追いつかないので、今しばらくどこがどうなっているのかコードを見てみます。 ありがとうございます。
guest

0

1.コピー対象となるSheet2の行の条件は何でしょうか。
1)Sheet2のA列の値がSheet1になく、Sheet2のAB列の値が空白でない行。
2)Sheet2のA列の値がSheet1のA列と同じ、かつ
Sheet2のF列の値がSheet1のL列と異なり、かつ
Sheet2のAB列の値が空白でない行。
上記の1),2)の何れかが成立する行でしょうか。(ソースからの推定です)
それとも、上記と異なるならその旨記述してください。

2.コピー対象となった行は、その行ごと転記するのでしょうか。
又、転記するときは値のみの転記でしょうか。それとも、全て(値、関数名、書式等)転記でしょうか。
値のみの転記であれば、A列から何列まで転記すれば良いのでしょうか。
それとも、A列とB列だけ転記するのでしょうか。

3.Sheet1,Sheet2共に1行目からデータとなっていますか。(1行目は見出し行ではない)

上記のことを確認したくて、「その要件を正確に書いていただけませんでしょうか。」とお願いいたしました。

投稿2018/10/05 14:46

tatsu99

総合スコア5438

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

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

hajihaji

2018/10/05 15:39

ご返答ありがとうございます。 1.はい、その認識で結構です。 2.値をA、B列だけです。※実際にはそれぞれ双方で入り組んだ配置になります。 3.双方一行目は見出しです。  失礼いたしました。 Sheet2のF列の値がSheet1のL列と異なり・・・・の箇所のがうまくいかず転記しません。コードnがいけないのでしょうか。
guest

0

>Sheet1にSheet2にあって足らないデータを追記できるものを作っています
その要件を正確に書いていただけませんでしょうか。
たぶん、Findは使わずに、Scripting.Dictionaryを使った方が早く終わるかと思います。

投稿2018/10/05 11:30

tatsu99

総合スコア5438

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

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

hajihaji

2018/10/05 12:26

お返事ありがとうございます。 複数列で判定をし、ダブりのないようにSheet2→Sheet1へ追記していくものです。 先にご提示いたしましたものは、まずSheet1とSheet2のA列同士で比較し、差異分を追記。 次に、A列にすでにあるコードでも、もうひとつ判定条件を加えております。 二番目の判定がどうもうまくいきません。 Scripting.Dictionaryの使用例などございましたらご教示いただければと存じます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問