2017-12-13 3 views
0

셀이 단어 "kit"로 시작하는 경우 범위의 첫 번째 셀의 처음 7자를 명명 된 범위 이름으로 설정하려고합니다. 여기 셀 내용을 명명 된 범위 이름으로 설정하는 VBA

내가 지금까지 무엇을 가지고 : 기본적으로
Sub DefineRanges() 
Dim rngStart As Range 
Set rngStart = Range("A1") 
Dim LastRow As Integer 
Dim RangeName As String 

For Each cell In Range("A2:A7") 
    If LCase(Left(cell.Value, 3)) = "kit" Then 

     RangeName = LCase(Left(cell.Value, 7)) 

     ActiveWorkbook.Names.Add _ 
      Name:=RangeName, _ 
      RefersToLocal:=Range(rngStart.Address & ":C" & cell.Row - 1) 
     Set rngStart = Range("A" & cell.Row) 

    End If 
    LastRow = cell.Row 
Next 
RangeName = LCase(Left(cell.Value, 7)) 

ActiveWorkbook.Names.Add _ 
    Name:=RangeName, _ 
    RefersToLocal:=Range(rngStart.Address & ":C" & LastRow) 
End Sub 

은 내가, 내 전체 범위를 통해 보는 단어 "키트"로 시작하는 모든 세포를 찾으려면, 그에서가는 명명 된 범위를 만들 셀을 "키트"로 시작하는 다음 셀까지 추가하고 해당 셀의 처음 7자를 범위 이름으로 지정하십시오. 지금까지 범위를 만들 수 있었지만 셀의 내용을 범위 이름에 전달하려고 할 때 문제가 발생합니다. 어떤 아이디어?

+1

어떤 오류 메시지가와있는 줄 수 있습니까? – QHarr

+0

그냥 400 오류 메시지를 제공합니다. RangeName = LCase (Left (cell.Value, 7)) 문제가있는 것 같습니다. 나는 그것이 다른 셀에 출력을 붙여 넣기 때문에 변수를 설정한다는 것을 알고있다. 그러나 어떤 이유로 변수 이름에 변수를 전달하지 않을 것이다. – user3047983

+1

루프 밖에서'cell'을 참조하려고한다. 오류. –

답변

2

여기서는 데이터가 마지막 질문과 유사하다고 가정합니다.

"Kit..." 절약 몇 반복을 찾기 위해 일치 사용 : 당신이

Sub DefineRanges() 
Dim rngStart As Long 
Dim RangeName As String 
Dim col As Long 
Dim PreFx As String 

col = 1 'change to the column number you need 
PreFx = "kat" 'change to the prefix you are looking for 

With Worksheets("Sheet7") 'change to your sheet 
    On Error Resume Next 
     rngStart = Application.WorksheetFunction.Match(PreFx & "*", .Columns(col), 0) 
    On Error GoTo 0 
    If rngStart > 0 Then 
     Do 
      i = 0 
      On Error Resume Next 
       i = Application.WorksheetFunction.Match(PreFx & "*", .Range(.Cells(rngStart + 1, col), .Cells(.Rows.Count, col)), 0) + rngStart 
      On Error GoTo 0 
      If i > 0 Then 
       RangeName = LCase(Left(.Cells(rngStart, col).Value, 7)) 
       ActiveWorkbook.names.Add name:=RangeName, RefersToLocal:=.Range(.Cells(rngStart, col), .Cells(i - 1, col + 2)) 
       rngStart = i 
      Else 'no more "kit..." so find the last row with data and use that 
       i = Application.WorksheetFunction.Match("zzz", .Columns(col)) 
       RangeName = LCase(Left(.Cells(rngStart, 1).Value, 7)) 
       ActiveWorkbook.names.Add name:=RangeName, RefersToLocal:=.Range(.Cells(rngStart, col), .Cells(i - 1, col + 2)) 

      End If 
     Loop While i < Application.WorksheetFunction.Match("zzz", .Columns(col)) 
    End If 
End With 
End Sub 

enter image description here

+1

'If rngStart Then'은 해킹처럼 읽습니다. 내재적 인 'Long' -'Boolean' 변환은 여기 신참 선수에게 명백하지 않을 수도 있습니다. –

+1

@ Mat'sMug 당신은 내가'rngstart> 0'해야한다고 말하고 있습니까? –

+1

'If rngStart> 0 Then'과 같이 갈 수 있습니다. 그렇지 않으면 훌륭한 대답 - 누락 된 것은'# N/A'가 발생하거나, 'KitKat'이 거기에있을 때 부 풀리지 않도록 셀 값에 대한 IsError와 길이 검사입니다. –