|    | 
     >その行がtextbox等で1行目とか3行目とか指定された場合に、 
>その指定された配列から同じように探索するには、 
>”探索範囲の先頭セル”下記の部分を変更すればいいのでしょうか? 
>Cellsのセルが変化するということですよね? 
>また、表から探索するとなると範囲も定義づけが必要となるのでしょうか? 
> 
>>  '探索範囲の先頭セル位置を指定 
>>  With ActiveSheet.Cells(1, "A") 
>>    '列数を取得 
>>    lngColumns = .Offset(, 256 - .Column).End(xlToLeft).Column - .Column + 1 
  
基本的には、其の通りだと思います 
ただ、「表から探索するとなると範囲も定義づけが必要となるのでしょうか?」の意味が解りません 
表の最終列は、コードで取得しているので特に何かする必要は無いと思います 
 
今回、数表の行を選択すると言う事なので、前回のコードを少し変更して見ました 
変更点は、数表の行を選択する為、ComboBox1を追加しています 
ComboBox1には、数表の先頭初期値を表示します 
 
また、変更、追加しているプロシージャは、「Sub UserForm_Initialize()」、 
「Sub UserForm_Terminate」、「Sub ComboBox1_Change()」 
変数は、「Private rngListTop As Range」が追加されています 
「Sub TextBox1_BeforeUpdate」と「Function ColumnSearh」の変更は、有りません 
 
尚、前回は、ActiveSheetに数表が有る様に書きましたが、 
今回は、Sheet1に数表が有る様に直していますので気を就けて下さい 
また、数表の各行の列数は、違っていても構いません(最終列はコードで取得) 
 
Option Explicit 
 
Private rngListTop As Range 
Private rngScope As Range 
 
Private Sub ComboBox1_Change() 
 
  Dim lngRow As Long 
  Dim lngColumns As Long 
   
  With ComboBox1 
    'ComboBoxで有効な行が選択された場合 
    If .ListIndex > -1 Then 
      'ListIndexの値を保存 
      'ListIndexの値と数表の行Offset値は等しい為 
      lngRow = .ListIndex 
    Else 
      Exit Sub 
    End If 
  End With 
     
  With rngListTop 
    '列数を取得 
    lngColumns = .Offset(lngRow, 256 - .Column).End(xlToLeft).Column - .Column + 1 
    'この部分(以下4行)は、数表が有れば必要ないかも? 
    If lngColumns <= 1 And .Value = "" Then 
      MsgBox "参照データが有りません" 
      Exit Sub 
    End If 
    '探索範囲を変数に代入 
    Set rngScope = .Offset(lngRow).Resize(, lngColumns) 
  End With 
   
  TextBox1.Text = "" 
  TextBox2.Text = "" 
   
End Sub 
 
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) 
 
  Dim lngFound As Long 
  Dim lngOver As Long 
   
  TextBox2.Text = "" 
   
  With TextBox1 
    If .Text <> "" Then 
      '探索範囲から、値を探索 
      lngFound = ColumnSearh(CLng(.Text), rngScope, lngOver) 
      '探索が失敗した場合(探索値其の物が無い場合) 
      If lngFound = 0 Then 
        '探索値を超える最小値のある列が範囲内の場合 
        If lngOver <= rngScope.Columns.Count Then 
          TextBox2.Text = rngScope(, lngOver).Value 
        '範囲から外れる場合 
        Else 
          Beep 
          MsgBox "参照値の範囲を超えています" 
          Cancel = True 
        End If 
      '探索が成功した場合 
      Else 
        TextBox2.Text = rngScope(, lngFound).Value 
      End If 
    End If 
  End With 
   
End Sub 
 
Private Sub UserForm_Initialize() 
 
  Dim lngRows As Long 
  Dim vntData As Variant 
   
  '探索範囲の先頭セル位置を指定 
  Set rngListTop = Worksheets("Sheet1").Cells(1, "A") 
  'ComboBoxのListを取得 
  With rngListTop 
    lngRows = .Offset(65536 - .Row).End(xlUp).Row - .Row + 1 
    If lngRows <= 1 And .Value = "" Then 
      MsgBox "参照データが有りません" 
      Exit Sub 
    End If 
    vntData = .Resize(lngRows).Value 
  End With 
   
  'ComboBoxを設定 
  With ComboBox1 
    .List = vntData 
    .Style = fmStyleDropDownList 
    .ListIndex = 0 
  End With 
   
End Sub 
 
Private Sub UserForm_Terminate() 
 
  Set rngListTop = Nothing 
  Set rngScope = Nothing 
   
End Sub 
 
Private Function ColumnSearh(vntKey As Variant, _ 
            rngScope As Range, _ 
            Optional lngOver As Long) As Long 
 
  Dim vntFound As Variant 
   
  'Matchによる二分探索 
  vntFound = Application.Match(vntKey, rngScope, 1) 
  'もし、エラーで無いなら 
  If Not IsError(vntFound) Then 
    'もし、Key値と探索位置の値が等しいなら 
    If vntKey = rngScope(, vntFound).Value Then 
      '戻り値として、列位置を代入 
      ColumnSearh = vntFound 
    End If 
    'Key値を超える最小値のある列 
    lngOver = vntFound + 1 
  Else 
    lngOver = 1 
  End If 
   
End Function 
 
 | 
     
    
   |