2014-12-03 3 views
1

저는 VBA에 익숙하지 않으므로 VBA 구문에 익숙하지 않은 경우 실례합니다.문자열과 워크 시트 사이에서 시트 이름을 변경 하시겠습니까?

내 문제는 다음과 같습니다. 유사한 데이터가 포함 된 많은 수의 시트가 있으며 각 시트의 셀에서 데이터를 조사하는 절차를 만들고 싶습니다. 셀은 항상 모든 셀의 동일한 범위에 있습니다. 시트)에 복사하고 내 시트 "DETAILS"에 복사하십시오. (S1, 다음 S2, 다음 ...),하지만 난 시트를 사용 ("S"& 1), VBA

나는 문자열의 모든 시트의 이름을 변환하려고, 그래서 그것을 반복 할 수 "s"& i을 문자열이 아니라 시트로 인식합니다.

의 "& i을 시트로 인식하려면 어떻게해야합니까?

Sub metro() 

Dim s1 As String 
Dim s2 As String 
Dim s3 As String 
Dim s4 As String 
Dim s5 As String 
Dim s6 As String 

Set s1 = "measures" 
Set s2 = "data" 
Set s3 = "eval1" 
Set s4 = "eval2" 
Set s5 = "observations" 
Set s6 = "improvements" 


Dim k As Integer 

    For k = 1 To 9 
     For i = 1 To 17 

     Sheets("s" & i).Cells(56, 2 + k).Value = Worksheets("DETAILS").Cells(18, 14 + k).Value 
     i = i + 1 
     Next 
    Next 

End Sub 
+0

"s1", "s2", "s3", "s4"등의 시트가 있습니까? 또한 각 시트 내에서 k가 1에서 9 인 17 개의 시트를 반복하려는 경우 For 루프가 거꾸로 보입니다. 당신이 모든 시트를 통해 1을 k로하고, 2를 모든 시트 등으로 k를하지 않는다면 ... – Chrismas007

답변

1

있는 가정 작동합니다 . 프로그래밍 101 오류입니다. 변수 x은 문자열 또는 문자 "x"과 다릅니다. 을 "measures"으로 평가할 수 없습니다. 당신이 무엇을해도 항상 "s1"으로 평가됩니다.

번호 매기기 규칙을 사용하여 시트를 반복 할 수 없습니다. 대신 배열이나 컬렉션을 사용해야합니다. 귀하의 예제는 "DETAILS"에서 읽고 때 "DETAILS"에 값을 복사하는

Dim sheetNames As Variant 
sheetNames = Array("measures","data","eval1","eval2","observations","improvements") 

Dim k As Integer 
For k = 1 To 9 
    Dim sheetName As Variant 
    For Each sheetName In sheetNames 
     Sheets(sheetName).Cells(56, 2 + k).Value = Worksheets("DETAILS").Cells(18, 14 + k).Value 
    Next 
Next 

원래의 질문 상태. 단순히 당신이 시트를 반복 할 때마다 덮어 쓸 수 Worksheets("DETAILS") 데이터의 원인이됩니다 할당

Worksheets("DETAILS").Cells(18, 14 + k).Value = Sheets(sheetName).Cells(56, 2 + k).Value 

반전. 대상 셀은 예제에서 i에 종속되어야합니다. 우리는 "measures"로 평가됩니다

Dim i As Integer 
For i = LBound(sheetNames) To UBound(sheetNames) 
    Worksheets("DETAILS").Cells(18 + i, 14 + k).Values = Sheets(sheetNames(i)).Cells(56, 2 + k).Value 
Next 

sheetNames(0)으로 For Each 루프를 대체하여 i를 재 도입 할 수 있습니다.나는 또한 목표 셀을 i으로 변경했지만, 원하는대로 변경할 수 있습니다.


이미 말했듯이, Set은 객체 참조를 할당하기위한 것입니다. 문자열, 정수, 배열과 같은 객체가 아닌 데이터 유형에는 사용할 수 없습니다.

왜 6 시트 이름 만 나열하면 i이 1에서 17로 반복되는지 알지 못합니다.

+0

아하! 당신은 좀 더 통찰력이 있습니다. 나는 왜 그 변수들이 그곳에 있었는지 알 수 없었다. 나는 OP가 실제로하려고했던 것을 보지 못했습니다. +1 – LimaNightHawk

+0

나는 또한 @ Christmas007에 따라 루프를 추가하는 편이 좋다 (바깥 쪽 루프의 시트). 그리고 * 세부 정보 시트는 출처가 아닌 대상이라고 생각합니다. – LimaNightHawk

+0

@LimaNightHawk "DETAILS"가 대상이면'.Cells (18, 14 + k) .Value'는 시트와 반복하지 않으므로 덮어 씁니다. 원래의 경우 'i'에 의존해야합니다. – cheezsteak

0

먼저 문자열 할당 전에 Set을 제거하십시오. 오류가 발생했습니다.

For 루프에서 i을 증가시켜야한다고 생각하지 않습니다. 이는 루프의 일부로 자동으로 발생합니다. 또한 게시물을 올바르게 읽으면 과제가 거꾸로 생각됩니다. "s1"에서 "DETAILS"로 데이터를 복사 하시겠습니까?

한 가지 더 : 새로운 시트를 루프 할 때마다 세부 정보가 덮어 쓰게되므로 각 시트마다 데이터가 이동하는 위치를 변경해야 할 수도 있습니다. 아마도 새로운 행에 있습니까?

그래서,이 당신의 시트 이름 등 "S1", "S2"는 문자열 "s1"로 평가 될 때 당신은 변수 s1로 평가 "s" & 1을 기대하고

Sub metro() 

    Dim s1 As String 
    Dim s2 As String 
    Dim s3 As String 
    Dim s4 As String 
    Dim s5 As String 
    Dim s6 As String 

    s1 = "measures" 
    s2 = "data" 
    s3 = "eval1" 
    s4 = "eval2" 
    s5 = "observations" 
    s6 = "improvements" 


    Dim k As Integer 
    Dim i As Integer 

    For i = 1 To 17 
     For k = 1 To 9 
      'adding i to the target row, so that each sheet will not overwrite previous data 
      Worksheets("DETAILS").Cells(18 + i, 14 + k).Value = Sheets("s" & i).Cells(56, 2 + k).Value 
     Next 
    Next 

End Sub 
관련 문제