2016-06-13 5 views
1

4 개의 열이있는 워크 시트가 있는데, 열 A와 B에 수식을 넣을 매크로를 작성한 다음 열 D에 무엇이 들어 있는지에 따라 값을 복사하여 붙여 넣습니다. 해당 열을 필터링 할 수 있습니다. 내 문제는 매주 열 D가 길어진다는 것입니다. 나는 A + B (A2 : A69422)의 범위 내 매크로의 값을 계속 변경하고 싶지 않습니다 69422은 D.인접한 열의 마지막 셀에 연결된 범위

Worksheets("salesinfo").Range("B2").Formula = "= MID(D3,3,5)" 
    Range("B2").Select 
     Selection.AutoFill Destination:=Range("B2:B69422") 
     Range("B2:B69422").Select 
     Selection.Copy 
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
      :=False, Transpose:=False 

    Selection.Value = Selection.Value 

    Range("A2").Formula = "= VLOOKUP(B2,[Data.xlsb]Stores!$A:$X,4,0)" 

    Range("A2").Select 
     Selection.AutoFill Destination:=Range("A2:A69422") 
     Range("A2:A69422").Select 
     Selection.Copy 
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
      :=False, Transpose:=False 

      Workbooks("Data.xlsb").Close SaveChanges:=False 

      Application.CutCopyMode = False 

      Range("A2").Select 

답변

2

열에서 마지막으로 사용 된 세포 인 다음 구문을 사용하여 D 열의 마지막 행을 결정한 다음 Long 또는 Integer 변수에 할당하십시오. 내 예제에서 나는 변수로 lRow을 사용하고 있습니다 :

Dim lRow As Long 

With ActiveSheet 

    lRow = .Cells(.Rows.Count, 4).End(xlUp).Row 

End With 

은 그럼 그냥 셀 주소에서 행 참조 lRow + 1를 사용합니다.

+0

고맙습니다. "TheGuyThatDoesn'tKnowMuch"에 대해 잘 알고 있습니다. 작은 문제 하나, B 열이 하나의 셀을 끝내고 A 열이 하나의 셀을 지나치게 길게 만듭니다. 다시 한번 감사드립니다. – Sherbetdab

1

TheGuyThatDoesn'tKnowMuch으로 표시된 것처럼 Long 형식 변수를 선언하고 모드 관련 열의 마지막 채워진 행을 저장하는 것이 가장 아래에서 위로 향하는 방식으로 수행하는 것이 가장 좋습니다. 이는 워크 시트 하단에서 시작하여 Ctrl + 을 탭하는 것과 같습니다.

다음은 코드를 개선 할 수있는 몇 가지 다른 방법입니다.

  • With ... End With statement으로 Workbook ObjectWorksheet Object을 정의 및 ..Range(...) 등으로 각 Range object 접두사를 지정하여 해당 참조를 사용합니다. .Parent 워크 시트 참조를 암시 적으로 두지 마십시오. 항상 명시 적으로 만듭니다.
  • 모든 수식을 한 번에 작성하십시오. Range.AutoFill method을 사용할 필요가 없습니다.
  • 직접 값 전송은 복사 & 붙여 넣기, 값보다 효율적이며 클립 보드를 포함하지 않습니다.
  • Range.SelectRange.Activate 방법을 사용하지 마십시오 .¹ VBA를 시작하기에 좋은 방법 일 수도 있지만 멀리 떨어져 졸업해야하는 첫 번째 방법이기도합니다.

012 : A : D가 비효율적 인 경우에만 VLOOKUP function 내의 외부 통합 문서에서 A : X를 참조하십시오. 어쨌든 많은 수의 행에 대해 INDEX/MATCH 함수 쌍을 사용하는 것이 좋습니다.

외부 통합 문서 Data.xlsb를 참조하는 열 A에 수식을 작성 했으므로 salesinfo 워크 시트가 들어있는 워크 시트가 아닌 것으로 알고 있습니다. ActiveWorkbook property을 사용하지 않으려면 아래의 통합 문서 참조를 조정해야합니다.

Dim lr As Long 

    With ActiveWorkbook 
     With .Worksheets("salesinfo") 
      lr = .Cells(.Rows.Count, "D").End(xlUp).Row 
      With .Range("B2:B" & lr) 
       .Formula = "=MID(D3, 3, 5)" 
       .Value = .Value 
      End With 
      With .Range("A2:A" & lr) 
       .Formula = "=VLOOKUP(B2, [Data.xlsb]Stores!$A:$X, 4, FALSE)" 
       'alternate formula 
       '.Formula = "=INDEX([Data.xlsb]Stores!$D:$D, MATCH(B2, [Data.xlsb]Stores!$A:$A, 0))" 
       .Value = .Value 
      End With 
      .Range("A2").Activate 
     End With 
    End With 

    Workbooks("Data.xlsb").Close SaveChanges:=False 

열 B로 지정된 수식은 조금 관련이 있습니다. B2의 수식에서 D3을 참조하고 있습니다. 즉, 수식이 열 D의 모든 값과 일치하도록 열 B 아래로 채워진 경우 마지막 수식은 실제로 열 D에서 마지막으로 채워진 셀 아래의 빈 셀을 참조하게됩니다.

계산 지연 문제는 (너무 오래 걸린다) 두 열의 수식을 거의 70,000 개의 행에 쓰면 사전 개체와 변형 배열로 처리 속도가 빨라질 수 있습니다.


는 선택에 의존 멀리보기에 대해 자세히 알아보기 방법에 대한 How to avoid using Select in Excel VBA macros을 확인하고 목표를 달성하기 위해 활성화합니다.

+0

감사합니다. Jeeped, Works a treat는 단지 몇 초 만에 시간을 절약 할 수 있습니다. 단지 vba를 사용하기 시작 했으므로 도움을 주시면 대단히 감사하겠습니다. 나는 두 권의 책을 가지고 있는데, 하나에 대한 인형을위한 vba, 좋은 자기 학습 사이트의 방향으로 나를 가리킬 수 있습니까? 비록 여기에 게시물을 보는 것만으로도 약간의 도움을 받아이 글을 쓸 수 있었지만 실제로는 큰 도움이되었습니다. 고맙습니다. PS.D3은 D2를 읽어야합니다. 감사합니다. – Sherbetdab

+0

당신은 아마도 spurts에서 VBA를 배울 것입니다; 작업을 선택하고 해당 작업을 구성하는 각각의 '섹션'또는 작업을 조사하십시오. 함께 무언가를 놓고 문제가 생기면 여기에 새로운 질문을 게시하여 문제가 무엇인지를 보여주고 문제 나 오류를 기록하십시오. VBA는 DIY 유형 언어입니다. 나는 그것이 의도적으로 그런 식으로 구성되었다고 믿습니다. 다시 참조 할 수있는 다양한 측면을 보여주는 '스 니펫'모음을 유지하십시오. – Jeeped

+0

감사합니다. 매우 감사. – Sherbetdab

관련 문제