2017-01-30 11 views
4

조건을 충족하면 특정 데이터를 되 돌리는 루프를 작성한 다음 결과를 내 ' 메인 '시트.단계별로 실행할 때 내 VBA 루프가 올바른 데이터를 모두 가져 왔지만 매크로를 실행할 때

불행히도 매크로를 실행하면 모든 데이터가 되돌아 오지 않습니다.

그러나 내 의견으로는이 단계가 진행되면 매우 이상합니다.

코드의 아무 지점에도 오류 메시지가 없으며 매크로를 단계별로 실행하면 코드가 완전히 실행됩니다.

내가 아래에있는 내 코드를 게시 한 :

Sub Loop_Data() 
    'BR stands for Blank Row 
    Dim i As Integer, j As Integer, k As Integer, m As Integer, BRMAin As Integer, BRData As Integer, BRPhysNot As Integer, _ 
    SearchRange As Range, strID As String, ExtEnd As Integer, FindRow As Range 

    BRMAin = Sheets("Main").Cells(Rows.Count, "W").End(xlUp).Row 
    BRData = Sheets("Data").Cells(Rows.Count, "A").End(xlUp).Row 
    BRPhysNot = Sheets("PhysNot").Cells(Rows.Count, "A").End(xlUp).Row 

    Set SearchRange = Sheets("Data").Range("A3:A" & BRData) 
    Sheets("CoData").Activate 
    'assign j for number of rows (units) and i to start at 6 (column J) and end at 21 

    For j = 2 To 48 
     i = 35 
     Do Until i = 52 
       'criteria 
      If Cells(j, i - 1).Interior.Color <> RGB(51, 51, 51) And Cells(j, i - 1) > 0 And Cells(j, i).Interior.Color = RGB(51, 51, 51) Then 
       'find duration o 
       m = 0 
       Do While Cells(j, i + m).Interior.Color = RGB(51, 51, 51) 
        m = m + 1 
       Loop 
       'check that the flagged is definitely matching criteria 
       If Cells(j, i + m) = 0 Then 
        'set string ID as the string of uni & period to find in the helper column of Data sheet 
        'set k as row which that occurs in 
        strID = Cells(1, i) & Cells(j, 3) 
        Set FindRow = SearchRange.Find(strID) 
        k = FindRow.Row 
        'Pull back data into main sheet 
        ThisWorkbook.Sheets("Main").Range("X" & BRMAin + 1) = Sheets("Data").Cells(k, 8) 
        ThisWorkbook.Sheets("Main").Range("V" & BRMAin + 1) = Sheets("Data").Cells(k, 4) 
        ThisWorkbook.Sheets("Main").Range("W" & BRMAin + 1) = Sheets("Data").Cells(k, 2) 
        ThisWorkbook.Sheets("Main").Range("Y" & BRMAin + 1) = m 
        ThisWorkbook.Sheets("Main").Range("Z" & BRMAin + 1) = Sheets("CoData").Cells(1, i) 
       End If 
      End If 
      i = i + 1 
     Loop 
    Next j 
End Sub 
+0

나는 https://www.mrexcel.com/forum/excel-questions/412764-macro-works-stepping-through-but-not-when ([잠을 추가하는 데 도움이 될 수 있습니다] 읽었습니다 -i-run-excel-2003-a.html # post2070738). 그것은 그들을 위해 (부분적으로)했다. –

+2

스텝하지 않고 실행하면 어떻게됩니까? 그것은 아무것도하지 못하거나 절반의 일을하고 멈 춥니 다. – jsheeran

+0

찾기에 지체가 있습니까?'worksheetfunction.match'가 당신에게 아무 것도주지 않습니까? findRow'debug.print '후에 시도하십시오. J는 "& j &"입니다. k는 "& k &"입니다. strid는 "strid"이고,'K'가 어딘가에서 작동하지 않는지 확인하십시오. –

답변

0

하는 경우가 Wait 또는 DoEvents 당신은

k = 0 
For Each SearchCell In SearchRange 
    If SearchCell.Text = strID Then k = SearchCell.Row 
Next 
+0

나는 당신이 @CLR을 제안했지만 여전히 같은 문제에 대한 대체 접근법을 삽입하려고 시도했다. 코드는 단계별로 모든 데이터를 가져 오지만 매크로를 실행할 때는 부분적으로 만 가져옵니다. 여전히 오류 메시지가 없습니다. – Gboz

0

내가 함께 갈 수 대신

Set FindRow = SearchRange.Find(strID) 
k = FindRow.Row 

를 사용, 작동하지 않습니다 100 % 확신 할 수는 없지만 여러 장이있는 것과 관련이 있다고 생각하지만 범위가 지정된 시트를 구체적으로 나타내지 마십시오. 각 범위와 셀에 대한 워크 시트를 추가 할 것입니다. 아래 코드를보고 도움이되는지 알려주십시오.

Sub Loop_Data() 'loops through CoData Sheet 

'BR stands for Blank Row 
Dim wb As Workbook, wsData As Worksheet, wsMain As Worksheet, wsPhys As Worksheet, wsCoData As Worksheet 
Dim i As Integer, j As Integer, k As Integer, m As Integer, BRMAin As Integer, BRData As Integer, BRPhysNot As Integer 
Dim SearchRange As Range, strID As String, ExtEnd As Integer, FindRow As Range 

Set wb = ThisWorkbook 
Set wsData = wb.Sheets("Data") 
Set wsMain = wb.Sheets("Main") 
Set wsPhys = wb.Sheets("PhysNot") 
Set wsCoData = wb.Sheets("CoData") 

BRMAin = wsMain.Cells(Rows.Count, "W").End(xlUp).Row 
BRData = wsData.Cells(Rows.Count, "A").End(xlUp).Row 
BRPhysNot = wsPhys.Cells(Rows.Count, "A").End(xlUp).Row 

Set SearchRange = wsData.Range("A3:A" & BRData) 
wsCoData.Activate 'Not necessary to activate a sheet if you need to pull data from it if you link a range to a specific sheet. 
'assign j for number of rows (units) and i to start at 6 (column J) and end at 21 
For j = 2 To 48 

    i = 35 
    Do Until i = 52 
     'criteria 
     If wsCoData.Cells(j, i - 1).Interior.Color <> RGB(51, 51, 51) And wsCoData.Cells(j, i - 1) > 0 And wsCoData.Cells(j, i).Interior.Color = RGB(51, 51, 51) Then 

      'find duration o 
      m = 0 
      Do While wsCoData.Cells(j, i + m).Interior.Color = RGB(51, 51, 51) 
       m = m + 1 
      Loop 

      'check that the flagged is definitely matching criteria 
      If wsCoData.Cells(j, i + m) = 0 Then 
       'set string ID as the string of uni & period to find in the helper column of Data sheet 
       'set k as row which that occurs in 
       strID = wsCoData.Cells(1, i) & wsCoData.Cells(j, 3) 
       Set FindRow = SearchRange.Find(strID) 
       k = FindRow.Row 

       'Pull back data into main sheet 
       wsMain.Range("X" & BRMAin + 1) = wsData.Cells(k, 8) 
       wsMain.Range("V" & BRMAin + 1) = wsData.Cells(k, 4) 
       wsMain.Range("W" & BRMAin + 1) = wsData.Cells(k, 2) 
       wsMain.Range("Y" & BRMAin + 1) = m 
       wsMain.Range("Z" & BRMAin + 1) = wsCoData.Cells(1, i) 
      End If 
     End If 

     i = i + 1 
    Loop 
Next j 

End Sub  

난 그냥 당신이 마지막 활성을 가지고 무엇 때문에 그들이 CODATA 워크 시트에해야 할 일을했을 가정, 레이블이없는 범위에서 생각했다.

또한 도움이된다면 특정 색상으로 계속 불러올 수 있습니다. 변수를 너무 많이 입력해도 계속 입력하지 않아도됩니다. 아래를 참조하십시오.

Dim grey as Long 
grey = RGB(51, 51, 51) 

'Colors are just stored as Longs, in some cases Integer will work, but its mostly safer to just always stick to Long. 
'So your grey would equal 3355443: 51 + 51*256 + 51 *256*256 

'Example Uses... 
If wsCoData.Cells(j, i - 1).Interior.Color <> grey And wsCoData.Cells(j, i - 1) > 0 And wsCoData.Cells(j, i).Interior.Color = grey Then 
    '...Your code 
End if 

Do While Cells(j, i + m).Interior.Color = grey 
    m = m + 1 
Loop 
+0

답변 해 주셔서 감사합니다. Jason, 오늘/내일 일정 시점에 제안 된 코드 개선을 시도하고 업데이트 해 드리겠습니다. – Gboz

+0

제안 된 변경 사항을 @jason으로 만들었지 만 불행히도 매크로는 계속 실행되지만 모든 데이터를 가져 오지는 않습니다 – Gboz