2016-08-02 3 views
0

외부 소스에 연결되는 템플릿이 있습니다.Excel VBA - 보이는 셀에 붙여 넣기

전임자가 작성했으며 눈을 '편하게'하기 위해 행을 건너 뛰면서 작성했습니다. 행 1, 그 다음 행 3, 5 행 9, 13 행 등이 있습니다. 언급 된 행 사이에는 DEFAULT EMPTY CELL 만있는 반면, HAS FORMULA가 있습니다.

통합 문서를 열고 원하는 시트를 복사하는 vba를 만들었습니다.

아래 코드를 사용하면 매우 느리게 실행되며 어떤 이유로 든 두 번 이상 반복됩니다.

for each cell in usedrange 
if cell.hasformula = true and instr(cell.formula, "SUMIF") > 0 then 
     cell.formulaR1C1 = "='\\tel\folder1\folder2\[xlsheet.xlsx]SheetName'!RC 
    end if 
next cell 

따라서 실제로 한 번 할당 한 다음 복사하여 각 셀에 붙여 넣습니다 (아래 그림 참조).

Workbooks(desWB).Sheets(maxSheet + 1).Range("J5").FormulaR1C1 = fullPath 
Workbooks(desWB).Sheets(maxSheet + 1).Range("J5").Copy 
Workbooks(desWB).Sheets(maxSheet + 1).Range("J6:J12,E48:J55,E57:J58,E61:J79,E84:J93,E96:J96,E99:J103").PasteSpecial Paste:=xlPasteFormulas 

후자의 방법이 효과적이며 처음보다 훨씬 빠릅니다. 그러나 이제 템플릿의 설정으로 인해 일부 행에 수식이 있고 일부는 그렇지 않은 상황에 직면하고 있으며 수천 개의 행이 있습니다. 행의 건너 뛰기가 너무 때로는 2의 증가하지, 그것은 수 3, 5 등

에보다 효과적이고 효율적 방법이 있는지 그래서 궁금 : 사용 된 범위에서

  • 범위는 공식을 가지고 있으며, 공식은 뭔가 다른 그 밖에
  • SKIP 및 확인 다음 셀에 수식이 'SUMIF'
  • 변경하는 경우
+0

행의 가장 왼쪽 셀이 비어 있으면 전체 행을 건너 뛸 것을 의미합니까? –

+0

맞습니다 ... 행이 비어 있으면 전체 행이 비어 있습니다. –

답변

2

행의 첫 번째 셀에 비어 있지 않은 셀 값이있는 행만 처리하려는 경우 Range 열을 반복하고 첫 번째 셀이 테스트에 실패하면 행을 건너 뜁니다.

For Each cell in range 접근 방식을 사용하는 현재 코드는 여전히 빈 행에 처리 셀을 유지합니다. 이는 중복됩니다.

다음과 같은 코드를 사용하여 빈 행을 건너 뛰고 일부 셀에 업데이트 할 수식이 있다고 확신하는 행에만 조건부 논리를 적용 할 수 있습니다. 이 예에서는 Range("C4:E10")을 사용하지만 통합 문서 구조에 따라 사용할 수있는 Range을 대신 사용할 수 있습니다.

Option Explicit 

Sub Test() 
    'could pass in UsedRange of the sheet... 
    IterateRange ThisWorkbook.Worksheets("Sheet1").Range("C4:E10") 
End Sub 

Sub IterateRange(rng As Range) 

    Dim rngCell As Range 
    Dim intX As Integer 
    Dim intY As Integer 

    'iterate all cells in range 
    For intX = 1 To rng.Rows.Count 
     For intY = 1 To rng.Columns.Count 
      'get a cell 
      Set rngCell = rng.Cells(intX, intY) 
      'check if cell is blank or empty 
      If IsEmpty(rngCell.Value) Or rngCell.Value = "" Then 
       'skip the rest of the columns in this row and goto next row 
       Exit For 
      Else 
       'this row has non-empty cells - do something 
       Debug.Print rngCell.Address 
       'some other test 
       If rngCell.HasFormula And InStr(1, rngCell.Formula, "SUMIF") Then 
        'update formula... 
        Debug.Print rngCell.Formula 
       End If 
      End If 
     Next intY 
    Next intX 

End Sub 
+0

도움을 주셔서 감사합니다. Robin ... 'IterateRange'를 기존 서브에 넣으려고하기 때문에 아직 테스트하지 않았습니다. 'Debug.Print rngCell.Formula'의 경우 기존 서브에 통합 할 수있는 방법이 있습니까? 이게 맞을까요? 통합 문서 (desWB). 시트 (maxSheet + 2) .rngCell.FormulaR1C1 = fullPathConsol fullpathConsol은 기존 서브 그룹입니까? –

+0

'Debug.Print rngCell.Formula'을 플레이스 홀더로 사용했습니다. 'FormulaR1C1' 프라퍼티를 업데이트하기 위해 로직으로 바꿀 수 있습니다. 나는 원래 질문에 오타가 있다고 생각한다. (닫는 큰 따옴표가 없다.) 그래서 나는 이것을 당신이 할 일로 남겼다. 기본적으로 그 셀을 가지고 뭔가를하고 싶다는 것을 알고 나면 - 당신은'Debug.Print'를 대체 할 수있다. 성명서. –

+0

고마워 Robin! 그것을 조사하고 회신합니다. 그리고 그것이 내가 찾는 대답이라면, 나는 그 위에 체크 표시를 할 것이다. –

관련 문제