2012-06-26 2 views
1

다른 셀의 텍스트 값을 기반으로 셀 범위를 반복하고 레이블을 할당하려고 시도했습니다. 셀 J2 = "이 텍스트는"그럼 A2 = "이 라벨"나는 개체가VBA 텍스트의 사례 루프 선택

Private Function getPhase(ByVal cell As Range) As String 
Select Case cell.Text 
    Case "Text1" 
     getPhase = "Label1" 
    Case "Text2" 
     getPhase = "Label2" 
End Select 
End Function 


Sub setPhase() 
Dim cycle As Range 
Dim phase As Range 


Set cycle = Range("J2:J10") 
Set phase = Range("A2:A10") 

For Each cell In phase.Cells 
    phase.Text = getPhase(cycle) 
Next cell 

End Sub 
+1

'cell.value'을 대신 사용해 보셨습니까? – Gaffi

+0

오류가 발생한 행은 무엇입니까? – SeanC

+0

그냥 시도, "phase.Text = getPhase (주기)"실패 –

답변

7

이미 나를하지만 일부 내 게시물에 설명을하자 :) 답 :

을 가지고있다 : 여기
Sub setPhase() 

Dim phase As Range 
Set phase = Excel.ThisWorkbook.Sheets("Sheet1").Range("A2:A10") 
phase.Value = "=IF(J2=""Text1"",""Label1"",IF(J2=""Text2"",""Label2"",""""))" 

End Sub 
+1

오류의 원인을 설명하는 유일한 대답은 +1 –

+0

@ Jean-FrançoisCorbett +1 동의; 나는 어젯밤에 광산을 잡으려고 서둘 렸을 뿐이었다. (왜 OPer가 대답으로 표시하지 않을지 모르겠다.) – whytheq

+0

나는 Offset의 지름길을 아주 좋아한다. 그냥 'rng (0,9)' 'rng.Offset (0,9)'대신에 – whytheq

6

필요 알리는 런타임 오류 번호 (424)가 계속 지금 현재로

에서 셀 경우 그래서 루프를 변경했습니다 . 여기서는 두 범위가 동일한 길이라고 가정합니다.

Function getPhase(ByVal cell As Range) As String 

    Select Case cell.Value 
    Case "Text1" 
     getPhase = "Label1" 
    Case "Text2" 
     getPhase = "Label2" 
    End Select 


End Function 


Sub setPhase() 
Dim cycle As Range 
Dim phase As Range 


Set cycle = ThisWorkbook.Sheets("myexample").Range("J2:J10") 
Set phase = ThisWorkbook.Sheets("myexample").Range("A2:A10") 

Dim i As Integer 
For i = 1 To phase.Cells.Count 
    phase.Cells(i).Value = getPhase(cycle.Cells(i)) 
Next i 

End Sub 

... 또는 siddharth가 공식을 사용하도록 제안한 것으로 가정합니다.

또는 VBA를 통해 공식을 수행

Private Function getPhase(ByVal cell As Range) As String 
    Select Case cell.Text 
     Case "Text1" 
      getPhase = "Label1" 
     Case "Text2" 
      getPhase = "Label2" 
    End Select 
End Function 


Sub setPhase() 
    Dim cycle As Range 
    Dim phase As Range 


    Set cycle = ActiveSheet.Range("b2:b10") 
    Set phase = ActiveSheet.Range("A2:A10") 

    For Each cell In phase.Cells 
     cell.Value = getPhase(cycle.Cells(cell.Row, 1)) 
    Next cell 

End Sub 
+0

phase.value는 맞을 수도 있지만 이것은 현재주기 범위를 전혀 사용하지 않습니다. –

+0

사실 - 추가 편집이 필요합니다 - 무의식적으로 루프에서 셀을 사용해야합니다. 그렇지 않으면 루프가있는 포인트가 없습니다 – whytheq

+1

Doh, 당신은 저를 때려 눕 힙니다! –

5

내 버전

사용할 수 없습니다.

phase.Text = getPhase(cycle) 

.Text읽기 전용 속성입니다. 즉 당신은 그것에 쓸 수는 없지만 그것으로부터 만 읽을 수 있습니다. .Value

둘째, 같은 행에서 값을 선택하는 경우 두 번째 범위를 정의 할 필요가 없습니다. 항상 .Offset 속성을 사용할 수 있습니다. 또한 당신은 단지 그것에서 읽기 때문에 Select Case cell.Text 아무 문제가없는이

Option Explicit 

Sub setPhase() 
    Dim rng As Range, phase As Range 

    Set phase = Sheets("Sheet1").Range("A2:A10") 

    For Each rng In phase 
     rng.Value = getPhase(rng.Offset(, 9)) 
    Next 
End Sub 

Function getPhase(ByVal cl As Range) As String 
    Select Case cl.Value 
     Case "Text1" 
      getPhase = "Label1" 
     Case "Text2" 
      getPhase = "Label2" 
    End Select 
End Function 

를 참조하십시오. 그러나 .Value을 사용하는 것이 좋습니다. 이유는 .Value 속성이므로 .Text 속성이 화면에 표시되는 텍스트를 반환하는 셀의 실제 값을 반환합니다. 텍스트의 제한은 상위 버전의 Excel에서는 약 8,000 자입니다. 반면에 .Value에는 최대 32k 문자를 저장할 수 있습니다.

+0

+1이 나 자신을하고있었습니다. @Salmonerd가 변수를 '셀'로 선언한다는 것은 미리 정의 된 VBA 객체라는 점에서 나쁜 습관입니다. 'Cel' 또는'myCell'을 사용하는 것이 더 좋습니다. –

+0

셀에 대한 좋은 지적. 나는 내 습관을 사용하는 습관이있다 ...(그래서 나는 보통 "mycell"이라고합니다) 너무 많은 다른 언어를 사용하고 어느 단어가 예약되어 있는지 결코 기억하지 못하기 때문에! –

+0

+1 멋지게 완료했습니다. –