Excel VBA質問箱 IV

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

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


8341 / 13646 ツリー ←次へ | 前へ→

【33725】他のブックの複数のシートから検索。 k 06/1/19(木) 12:44 質問[未読]
【33740】Re:他のブックの複数のシートから検索。 Statis 06/1/19(木) 19:07 回答[未読]
【33790】1つの条件を満たせば、2つのループをぬける... k 06/1/20(金) 17:38 質問[未読]
【33792】Re:1つの条件を満たせば、2つのループをぬ... じゅん 06/1/20(金) 17:42 回答[未読]
【33898】Re:1つの条件を満たせば、2つのループをぬ... k 06/1/23(月) 16:07 お礼[未読]

【33725】他のブックの複数のシートから検索。
質問  k  - 06/1/19(木) 12:44 -

引用なし
パスワード
   【33707】に関連する質問なのですが、作業を進めていくうちに質問の内容が題名とずれてきてしまったので、再投稿させていただきます。

Fund.xlsのDiscrepシートのA列に証券名が入っています。
他のブック(Jul 2005.xls)の複数あるシートから、対応する証券コードを探してきて、Q列に証券コードを表示させるのが目的です。
Jul 2005.xlsのフォーマットはすべて、「A列に証券名、C列に証券コード」で統一されています。

以下のコードを書いたのですが、
Do Until Not Cells.Find(Asset1) = "Nothing"
で「オブジェクト変数または With ブロック変数が設定されていません。」のエラーが表示されます。

Dim k As Integer, L As Integer
Dim j As Integer, Sheets1Count As Integer
  
  Sheets1Count = Workbooks("Jul 2005.xls").Worksheets.Count

For j = 7 To 3000
   For k = 7 To j
    For L = 1 To Sheets1Count
      Asset1 = Range("A" & k).Value
      Workbooks("Jul 2005.xls").Worksheets(L).Activate
      Do Until Not Cells.Find(Asset1) = "Nothing"
      ID1 = Worksheets(L).Cells.Find(Asset1).Offset(, 2).Value
      Workbooks("Fund.xls") .Worksheets("Discrep").Activate
      Range("Q" & k).Value = ID1
      Loop
     Next L

【33740】Re:他のブックの複数のシートから検索。
回答  Statis  - 06/1/19(木) 19:07 -

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

これで如何かな?

Dim j As Long, Sheets1Count As Long, L As Long
Dim Asset1 As String, Fi As Range

Sheets1Count = Workbooks("Jul 2005.xls").Worksheets.Count

With Workbooks("Fund.xls").Worksheets("Discrep")
   For j = 7 To .Range("A65536").End(xlUp).Row
     Asset1 = .Range("A" & j).Value
     For L = 1 To Sheets1Count
       Set Fi = Workbooks("Jul 2005.xls").Worksheets(L) _
             .Cells.Find(Asset1, , xlValues, xlWhole)
       If Not Fi Is Nothing Then
        .Range("Q" & j).Value = Fi.Offset(, 2).Value
        Set Fi = Nothing
        Exit For
       End If
     Next L
  Next j
End With

【33790】1つの条件を満たせば、2つのループをぬけ...
質問  k  - 06/1/20(金) 17:38 -

引用なし
パスワード
   Statisさん、レスありがとうございました。

Dim k As Integer, L As Integer, Asset1 As String,ID1 As String
Dim j As Integer, Sheets1Count As Integer, r1 As Long
Dim SheetName As Variant, ArrayCounter As Integer

SheetName = Array("CASH", "FI", "EQ")
Sheets1Count = Workbooks("Jul 2005.xls").Worksheets.Count
r1 = Cells(Workbooks("Fund.xls") .Worksheets("Discrep").Rows.Count, "A").End(xlUp).Row

For j = 7 To r1
For k = j-1 To j
    Asset1 = Workbooks("Fund.xls") .Worksheets("Discrep").Range("A" & k).Value      
 For L = 1 To Sheets1Count
      For ArrayCounter = 1 To UBound(SheetName)
        If Workbooks("Jul 2005.xls").Worksheets(L).Name = SheetName(ArrayCounter) And Not Workbooks("Jul 2005.xls").Worksheets(L).Cells.Find(Asset1) Is Nothing Then
ID1 = Workbooks("Jul 2005.xls").Worksheets(L).Cells.Find(Asset1).Offset(, 2).Value
          Workbooks("Fund.xls") .Worksheets("Discrep").Range("Q" & k).Value = ID1
     Exit For
        End If
      Next ArrayCounter
      Next L
(中略)
Next k
(中略)
r1 = Cells(Workbooks("Fund.xls") .Worksheets("Discrep").Rows.Count, "A").End(xlUp).Row
  Next j

で何とか、目標に近づきました。

1番最後にr1 = Cells(Workbooks("Fund.xls") .Worksheets("Discrep").Rows.Count, "A").End(xlUp).Row
と数えなおしているのは、(中略)の部分で、Cell(j, A)に空白セルを挿入する場合があり、A列の使用している行数が毎回変わるからです。
For j = 7 To r1
For k = j-1 To j
と入れ子にしているのもそのためです。

ただ、すごく時間がかかります。検索先をCellsととしているからでしょうか。

Workbooks("Jul 2005.xls").Worksheets(L).Name = SheetName(ArrayCounter) And Not Workbooks("Jul 2005.xls").Worksheets(L).Cells.Find(Asset1) Is Nothing
というひとつの条件を満たせば、

For L = 1 To Sheets1Count
      For ArrayCounter = 1 To UBound(SheetName)
の二つのループを同時に抜けられるようにしたいのですが、どうやってコードを書いたらよいのでしょうか。

他にも時間を短縮する方法があったら教えてください。

【33792】Re:1つの条件を満たせば、2つのループを...
回答  じゅん  - 06/1/20(金) 17:42 -

引用なし
パスワード
   ▼k さん:
For文を途中で抜け出す方法に
Exit for
があります。

Public Sub ForTest()
  Dim i As Integer
  
  For i = 1 To 10
    If i = 5 Then
      Exit For
    End If
  Next i
End Sub
こんな感じですが、、、いかがでしょうか?

【33898】Re:1つの条件を満たせば、2つのループを...
お礼  k  - 06/1/23(月) 16:07 -

引用なし
パスワード
   じゅんさん、レスありがとうございました。

最初にJul 2005.xlsのそれぞれのシートの行を数えて、A列の、データの入っている行だけを検索先に指定したら格段に早くなりました。

Workbooks("Jul 2005.xls").Worksheets(L).Name = SheetName(ArrayCounter) And Not Workbooks("Jul 2005.xls").Worksheets(L).Cells.Find(Asset1) Is Nothing
の部分を

Not Workbooks("Jul 2005.xls").Worksheets(SheetName(ArrayCounter) ).Cells.Find(Asset1) Is Nothing
に書き直すことで、

For L = 1 To Sheets1Countのループを省略することにしました。

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