2017-03-23 12 views
0

vlookup関数に関するVBAの問題が発生しました。VBAフォーム - Vlookupセルとそのセルに値を割り当てます。

私は2つのコンボボックスと6つのテキストボックスをユーザー入力用に用意しています。

vlookup(またはindex、Match()、Match())を使用してデータテーブル内のセルをルックアップし、これらのセルにテキストボックスの値を割り当てる必要があります。

私は、動作するはずのコードを実行すると、オブジェクトエラーが返されます。

Private Sub CommandButton2_Click() 

Dim MonthlyTable As Range 
Set MonthlyTable = Sheets("DATA Monthly").Range("A6:AE400") 
Dim ColumnRef As Range 
Set ColumnRef = Sheets("Drivers").Range("N11") 

' Assign CB2 value to M11 cell reference so it can be converted to a column ref in N11. 
Sheets("Drivers").Range("M11").Value = ComboBox2.Value 

Dim CB1Value As String 
CB1Value = "Joiners" & ComboBox1.Value 
Dim CB2Value As String 
CB2Value = ComboBox2.Value 

MsgBox CB1Value & " " & CB2Value 

Dim tb1value As Range 
tb1value = Application.WorksheetFunction.VLookup(CB1Value, MonthlyTable, ColumnRef, False) 
tb1value.Value = TextBox1.Value 

Unload Me 
End Sub 

私はこのシンプルでなければならないと感じるので、私はここで何をするのか迷っています!

ありがとうございます。

編集。さらに掘り下げることは、あなたがvlookupしているセルを選択することができないことを示しています。このコマンドは、実際に自分の意図や目的のためにセルを選択しない値を返すだけなので、

+0

あなたは 'Set'キーワードが欠落している:'設定しMonthlyTable = ... 'でも、それはまったく同じエラーを返す場所でsetコマンドと – tigeravatar

+0

。 – Realitybites

+0

あなたの遅刻が正しいです。 VLookUpの結果に範囲を割り当てることはできません。 'Range.Find()'メソッドを使いたいかもしれません。 – PatricK

答えて

2

あなたの実際の目的は私には本当に明確な、しかしで述べたように、ちょうどあなたの欲求に追従ないを追加することにより、MonthlyTableのカラムへのListIndexを変換することができますのListIndex 0を持っています:

私は、データテーブル内のセル をルックアップするためにVLOOKUP(またはインデックス、マッチ()、マッチ())を使用し、これらの のセルにテキストボックスから値を割り当てる

あなたはfollowiを採用したいかもしれませんNG技術:

Dim tb1value As Variant '<--| a variant can be assigned the result of Application.Match method and store an error to be properly cheeked for 
tb1value = Application.Match(CB1Value, MonthlyTable.Column(1), 0) '<--| try finding an exact match for 'CB1Value' in the first column of your data range 
If Not IsError(tblvalue) Then MonthlyTable(tb1value, columnRef.Value).Value = TextBox1.Value '<--| if successful then write 'TextBox1' value in data range cell in the same row of the found match and with `columnRef` range value as its column index 
+0

私はあなたが1行でそれをすることができたと確信していました;) –

+0

@ShaiRado、まだ検証していますが、私は実際にそれを作った、それは私に3行かかった... – user3598756

0

Excelはワークシート関数を使用してデータを操作します.VBAにはさまざまなツールがあります。また、シート上のセル値をVBA経由で設定するとワークシート関数が参照できるようになります。ところで、コマンドボタンの代わりにCbx2のChangeイベントを実行することを検討するかもしれない次のことをお勧めします。

Private Sub Solution_Click() 
    ' 24 Mar 2017 

    Dim MonthlyTable As Range 
    Dim Rng As Range 
    Dim Lookup As String 
    Dim Done As Boolean 

    Set MonthlyTable = Sheets("DATA Monthly").Range("A2:AE400") 
    ' take the lookup value from Cbx1 
    Lookup = ComboBox1.Value 

    Set Rng = MonthlyTable.Find(Lookup)  
    If Rng Is Nothing Then 
     MsgBox Chr(34) & Lookup & """ wasn't found.", vbInformation, "Invalid search" 
    Else 
     With ComboBox2 
      If .ListIndex < 0 Then 
       MsgBox "Please select a data type.", vbExclamation, "Missing specification" 
      Else 
       TextBox1.Value = MonthlyTable.Cells(Rng.Row, .ListIndex + 1) 
       Done = True 
      End If 
     End With 
    End If 

    If Done Then Unload Me 
End Sub 

説明が必要な点が2つあります。最初に、フォームは拒否されたエントリの後に閉じません。彼が正しいものを入力するまでフォームを離れることができない不必要なループを避けるために、キャンセルボタンを追加する必要があります。 Doneは、検索条件が見つかった場合にのみTrueに設定され、値が返され、Done = Trueまでフォームが閉じられていないことに注意してください。

第2に、Cbx2のListIndexプロパティの使用を観察します。そのCbxのドロップダウン内のすべてのアイテムは、0以上の番号が付けられています。 ListIndexプロパティは、選択された項目を示します。選択が行われなかった場合は-1です。ドロップダウンにワークシートの列のキャプションをリストした場合(フォームを初期化するときに自動的にこれを行うことがあります)、ユーザーによって選択されたキャプション(「結合者」など)とListIndexの間に直接の関係があります。 MonthlyTableの最初の列は、あなたが1

関連する問題