ここから本文です

VBA初心者です sh2のN列(1~i)の文字をsh3のD列から順番に探し、sh3のD列と一致...

kwd********さん

2017/10/1523:00:11

VBA初心者です
sh2のN列(1~i)の文字をsh3のD列から順番に探し、sh3のD列と一致した場合は
sh2のM列にsh3のD列で見つかった右隣の列の値を入力したいです。

見つからなかった場合はエラーを入れたいです。

わからないので教えていただきたいです。
↓にVBAをかいたのですが、findのシートをまたぐ書き方がわかりません
よろしくお願い致します。


\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

Application.ScreenUpdating = False
Dim i
Dim kw(1000) As Range
Dim EndRow1 As Integer
Dim EndColumns1 As Long
Dim sh1 As Worksheet, sh2 As Worksheet, sh3 As Worksheet
Set sh1 = Worksheets("貼り付け")
Set sh2 = Worksheets("出力")
Set sh3 = Worksheets("マスタ")
EndRow1 = sh1.Range("A" & Rows.Count).End(xlUp).Row

For i = 2 To EndRow1
Set kw(i) = sh3.Range("D:D").Find(what:=sh2.Range(i, "N"), LookIn:=xlValues, lookat:=xlPart)
If Not kw(i) Is Nothing Then
sh2.Cells(i, "M").Value = kw(i).Offset(, 1).Value
Else
sh2.Cells(i, "M") = "エラー"
End If
Next

閲覧数:
88
回答数:
3

違反報告

ベストアンサーに選ばれた回答

30246kikuさん

2017/10/1608:02:12

以外に


1)

> EndRow1 = sh1.Range("A" & Rows.Count).End(xlUp).Row

sh1 の A 列の行数が、sh2 に関係あるのかわからない
sh2 の N 列の行数にするなら

EndRow1 = sh2.Range("N" & Rows.Count).End(xlUp).Row


2)

> Dim EndRow1 As Integer

処理対象の行数(データ量)は Integer の範囲?
気にしたくなければ、素直に Long にでも

Dim EndRow1 As Long


3) 2)含みで

Dim i は、Dim i As Long で


4)

Set kw(i) = ・・・

kw を配列にしている意図は?
特に配列にする必要はなさそうに思いますが・・・・

  • 30246kikuさん

    2017/10/2110:50:07

    新しい情報は無く、

    既出の回答をまとめただけなら
    動くものにされたらどうですか?

    > sh2のM列にsh3のD列で見つかった右隣の列の値を入力

    これへの記述が以下なのですか?

    > sh2.Cells(i, "M").Value = sh3.Cells(kw.Row, "D").Value


    何の為に回答されたのか・・・わかりませんね

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

Prometheusさん

2017/10/2110:19:14

こういうことでしょうか?

Sub Sample()
Application.ScreenUpdating = False
Dim i As Long, kw As Range
Dim EndRow1 As Long, EndColumns1 As Long
Dim sh1 As Worksheet, sh2 As Worksheet, sh3 As Worksheet
Set sh1 = Worksheets("貼り付け")
Set sh2 = Worksheets("出力")
Set sh3 = Worksheets("マスタ")
EndRow1 = sh2.Range("N" & Rows.Count).End(xlUp).Row
For i = 1 To EndRow1
Set kw = sh3.Columns(4).Find(What:=sh2.Cells(i, "N").Value, LookAt:=xlWhole)
If kw Is Nothing Then
sh2.Cells(i, "M").Value = "エラー"
Else
sh2.Cells(i, "M").Value = sh3.Cells(kw.Row, "D").Value
End If
Next i
End Sub

まず、質問者のマクロで「EndRow1 = sh2.Range("N" & Rows.Count).End(xlUp).Row」の部分が、「sh1」になっている意味が分かりません。

質問者の質問内容では、「貼り付け」シートは、全く出てきません。

そこで、私は、「sh2」にまず直しました。

また、質問者のマクロでは、「kw」を配列変数に入れておられますが、これも意味がありません。

あとで、その値を使われるのでしたら、意味がありますが、配列変数にする必要は全くありません。

あとは、見つからなかったら「エラー」、見つかったら、列「D」の値を書き込んでいます。

質問者なら、ご覧頂ければ、ご理解頂けると思います。

プロフィール画像

カテゴリマスター

tra********さん

2017/10/1523:46:01

sh2.Range(i, "N")



sh2.Cells(i, "N")

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる