2017-01-04 18 views
1

私はここで働いている2枚のシートがあります。ユーザーがこのボタンを押すsheet1には、「Cabinet date」という列があり、これは各レポートに関連する日付のリストです。 Sheet2(デッドライン)には、この日付より前に(同じ行で)満たされる一連の期限と一致するキャビネット日付列も含まれます。 //たとえば、1月の草稿の期限は同じ行になります。評価エラー

ボタンを押すと、アクティブなシートと一致するシート2のキャビネットの日付が検索されます。 cell(on sheet1)を検索し、その下にある見出し(searchCol)をピックアップし、正しいキャビネット日付のそのイベントの正確なデッドライン値をsheet2から返します。

私は現在、このボタンを実行するとsheet2からキャビネットの日付の値を取得せず、注釈付き行を何も/ trueに評価せずに、コードのブロックをスキップして締切日。

私がこれを押すと、「デッドラインが見つかりません」というメッセージが表示されます。実際に価値があるときでさえ、それは拾うべきです。

Option Explicit 

Private Sub CommandButton1_Click() 
Dim cabDate As String, findme As Range 
Dim searchCol As Integer 

searchCol = ActiveCell.Column 
cabDate = WorksheetFunction.Index(Range("A1:O9999"), ActiveCell.Row, 2) 

If Not IsEmpty(cabDate) Then 
    With Worksheets("Deadlines").Range("B:B") 
     Set findme = Application.WorksheetFunction.VLookup(cabDate, Sheets("Deadlines").Range("A1:O9999"), 1, False) 
     If Not findme Is Nothing Then 
      Dim findmeAddr As String 
      findmeAddr = findme.Address(True, True) 
      Dim printable As String 
      printable = findme.Offset(0, searchCol).Value 
      MsgBox (printable) 
     Else 
      MsgBox ("Deadline not found") 
     End If 
    End With 
Else 
    MsgBox ("invalid or non existent cabinet date") 
End If 
End Sub 

全然

編集いただければ幸いですので、任意の助けコーディングの経験がそのすべて: made up some data as the I work with confidential data

答えて

2

あなたの変数のすべての異なる種類の間で少しアップミックス、そしてどのようなタイプを各関数が戻ります。

WorksheetFunction.Index - 特定のセル(またはセルの範囲)の値を返します。したがって、cabDate As Stringを定義する必要があります。 If Not cabDate Is Nothing ThenRangeではないため)の代わりにIf Not IsEmpty(cabDate) Thenを使用する必要があります。

FindSet findme戻りRangeを用いた方法なので、あなたは後でまたfindme = findme.Address(True, True)でそれを使用することはできませんが、あなたは別の変数As Stringを定義する必要があり、その後、あなたはそれにStringアドレスを読み取ることができます。

最後に、printableから値を読み取るため、As Stringまたは​​である必要がありますが、Rangeではなく値を読み取る必要があります。

コード

Option Explicit 

Private Sub CommandButton1_Click() 

Dim cabDate As String, findme As Range 
Dim searchCol As Integer 

searchCol = ActiveCell.Column 
cabDate = WorksheetFunction.Index(Range("A1:O9999"), ActiveCell.Row, 2) 

If Not IsEmpty(cabDate) Then 
    With Worksheets("Deadlines").Range("B:B") 
     Set findme = .Find(what:=cabDate) 

     If Not findme Is Nothing Then 
      Dim findmeAddr As String 
      findmeAddr = findme.Address(True, True) 

      Dim printable As String     
      printable = findme.Offset(0, searchCol).Value 
      MsgBox (printable) 
     Else 
      MsgBox ("Deadline not found") 
     End If 
    End With 
Else 
    MsgBox ("invalid or non existent cabinet date") 
End If 

End Sub 
+0

こんにちは、私は変更を加えました:)しかし、私はまだ同じ場所でそのコードブロックをスキップしています。私はそれが私のデータ構造や、 'With'と私は、シート2を検索するために.Findメソッドを使用すると、空のセルは、一致するデータを含むセルではなく参照されています。 – Dingge

+0

私は上記のように@Dinggeを共有して、ワークシートのデータ構造がどのように見えるかを共有してください。 –

+0

あなたはそこに行きます、人々はそのボタンを使用して、アクティブなセルで期限を取得してシート2から期限を取得する – Dingge

0

てみ

Set findme = .Find(what:=cabDate, lookIn:=xlValues, lookAt:=xlWhole) 

RangeオブジェクトのFind()方法は、ExcelのUIから

を作り、ActiveCellをすることを確認した場合でも、これらのパラメータの最後の設定を記憶していますので、あなたが実際にそれを期待しているものです!

+0

同じスキップを取得しています。ここでおそらく、助けてくれてありがとう – Dingge

+0

私はデータ型があなたのコードをステップ実行し、あなたが実際にそれが期待されるものになるために 'ActiveCell'をチェックしているとは言いません – user3598756

+0

私はmsgboxとデバッガの通知変数が正しく取得されていることを示すためです。これまでのところ、アクティブなセルをどこに配置しても、cabDateは正常に印刷されているようです。私は問題があるようですが、実際にシート2上の正確な一致を見つけるためのプログラムを取得している、私はデバッガで 'findme = nothing'を取得し続けて、IveはVlookupを使用してみましたが、これも一致する値を見つけることができません。 – Dingge