Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8108 / 13645 ツリー ←次へ | 前へ→

【35054】VLOOKUP関数をVBAで使うにはどうしたらい... ぷうたろう 06/2/20(月) 13:43 質問[未読]
【35061】Re:VLOOKUP関数をVBAで使うにはどうしたら... Kein 06/2/20(月) 15:27 回答[未読]
【35063】Re:VLOOKUP関数をVBAで使うにはどうした... ぷうたろう 06/2/20(月) 15:40 お礼[未読]
【35080】Re:VLOOKUP関数をVBAで使うにはどうした... ぷうたろう 06/2/21(火) 10:16 質問[未読]
【35100】Re:VLOOKUP関数をVBAで使うにはどうした... Kein 06/2/21(火) 13:35 回答[未読]
【35107】Re:VLOOKUP関数をVBAで使うにはどうした... ぷうたろう 06/2/21(火) 14:36 お礼[未読]

【35054】VLOOKUP関数をVBAで使うにはどうしたらい...
質問  ぷうたろう  - 06/2/20(月) 13:43 -

引用なし
パスワード
   はじめまして、こんにちは。
VBAはまだまだ初心者で、あまりよくわかりませんがよろしくお願いします。
使用しているエクセルはExcel2000です。

sheet1に、

A列|B列  
000|あああ
001|いいい
002|ううう
003|えええ
004|おおお


と順番にデータを入力しています(全て文字列です)

そして、sheet2に
A列 |B列
001 |
003 |
002 |
000 |


のようにデータが入っています(全て文字列です)、sheet1と違って順番がバラバラでB列が空き状態です。

sheet2の1行目はA列の値が「001」なのでB列にsheet1から検索して「いいい」と表示させたく、
sheet2の2行目はA列の値が「003」なのでB列にsheet1から検索して「えええ」と表示させたいのです。

現在sheet2のB列にVLOOKUP関数を使って検索していますが、行数が多いので時間がかかって困っています。
なにか良い方法はないでしょうか?ご教授ねがいます。

【35061】Re:VLOOKUP関数をVBAで使うにはどうした...
回答  Kein  - 06/2/20(月) 15:27 -

引用なし
パスワード
   数式の計算より、VBAコードでの計算の方が速くなるとは思えませんが、いちおう・・

Sub Test_Calc()
  Dim Sh As Worksheet
  Dim C As Range
  Dim Ck As Variant

  Set Sh = Worksheets("Sheet1")
  With Worksheets("Sheet2")
   For Each C In .Range("A1", .Range("A65536").End(xlUp))
     Ck = Application.Match(C.Value, Sh.Range("A:A"), 0)
     If Not IsError(Ck) Then
      C.Offset(, 1).Value = Sh.Cells(Ck, 2).Value
     End If
   Next
  End With
  Set Sh = Nothing
End Sub

で、どうでしょーか ?    

【35063】Re:VLOOKUP関数をVBAで使うにはどうした...
お礼  ぷうたろう  - 06/2/20(月) 15:40 -

引用なし
パスワード
   さっそくの回答ありがとうございます。

VBAを使ってもあまり速くはならないのですか?
他のシートでも色々な計算式を使用していて、
自動計算をOFFにする方法も使えないので
VBAなら速く出来るのかなと思い質問してみました。

教えて頂いたマクロを動かしてみて試してみます。
ありがとうございました。

【35080】Re:VLOOKUP関数をVBAで使うにはどうした...
質問  ぷうたろう  - 06/2/21(火) 10:16 -

引用なし
パスワード
   こんにちは。

教えて頂いたマクロを自分のシートに合うようにアレンジして
実行してみたらうまくいきました、ありがとうございます。

また質問なのですが、sheet1のB列は空白の場合が多いので
B列が空白の場合は処理を飛ばしてしまえば少し速くなりますでしょうか?
その場合はどう記述したらよいのでしょうか?

IF文を使うというのは何となくわかるのですが
どこに入れたらよいかわかりませんでした・・・
よろしくお願いします。

【35100】Re:VLOOKUP関数をVBAで使うにはどうした...
回答  Kein  - 06/2/21(火) 13:35 -

引用なし
パスワード
   速度を期待することは出来ませが、ロジックとしては

Sub Test_Calc2()
  Dim Sh As Worksheet, Sh2 As Worksheet
  Dim MyR As Range, C As Range
  Dim Ck As Variant

  Set Sh = Worksheets("Sheet1")
  Set Sh2 = Worksheets("Sheet2")
  On Error GoTo ELine
  Set MyR = Sh.Range("B:B").SpecialCells(2)
  On Error GoTo 0
  For Each C In Sh2.Range("A1", Sh2.Range("A65536").End(xlUp))
   Ck = Application.Match(C.Value, Sh.Range("A:A"), 0)
   If Not IsError(Ck) Then
     If Not Intersect(Sh.Cells(Ck, 2), MyR) Is Nothing Then
       C.Offset(, 1).Value = Sh.Cells(Ck, 2).Value
     End If
   End If
  Next
ELine:
  Set MyR = Nothing: Set Sh = Nothing: Set Sh2 = Nothing
End Sub

あるいは、検索元と検索先を逆にすることが可能なら

Sub Test_Calc3()
  Dim Sh As Worksheet, Sh2 As Worksheet
  Dim MyR As Range, C As Range
  Dim Ck As Variant

  Set Sh = Worksheets("Sheet1")
  Set Sh2 = Worksheets("Sheet2")
  On Error GoTo ELine
  Set MyR = Sh.Range("B:B").SpecialCells(2)
  On Error GoTo 0
  For Each C In MyR
   Ck = Application _
   .Match(C.Offset(, -1).Value, Sh2.Range("A:A"), 0)
   If Not IsError(Ck) Then
    Sh2.Cells(Ck, 2).Value = C.Value
   End If
  Next
ELine:
  Set MyR = Nothing: Set Sh = Nothing: Set Sh2 = Nothing
End Sub

というコードも考えられます。

【35107】Re:VLOOKUP関数をVBAで使うにはどうした...
お礼  ぷうたろう  - 06/2/21(火) 14:36 -

引用なし
パスワード
   詳しい回答をありがとうございました。

また自分のシートに合うようにアレンジして使わせて頂きます。

8108 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free