2017-12-22 1 views
2

개념 증명을 테스트하기 위해 더 큰 프로그램에 대한 코드 작성을 작성했습니다. (따라서 적은 양의 코드입니다.) 주요 코드 뒤에있는 아이디어는 사용자가 CheckBox가있는 사용자 정의 사용자 정의 폼을 사용하여 배열을 작성한 다음 arry가 "1"의 모든 언급 (즉, 확인란을 선택한 경우)을 검색합니다. 그런 다음 arry의 행 번호를 사용하여 어떤 확인란이 선택되었는지에 따라 일련의 추가 userform을로드합니다. 이 작업을 쉽게 수행 할 수있는 방법이 있다고 상상해보십시오. 그러나 이것이 내가 선택한 방법입니다. VBA에 대한 코딩 경험은 상당히 제한되어 있습니다!.Find 함수 사용 VBA - 첫 번째 값을 반환하지 않음

생성 된 배열의 예를 첨부했습니다. 나는이 코드를 실행하면 경우를 제외 inteneded로

An test example of arrey generated by the main code

, 그것은 작동 할 때 세포 (1,2) = 1

사람이 왜, 내가 이상 struggaling했습니다 발견 할 수 지금 당분간.

Sub Array_Finder() 

    Dim StartFinder As String 
    Dim StartFinderZero As String 
    Dim StartFinderCheck As String 

    i = 4 : j = 1 
    StartFinderZero = 0 : StartFinderCheck = i + 2 
    For StartFinderTest = 1 To i + 1 
     StartFinder = StartFinderZero + 1 
     If StartFinderCheck > StartFinder Then 
      StartFinderZero = Range(Cells(StartFinder, 2), Cells(i + 1, 2)).Find _ 
       (What:="1", after:=Cells(StartFinder, 2), searchdirection:=xlNext).Row 
      Cells(StartFinderTest, 3) = StartFinderZero 
     Else 
      MsgBox ("here") 
      Exit For 
     End If 
    Next StartFinderTest 
End Sub 
+2

@Tomm 나는 다른 사람들의 편집에 대해 자주 언급하지 않지만, 어떤 기괴한 세계 * genorate * 및 * arrey *가 정확한지? – AntiDrondert

+1

@AntiDrondert 필자는 왜 내가 그런 식으로 편집했는지 흥미롭게 느낀다. – Tomm

+0

예상되는 출력은 무엇입니까? 또한 모든 변수는'Dim'으로'Long'이 아니라'String'으로 설정되어야합니다. 값이 발견 된 곳의'C' 열에 행이 표시되기를 원하십니까? – Tom

답변

3

가 :

Sub ArrayFinder() 

    Dim StartFinder As Long 
    Dim StartFinderZero As String 
    Dim StartFinderCheck As String 
    i = 4: j = 1 
    StartFinderZero = 0: StartFinderCheck = i + 2 

    For StartFinderTest = 1 To i + 1 
     StartFinder = StartFinderZero + 1 
     If StartFinderCheck > StartFinder Then  
      With Range(Cells(StartFinder, 2), Cells(i + 1, 2)) 
       Debug.Print "row" & vbTab & .Cells(.Cells.Count).Row 
       Debug.Print "address" & vbTab & .Address 
       Debug.Print "after"; vbTab & .Cells(.Cells.Count).Address 
       StartFinderZero = .Find(1, after:=.Cells(.Cells.Count)).Row 
      End With  
      Cells(StartFinderTest, 3) = StartFinderZero 
     Else 
      Debug.Print "here" 
      Exit For 
     End If 
    Next StartFinderTest 

End Sub 

이 당신이 직접 실행 창에서 무엇을 얻을 수 있습니다 :

row 5 
address $B$1:$B$5 
after $B$5 
row 5 
address $B$2:$B$5 
after $B$5 

요령은 다음과 같다합니다 (MSDN에서 매개 변수 후) :

검색을 시작하려는 셀. 이것은 사용자 인터페이스에서 검색이 수행 될 때 활성 셀의 위치에 해당합니다. After는 범위의 단일 셀이어야합니다. 이 셀 다음에 검색이 시작됨을 기억하십시오. 메서드가이 셀로 돌아갈 때까지 지정된 셀이 검색되지 않습니다.. 이 인수를 지정하지 않으면 범위의 왼쪽 위 모서리에있는 셀 뒤에 검색이 시작됩니다.

따라서 마지막 셀을 시작으로 지정할 수 있습니다. 그것은 그것이 시작되어야한다는 것을 알고 있습니다 이후입니다. 따라서 이론적으로는 할 일이별로 없으며 단순히 범위의 시작부터 시작됩니다. After 매개 변수의 개념은 검사 할 마지막 값을 설정하는 것입니다. 따라서 하나의 값만있는 경우 After 매개 변수와 상관없이 항상이 반환됩니다. 두 개 이상의 값이 있으면 첫 번째 값을 반환합니다.

따라서 때문에 .Find() 검색 다음 순서로 셀의 사용량 위 코드에서 :

B1> B2> B3> B4> B5 없이

B2> B3> B4> B5> B1


:
순서는 다음과 같다 심지어 매개 변수 뒤에를 선택하지 않고 당신이 1의 행 당신은 항상, 괜찮을 것을 검색하면, 왼쪽 하나

enter image description here

:

은 두 개의 서로 다른이 같은 범위를 가지고 상상, 더 잘 설명하기 위해 이 코드를 사용하여 : 그것은 또한 두 번 1을 가지고 있기 때문에

Sub TestMe() 
    Dim myR  As Range 
    Dim myS  As Range 
    Set myS = Range("B1:B5") 'change the range 
    With myS 
     Set myR = .Find(1) 
     Debug.Print myR.Row 
     Set myR = .Find(1, after:=.Cells(.Cells.Count)) 
     Debug.Print myR.Row 
    End With 
End Sub 

오른쪽의 범위는 까다로운 하나입니다. 따라서 after은 첫 번째 셀에서 값을 가져 오기 위해 반드시 있어야합니다. 시도하면 21이 바로 가기 창에 표시됩니다. 어떤 점에서 단순히 값의 범위와 검사에 루프 느린 방법을 사용하기로 결정 이유

그리고 꽤 많은이 대신이다 내장 .Find()GitHub link to LastThings.

+1

'Cells.Count' 부분에 대해 설명해 주시면 감사하겠습니다. 내가 그 셀 검색을 이해했기 때문에 어떤 셀이 사용되는지 정의하는 방법을 이해하지 못합니다. – CptGoodar

+1

@CptGoodar - 편집을보세요. – Vityata

+1

정말 고마워요. :) – CptGoodar

1

나는 시트에서 모든 일이 발생한다고 생각합니다. 귀하가 제공 한 데이터에 적용됩니다. 코드의 사용으로

Sub MyAnswer() 
    Dim lRow As Long ' Number of rows (or last row) 
    Dim rngCheckBoxes As Range ' Range of values 
    Dim vArr() 
    ' Calculate last row 
    lRow = ActiveSheet.Range("A" & ActiveSheet.Rows.Count).End(xlUp).Row 
    ' Define range of checkboxes' numbers 
    Set rngCheckBoxes = ActiveSheet.Range("A1","A" & lRow) 
    ' Replace all zeroes with empty string 
    rngCheckBoxes.Offset(0,1).Replace "0", "", xlWhole 
    ' Put all values from defined range into array 
    ' where according values from column next to it aren't blank 
    vArr = rngCheckBoxes.Offset(0,1).SpecialCells(xlCellTypeConstants).Offset(0,-1).Value 
    ' Insert array values into column "C" 
    ActiveSheet.Range("C1").Resize(Ubound(vArr),1).Value = vArr 
End Sub 
+1

답변 해 주셔서 감사합니다. 매우 친절했습니다. 귀하의 대답은 잘 작동하지만 코드가 약간 이해하기 쉽기 때문에 Vityata의 답변을 참조하겠습니다. 고맙습니다. :) – CptGoodar

+1

@CptGoodar 문제 없음 :) – AntiDrondert

관련 문제