Excel VBA質問箱 IV

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

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


42569 / 76732 ←次へ | 前へ→

【39228】Re:FINDメソッドについて
発言  ichinose  - 06/6/20(火) 10:42 -

引用なし
パスワード
   ▼マキチャン さん:
こんにちは。

>FINDメソッドの LookInとSearchOrderとSearchDirectionについて
>教えてください。
適当なサンプルデータを作成して、記述されたオプションを変更して実行してみれば、
おおよその見当が付きますよ!!

新規ブックの標準モジュールに

'===================================
Option Explicit
'===============================================
Sub main()
  Const セル範囲 = "a1:f5"
  Dim f_value As Variant
  Dim find_cell As Range
  Call mk_sample
  MsgBox "Find サンプルデータ作成  検索値は 「2」"
  f_value = "2" '検索する値を入れる
  MsgBox "Xlvaluesは、RangeのValueプロパティの値が検索対象"
  Set find_cell = get_findcell(f_value, ActiveSheet.Range(セル範囲), xlValues, xlPart)
  Do While Not find_cell Is Nothing
    find_cell.Select
    MsgBox "セルアドレス " & find_cell.Address & " ---セルの値 " & find_cell.Value
    Set find_cell = get_findcell() '次の検索
    Loop
  MsgBox "xlFormulasは、RangeのFormulaプロパティの値が検索対象"
  
  Set find_cell = get_findcell(f_value, ActiveSheet.Range(セル範囲), xlFormulas, xlPart)
  Do While Not find_cell Is Nothing
    find_cell.Select
    MsgBox "セルアドレス " & find_cell.Address & " ---セルの値 " & find_cell.Value & " ----Formulaプロパティ= " & find_cell.Formula
    Set find_cell = get_findcell() '次の検索
    Loop
  MsgBox "xlCommentsは、RangeのCommentのTextプロパティの値が検索対象"
 
  Set find_cell = get_findcell(f_value, ActiveSheet.Range(セル範囲), xlComments, xlPart)
  Do While Not find_cell Is Nothing
    find_cell.Select
    MsgBox "セルアドレス " & find_cell.Address & " ---セルの値 " & find_cell.Value & " ----コメント= " & find_cell.Comment.Text
    Set find_cell = get_findcell() '次の検索
    Loop
  MsgBox "=========== 以上、xlValues,Xlformulas,Xlcommentsの違い"
'=============================================================================================
  MsgBox "SearchOrder=xlByRowsの場合の検索順序  検索順序に注目"
  Set find_cell = get_findcell(f_value, ActiveSheet.Range(セル範囲), xlValues, xlPart, xlByRows)
  Do While Not find_cell Is Nothing
    find_cell.Select
    MsgBox "セルアドレス " & find_cell.Address & " ---セルの値 " & find_cell.Value
    Set find_cell = get_findcell() '次の検索
    Loop
  MsgBox "SearchOrder=xlByColumnsの場合の検索順序 検索順序に注目"
  
  Set find_cell = get_findcell(f_value, ActiveSheet.Range(セル範囲), xlValues, xlPart, xlByColumns)
  Do While Not find_cell Is Nothing
    find_cell.Select
    MsgBox "セルアドレス " & find_cell.Address & " ---セルの値 " & find_cell.Value
    Set find_cell = get_findcell() '次の検索
    Loop
  MsgBox "=========== 以上、xlByRows  xlByColumnsの違い つまり、検索順序が行方向か列方向か"
'=====================================================
  Range("A1").Select
  MsgBox "Searchdirection=xlNext の場合の検索方向 順回り検索"
  Set find_cell = get_findcell(f_value, ActiveSheet.Range(セル範囲), xlValues, xlPart, , xlNext)
  Do While Not find_cell Is Nothing
    find_cell.Select
    MsgBox "セルアドレス " & find_cell.Address & " ---セルの値 " & find_cell.Value
    Set find_cell = get_findcell() '次の検索
    Loop
  Range("A1").Select
  MsgBox "Searchdirection=xlPrevious の場合の検索方向 逆回り検索"
  Set find_cell = get_findcell(f_value, ActiveSheet.Range(セル範囲), xlValues, xlPart, , xlPrevious)
  Do While Not find_cell Is Nothing
    find_cell.Select
    MsgBox "セルアドレス " & find_cell.Address & " ---セルの値 " & find_cell.Value
    Set find_cell = get_findcell() '次の検索
    Loop
  MsgBox "=========== 以上、xlNext  xlPreviousの違い つまり、指定セル範囲の検索方向を順方向か逆方向かの指定 "
End Sub
'===============================================
Sub mk_sample()
  Dim rng As Range
  With ActiveSheet
   With .Range("a1:c5")
     .Formula = "=int(rand()*5)+1"
     .Value = .Value
     End With
   With Range("d1:f5")
     .Formula = "=a1+countif($a$1:$c$5,a1)"
     End With
   With Range("a1:d2")
     For Each rng In .Cells
      With rng
       .ClearComments
       .AddComment
       .Comment.Visible = True
       .Comment.Text Text:="コメント" & .Address
       .Comment.Visible = False
       End With
      Next
     End With
   End With
End Sub
'===============================================
Function get_findcell(Optional ByVal f_v As Variant = "", _
           Optional ByVal rng As Range = Nothing, _
           Optional ByVal alookin As XlFindLookIn = -4163, _
           Optional ByVal alookat As XlLookAt = 1, _
           Optional ByVal aso As XlSearchOrder = 1, _
           Optional ByVal asd As XlSearchDirection = 1, _
           Optional ByVal mc As Boolean = False, _
           Optional ByVal mb As Boolean = True) As Range
'指定された値でセル範囲を検索し、該当するセルを取得する
'input : f_v 検索する値
'    rng 検索する範囲
'    alookin 検索対象 xlvalues,xlformulas,xlcomments
'    alookat: :検索方法 1-完全一致 2-部分一致
'    aso : 検索順序 1 行 2 列
'    asd : 検索方向 1 Xlnext 2 XlPrevious
'    mc  : 大文字・小文字の区別 False しない True する
'    mb  : 半角と全角を区別   True する  False しない
'output:get_findcell 見つかったセル(見つからなかったときはNothingが返る)
  Static 検索範囲 As Range
  Static 最初に見つかったセル As Range
  Static 直前に見つかったセル As Range
  Static 検索方向 As XlSearchDirection
  If Not rng Is Nothing Then
    Set 検索範囲 = rng
    End If
  If f_v <> "" Then
    Set get_findcell = 検索範囲.Find(f_v, 検索範囲.Cells(検索範囲.Rows.Count, 検索範囲.Columns.Count), alookin, alookat, aso, asd)
    If Not get_findcell Is Nothing Then
     Set 最初に見つかったセル = get_findcell
     Set 直前に見つかったセル = get_findcell
     検索方向 = asd
     End If
  Else
    If 検索方向 = xlNext Then
     Set get_findcell = 検索範囲.FindNext(直前に見つかったセル)
    Else
     Set get_findcell = 検索範囲.FindPrevious(直前に見つかったセル)
     End If
    If get_findcell.Address = 最初に見つかったセル.Address Then
     Set get_findcell = Nothing
    Else
     Set 直前に見つかったセル = get_findcell
     End If
    End If
End Function


として、mainを実行してみて、セルの選択順序や選択されるセルの違いを
コードと照らし合わせて、比べてみてください。

2 hits

【39210】FINDメソッドについて マキチャン 06/6/19(月) 21:03 質問
【39228】Re:FINDメソッドについて ichinose 06/6/20(火) 10:42 発言
【39267】Re:FINDメソッドについて 訂正 ichinose 06/6/20(火) 18:34 発言
【39271】Re:FINDメソッドについて 訂正 マキチャン 06/6/20(火) 21:27 お礼
【39443】Re:FINDメソッドについて 訂正 マキチャン 06/6/24(土) 8:44 お礼

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