ここから本文です

vba初心者です。 コードを入れては見たのですがエラーばかりでうまく動きません。...

kaz********さん

2017/9/117:17:12

vba初心者です。
コードを入れては見たのですがエラーばかりでうまく動きません。

商品番号の検索を行い、そのセルから二つ右の数値を
別シートの同じ商品番号のセルから二つ右に代入したいです。

どうかお力添えよろし

くお願い致します。



'フィルターで絞る
Rows("2:2").Select
Selection.AutoFilter
ActiveSheet.Range("$A$2:$AX$100").AutoFilter Field:=15, Criteria1:="="


'変数格納
Dim bango As Range
Dim kazu As Range
Dim foun As Range
Dim i As Long
Dim ka As Range



'商品番号検索
For i = 3 To 1000
If Cells(i, "a") = "" Then Exit For
If Cells(i, "a") <> "" Then
Set bango = Cells(i, "a")
Set kazu = Cells(i, "c")

'別シートを選択
Sheets("新型抜き表").Select

'
Range("a:a").Find(what:=bango).Select
Selection.Offset(0, 2) = kazu



End If

Next




'フィルターを元に戻す
Sheets("新予定表テンプレート").Select
Rows("2:2").Select
Selection.AutoFilter

閲覧数:
91
回答数:
3

違反報告

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

プロフィール画像

カテゴリマスター

tra********さん

2017/9/412:29:46

↓のように書き換えると、「エラーばかりでうまく動きません。」なのは脱出できそう。

ただ、オートフィルターを設定してますが、効果は全くないです。
.Cells(i, "a") で参照しているセルは、表示/非表示関係なくアクセスされますね。
なので、O列の抽出条件「Criteria1:="="」は処理に何の影響も与えてないです。
.SpecialCells(xlCellTypeVisible)なんかで「見えてるセルだけ」を処理するようにすれば、「処理対象のセル数を減らす」という効果がでます。


'変数格納
Dim bango As Range
Dim kazu As Range
Dim i As Long
With ActiveSheet
'フィルターで絞る
.Range("A2").CurrentRegion.AutoFilter Field:=15, Criteria1:="="
'商品番号検索
For i = 3 To 1000
If .Cells(i, "a").Value = "" Then Exit For
If .Cells(i, "a").Value <> "" Then
Set bango = .Cells(i, "a")
Set kazu = .Cells(i, "c")
'別シートを選択
Worksheets("新型抜き表").Range("a:a").Find(what:=bango.Value).Offset(0, 2) = kazu.Value
End If
Next
'フィルターを元に戻す
.AutoFilterMode = False
End With

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

  • 取り消す
  • キャンセル

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

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

1〜2件/2件中

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

Prometheusさん

2017/9/421:48:28

なんか、よく分からないのですが・・・

まず、

Rows("2:2").Select
Selection.AutoFilter

だと、2行目を選択して、その選択した範囲を「オートフィルター」にかけるみたいですが、実際は、

ActiveSheet.Range("$A$2:$AX$100").AutoFilter Field:=15, Criteria1:="="

なのですから、「Rows("2:2").Select」と「Selection.AutoFilter」の2行は不要です。

また、

ActiveSheet.Range("A2:AX100").AutoFilter Field:=15, Criteria1:="="

で、「$」は不要なのですが、分からないのが次の行で、

For i = 3 To 1000

と、「1000」行まで処理されていることです。

ActiveSheet.Range("A2:AX100").AutoFilter Field:=15, Criteria1:="="

と、「オートフィルター」をかけておられるのは、「2」行目から「100」行目なのに、「For i = 3 To 1000」と、「1000」行まで、処理されようとしています。

そもそも、何行あるデータなのでしょうか?

もし、「1000」行あるのでしたら、そもそも、「オートフィルター」に意味があるのでしょうか?

単に、

Set sn = Sheets("新予定表テンプレート")
For i = 3 to 1000
If sn.Cells(i, "A").Value = "" Then
Exit For
Else
With Sheets("新型抜き表")
Set f = .Range("A:A").Find(What:=sn.Cells(i, "A").Value)
If Not (f is Nothing) True Then
.Cells(f.Row, "C").Value = sn.Cells(i, "C")
End If
End If
End With

だけで、いいのではないでしょうか?

Set sn = Sheets("新予定表テンプレート")

まず、「sn」に「新予定表テンプレート」をセットします。

これで、「sn.Range("A1").Value」などと書けば、「新予定表テンプレートのセルA1の値」と記述しているのと同じになります。

For i = 3 to 1000

もし、最終行が、変わる可能性があるのでしたら、

For i = 3 to sn.Cells(Rows.Count, 1).End(xlUp).Row

というように、記述すれば、「1000」に限りません。

If sn.Cells(i, "A").Value = "" Then

もし、列「A」の値が、「""」なら

Exit For

「For i = 0 to 1000」から抜け出す。

Else

それ以外の場合とは、当然「sn.Cels(i, "A").Value <> ""」になります。

With Sheets("新型抜き表")

シート「新型抜き表」を「With」しておきます。

こうすれば、「.Cells(i, j).Value」などと書けば、「Sheets("新型抜き表").Cells(i, j).Value」と記述しているのと同じになります。

Set f = .Range("A:A").Find(What:=sn.Cells(i, "A").Value)

シート「新予定表テンプレート」の列「A」の値を使って、シート「新型抜き表」シートの列「A」限定で検索して、検索した結果を「f」に入れています。

If Not (f is Nothing) True Then

もし、見つかったら、

.Cells(f.Row, "C").Value = sn.Cells(i, "C")

「f.Row」は、見つかったセルの「行」です。

End If
End If
End With

だと、思うのですが・・・

webnaveさん

2017/9/212:41:26

'別シートを選択
Sheets("新型抜き表").Select

'
Range("a:a").Find(what:=bango).Select
Selection.Offset(0, 2) = kazu


コレまずいよね
For ~ Next のループ内で別シートをSelectしちゃうと

If Cells(i, "a") = "" Then Exit For

コレはSelectされている
Sheets("新型抜き表").Cells(i, "a") = "" Then Exit For

という意味になっちゃう

なので正常動作していないのです

修正するとしたら

Selectせずに

'別シートを選択
Sheets("新型抜き表").Select

'
Range("a:a").Find(what:=bango).Select
Selection.Offset(0, 2) = kazu



Sheets("新型抜き表").Range("a:a").Find(what:=bango).Offset(0, 2) = kazu

直接書き込むように変えたら良い

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

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

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

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

閉じる

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

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

閉じる