2017-02-14 11 views
0

Excel Data1列目のデータの最初のセルを取得します。

イメージは私が周囲で遊んでいるExcelデータ用です。後でコードを添付します。しかし、私は列AからEまでの各行の最初に見つかったセルで列Hを埋めるようにしています。 Ex。行1の場合は "B"を見つけ、それをHに置き、行2は "C"を "H"にし、行3は "H"に、行4 "a"をHにする。

私の人生にとってはこれを理解できません。 VBAは私の最強の訴訟ではありませんでした。私はこれで2日間これで遊んでいます。ここに私のコードです。

Function findValue() As String 
Dim rng As Range 
Dim row As Range 
Dim cell As Range 
Dim val As String 

' Sets range of 5 columns to search in by column 
Set rng = Range("A:E")        

' searches through count of rows 
For i = 2 To Range("A" & Rows.Count).End(xlUp).row 
For Each cell In rng.Cells(i) 
    If IsEmpty(cell) = True Then 
    MsgBox cell 
    MsgBox i 
    Else 
     'MsgBox Range.(cell & i).Value 
     findValue = cell 
     Set rng = Range("A:E") 
     Exit For 
    End If 
Next cell 
Next i 
End Function 

ご協力いただきありがとうございます。

+1

これはで行うことができますあなたが興味を持っているならば、数式。 –

+0

Vlookup式? – DanBrennan33

+0

うまくいけば、スコットが式を使用するという提案を受け入れることになりますが、もしそうでなければ、これは関数かサブルーチンかを意味していますか?つまり、ある行の値を取得するために関数を実行しようとしているのですか、または一度にすべての行を処理するサブルーチンを実行しようとしていますか? – YowE3K

答えて

0

これは、UDFとして意図されている場合は、私は次のコードは、あなたが後にあるかであると信じています:

Function findValue() As String 
    Application.Volatile = True 
    Dim r As Long 
    Dim c As Long 
    r = Application.Caller.Row 
    For c = 1 To 5 
     If Not IsEmpty(Cells(r, c)) Then 
      findValue = Cells(r, c).Value 
      Exit Function 
     End If 
    Next 
    findValue = "" 
End Function 

確認だけではなく、チェックするあなたは範囲を渡す別の方法、現在の行は、次のようになります。

Function findValue(rng As Range) As String 
    Dim c As Range 
    For Each c In rng 
     If Not IsEmpty(c) Then 
      findValue = c.Value 
      Exit Function 
     End If 
    Next 
    findValue = "" 
End Function 

これは、その後=findvalue(A2:E2)としてセルH2で使用され、それがをマークする必要がないという利点を有することができ。 (「揮発性」関数は、ワークシートのすべての変更があったときに毎回何かを再計算する必要があります。)


P.S.代わりにExcel式を使用することを強くお勧めします(Scott's answerのようなもの) - Excelで既に機能が提供されているときに、なぜホイールを改革するのですか?

+0

これは完璧に働いた@ YowE3Kありがとう..私はVBAでより良くなる必要があります。 – DanBrennan33

0

私はそれをテストすることはできません、私のPCでないんだけど、あなたはこの

Sub FindValue() 
    Dim myRow As Range 

    ' Sets Range of 5 columns to search in by column 
    Set rng = Intersect(Range("A:E"),ActiveSheet.UsedRange) 

    ' searches through count of rows 
    For each myRow in rng.Rows 
     Cells(myRow.Row, "H").Value = myRow.Cells.SpecialCells(xlCellTypeConstants).Cells(1) 
    Next 
End Sub 
1

を試みることができる式は次のとおりです。

=INDEX(A1:E1,AGGREGATE(15,6,COLUMN(A1:E1)/(A1:E1<>""),1)) 

enter image description here

関連する問題