2013-06-12 2 views
0

기준에 따라 행 복사/붙여 넣기에 문제가 있습니다.For 루프의 행 복사 및 새 시트에 붙여 넣기

Dim lastrow1 As Long 
Dim lastcolumn1 As Long 
Dim Distance As Long 
Distance = 14 
Set sh = ThisWorkbook.Sheets("Sample Address Database") 
Set sh2 = ThisWorkbook.Sheets("Workspace") 
lastrow1 = sh.Cells(Rows.Count, "A").End(xlUp).row 
lastcolumn1 = sh.Cells(1, Columns.Count).End(xlToLeft).Column 

Dim L As Long 
For L = 2 To lastrow1 
    If _ 
    sh.Cells(L, Distance).Value <= CDbl(cboRadius.Value) Then 
     sh.Range("A" & L & ":" & lastcolumn1 & L).Copy _ 
     Destination:=sh2.Range("A" & L) 
    End If 
Next 

cboRadius.Value 사용자 정의 폼의 숫자 (즉 라인에 문제가 없습니다.) 나는이 코드를 실행하려고 할 때마다

는, 나는 "런타임 오류 '1004'를 얻을 : 개체 '_Worksheet'의 방법 '범위'대상 라인에 노란색 가리키는 화살표와 함께 실패 문제가 무엇

편집 :.? 에드 헤이우드 - 론스 데일 내가

sh.Range("A" & L & ":" & lastcolumn1 & L).Copy _ 
를 변경 제안 515,

sh.Range("A" & L & ":A" & lastcolumn1 & L).Copy _ 

이제 열 A 행 I

등 B, C, D, 그것을 변경하는 경우, 또는 복사된다. 문제는 그것이 lastcolumn1을 등록하지 않을 수 있고 L이 열/행 번호이며 그 대신 하나의 값으로 만들어서 범위 오작동을 일으킨다 고 생각합니다. 시도는 범위를 정의 할 때 "A"를 복사 할 추가

+0

당신이'lastcolumn1'로 가장 오른쪽 열을 선택하려는 경우, 당신은'xlToRight' 사용하지 않아야합니다 : 여기

은 원래의 질문에 따라 작동합니다 예입니다? – Jack

+0

@Jack 열에서 시작하여 오른쪽으로 가면 첫 번째 공백보다 항상 마지막 열 (항상 REAL 마지막 열이 아님)로 이동하지만 워크 시트의 마지막 셀로 이동하면 마지막으로 사용한 열이 될 데이터가있는 첫 번째 열로 가십시오. – user2140261

+0

@ user2140261 아주 좋은 지적입니다. 나는 그 속임수를 몰랐다. 고마워요 :) – Jack

답변

1

이되고, 다음 복사 모든 행에 걸쳐 루프를 시도하는 대신 결과가 끝납니다.

하지만 당신은 어쨌든 루프 행을 원하는 경우 : 당신이 열 문자 열이 아닌 번호를 사용하는 데 필요한 Range 기능을 사용하기 위해서는

.

여기에는 2 가지 옵션이 있습니다.

Chr(lastcolumn1 + 64) 

대신 lastcolumn1을 사용하십시오. 이 결함은 열 Z까지의 열에서만 작동하며 if 문 및 더 많은 코드가없는 이중 문자 열에서는 작동하지 않습니다. 열 ZZZ

If lastcolumn1> 52 Then 
    strColumnLetter = Chr(Int((lastcolumn1- 1)/52) + 64) & Chr(Int((lastcolumn1- 27)/26) + 64) & Chr(Int((lastcolumn1- 27) Mod 26) + 65) 
ElseIf lastcolumn1> 26 Then 
    strColumnLetter = Chr(Int((lastcolumn1- 1)/26) + 64) & Chr(Int((lastcolumn1- 1) Mod 26) + 65) 
Else 
    strColumnLetter = Chr(lastcolumn1+ 64) 
End If 

까지에 대한 다음과 같은 작업을해야하지만 당신은 또한 사용할 수 있습니다처럼

strColumnLetter = Split(Cells(1, lastcolumn1).EntireColumn.Address(False, False), ":")(0) 

또는

strColumnLetter = Left(Replace(Cells(1, lastcolumn1).Address(1, 0), "$", ""), InStr(1, Replace(Cells(1, lastcolumn1).Address(1, 0), "$", ""), 1) - 1) 

또는

strColumnLetter = Left(Cells(1, lastcolumn1).Address(1, 0), InStr(1, Cells(1, lastcolumn1).Address(1, 0), "$") - 1) 

그 작동하므로

많은 칼럼들 Excel이 유지됩니다.

숫자를 열로 변환하지 않으려는 경우 마지막 옵션 Cells 함수가 인수의 열 번호를 받아 들일 수 있으므로 문자의 범위를 가져 오는 것이 좋습니다.

sh.Range(cells(L,1), cells(L,lastcolumn1)) 

는 다시 난 그냥 그럼 그냥 뭐죠 왼쪽하지만 복사 원하지 않는 데이터를 필터링하는 필터 기능에 내장 된 표준을 사용하는 것이 좋습니다 것입니다. 이것은 더 많은 옵션을 추가하기위한 것입니다.

몇 가지 샘플 정보를 제공하면 필자에게 필터 사본 붙여 넣기를 수행 할 하위 항목을 작성할 수 있지만 데이터가 어떻게 설정되었는지는 알 수 없습니다.

Sub FilterAndCopy() 

Application.ScreenUpdating = False 
Application.EnableEvents = False 
Application.Calculation = xlCalculationManual 

Dim sh As Worksheet, sh2 As Worksheet 
Dim lastrow1 As Long 
Dim lastcolumn1 As Long 
Dim Distance As Long 
Distance = 14 


Set sh = ThisWorkbook.Sheets("Sample Address Database") 
Set sh2 = ThisWorkbook.Sheets("Workspace") 

lastrow1 = sh.Cells(Rows.Count, "A").End(xlUp).Row 
lastcolumn1 = sh.Cells(1, Columns.Count).End(xlToLeft).Column 

With sh 
    .Range(.Cells(1, 1), .Cells(lastrow1, lastcolumn1)).AutoFilter , _ 
    field:=Distance, _ 
    Criteria1:="<=" & CDbl(151), _ 
    Operator:=xlAnd 

    .Range(.Cells(2, 1), .Cells(lastrow1, lastcolumn1)).Copy _ 
    sh2.Range("A2") 

End With 

Application.ScreenUpdating = True 
Application.EnableEvents = True 
Application.Calculation = xlCalculationAutomatic 

End Sub 
+0

Ed Heywood-Lonsdale의 조언을 사용할 수 있었지만 필자는 코드를 합리화하기 위해 항상 노력하고있어 필터 아이디어가 흥미 롭습니다. 그래도 문제는 있습니다. 나는 정보의 큰 데이터베이스를 가지고 있고 그것이 올바른 기준에 부합되면 다른 시트에 복사하고있다. 그런 다음 원본 데이터베이스를 손상시키지 않고 검색 속도를 높이기 위해 해당 정보를 정렬합니다. –

+0

@ Al.Sal Filter ~> Copy ~> Paste를 구현하는 방법에 대한 예제로 내 대답을 업데이트했습니다. 문제가 있으면 알려주십시오. 항상 데이터의 COPY에서 코드를 실행하십시오. – user2140261

+0

@ Al.Sal 디버그를 클릭하면 강조 표시됩니다. – user2140261

2

:

sh.Range("A" & L & ":" & lastcolumn1 & L) 

가 난 그냥 엑셀 필터에 내장 된 사용 장소에 데이터를 필터링 할

sh.Range("A" & L & ":A" & lastcolumn1 & L) 
+0

그게 효과가 있었지만 이제는 A 열만 복사 중입니다. –

+0

Gah 줄 바꿈을 알아낼 수 없습니다.이 글을 읽을 수 있기를 바랍니다. 아, 죄송합니다. 나는 다음을 사용하는 경향이있다 : chr() 함수는 다음과 같이 변환한다. 문자 수 - 65는 a가되고, 66은 b가됩니다. 만약 당신이 Z를 지나칠 수 있다면, 필요하다면 "A"& ch (64 + lastcolumn1-26)가되는 if 함수를 가지고. –

+0

이것은 매우 도움이되었고 나는 그 자신을 우연히 발견하지 못했을 것입니다. 정말 고맙습니다! –