Excel VBA質問箱 IV

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

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


2336 / 13644 ツリー ←次へ | 前へ→

【68633】VBA初心者です mo 11/3/31(木) 13:26 質問[未読]
【68635】Re:VBA初心者です UO3 11/3/31(木) 14:34 回答[未読]
【68636】Re:VBA初心者です mo 11/3/31(木) 16:00 お礼[未読]
【68637】Re:VBA初心者です kanabun 11/3/31(木) 16:07 発言[未読]
【68639】Re:VBA初心者です kanabun 11/3/31(木) 17:15 発言[未読]
【68641】Re:VBA初心者です kanabun 11/3/31(木) 20:13 発言[未読]
【68651】Re:VBA初心者です mo 11/4/1(金) 12:32 お礼[未読]

【68633】VBA初心者です
質問  mo  - 11/3/31(木) 13:26 -

引用なし
パスワード
   OS/WINDOWS7 エクセル2010使用

BOOK1のシート1

  A  B  C  D ・・・ I(値をかえしたい行)

1 数値 文字 文字 文字 ・・ 値をかえしたいセル

2   以下同じ

3

4

1.A1またはA列を選択
2.その数値から500000をマイナスする
3.BOOK2のシート1から同じ値をさがす。(縦方向に複数個ある場合あり。)
4.その値の一番上の段を選択
5.そのセルから右に6ケはなれたセルを選択(日付形式)
6.その値をBOOK1のシート1のI1(またはI列)に返す

上記のような作業をしたいです。

初めて質問させていただくのですが、質問事項の足りない内容等ありますでしょうか?

何卒、御教授お願いいたします。

【68635】Re:VBA初心者です
回答  UO3  - 11/3/31(木) 14:34 -

引用なし
パスワード
   ▼mo さん:

こんにちは

要件を誤解しているところもあるかもしれませんが・・・
Book1とBook2はともに、既に開かれていることを前提にしたコード。
ブック名拡張子は2003ベースのxlsにしていますが、ここは直してください。
また、それぞれのシート名も適切なものにしてください。
★Book2の検索領域がどこなのか不明でしたので使用領域を全て検索していますが
 もしかしたら、ここもA列だけでよかったかな?)

Sub Sample()
  Dim sh As Worksheet
  Dim myC As Range, myF As Range, myCol As Range
  Dim n As Long
  
  Application.ScreenUpdating = False
  
  Set sh = Workbooks("Book2.xls").Sheets("Sheet1")
  
  With Workbooks("Book1.xls").Sheets("Sheet1")
    For Each myC In .Range("A1:A" & .Range("A" & .Rows.Count).End(xlUp).Row)
      n = Val(myC.Value) - 500000
      For Each myCol In sh.UsedRange.Columns
      
        Set myF = myCol.Find(What:=n, After:=myCol.Cells(myCol.Cells.Count), _
          LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, _
          SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False, _
          SearchFormat:=False)
        If Not myF Is Nothing Then
          myC.Offset(, 8).Value = myF.Offset(, 6).Value
        End If
        
      Next
    Next
  End With
  
  Set sh = Nothing
  
End Sub

【68636】Re:VBA初心者です
お礼  mo  - 11/3/31(木) 16:00 -

引用なし
パスワード
   ▼UO3 さん:

ご回答ありがとうございました。

期待した数値が返るようになりました。

今までの作業から大幅に時間短縮できそうです。

【68637】Re:VBA初心者です
発言  kanabun  - 11/3/31(木) 16:07 -

引用なし
パスワード
   ▼mo さん:
>期待した数値が返るようになりました。

解決されたようですが、
数値の検索ということで、Match関数で検索する例です。
参考まで。

Sub Try1()
 Dim r1 As Range 'Book1 A列
 Dim r2 As Range 'Book2 A列
 Dim c As Range
 Dim m

 Application.ScreenUpdating = False

'Book1のA列Loop範囲
 With Workbooks("Book1.xls").Worksheets(1)
   Set r1 = .Range("A1", .Cells(.Rows.Count, 1).End(xlUp))
 End With
'Book2のA列検索対象範囲
 With Workbooks("Book2.xls").Worksheets(1)
   Set r2 = .Range("A1", .Cells(.Rows.Count, 1).End(xlUp))
 End With

'500,000を引いてBook2よりMatch検索Loop実行
 For Each c In r1
   m = Application.Match(c.Value - 500000, r2, 0)
   If IsNumeric(m) Then '見つかっ最初の行の6列右の値をI列にCopy
     c.Offset(, 8).Value = r2(m, 7).Value
   End If
 Next
 Application.ScreenUpdating = True
End Sub

【68639】Re:VBA初心者です
発言  kanabun  - 11/3/31(木) 17:15 -

引用なし
パスワード
   あと、Dictioanryオブジェクトを使った
こんな方法もありそうです。
これも参考まで。。。

Sub Try2()
 Dim v1 As Variant 'Book1 A列
 Dim v2 As Variant 'Book2 A列
 Dim d2 As Variant  'Book2 G列 日付
 Dim i As Long
 Dim ss As String
 Dim dic As Object
 Set dic = CreateObject("Scripting.Dictionary")
 
'Book2のA列検索対象範囲
 With Workbooks("Book2.xls").Worksheets(1)
   With .Range("A1", .Cells(.Rows.Count, 1).End(xlUp))
     v2 = .Value
     d2 = .Offset(, 6).Value
   End With
 End With
 For i = 1 To UBound(v2) 'Dictionaryの作成
   ss = v2(i, 1)
   If Not dic.Exists(ss) Then
     dic(ss) = d2(i, 1) 'A列をKeyに、G列をItemにセット
   End If
 Next

'Book1のA列Loop範囲
 With Workbooks("Book1.xls").Worksheets(1)
   With .Range("A1", .Cells(.Rows.Count, 1).End(xlUp))
     v1 = .Value
    '500,000を引いてDictionaryにkeyがあるか調べる
     For i = 1 To UBound(v1)
       ss = v1(i, 1) - 500000
       If dic.Exists(ss) Then
         v1(i, 1) = dic(ss)
       Else
         v1(i, 1) = Empty
       End If
     Next
     .Offset(, 8).Value = v1
   End With
 End With
 
 Set dic = Nothing
End Sub

【68641】Re:VBA初心者です
発言  kanabun  - 11/3/31(木) 20:13 -

引用なし
パスワード
   またまた 参考です。が、

Find方式と Match方式と Dictionary方式
この3つの方式 2つのシートのA列のデータ数を2万行にして、
時間計測してみました。

Find  197,940
Match  11,426
Dic    405

おそろしい差ですね(^^

【68651】Re:VBA初心者です
お礼  mo  - 11/4/1(金) 12:32 -

引用なし
パスワード
   ▼kanabun さん:
>>Find方式と Match方式と Dictionary方式
>この3つの方式 2つのシートのA列のデータ数を2万行にして、
>時間計測してみました。
>
>Find  197,940
>Match  11,426
>Dic    405
>
>おそろしい差ですね(^^

いろいろな方法をご提示いただきありがとうございます。

処理時間の短縮ができそうです。

が、、、なにぶん初心者なもので、ご提示いただいた構文を

読解することから始め、利用させていただくことができるように

勉強を続けたいと思います。

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