2014-01-22 3 views
0

문제를 집중적으로 설명하고 시나리오와 관련된 모든 중요하지 않은 문제/스크립트를 제거합니다.여러 인접하지 않은 범위에서 선택한 범위의 일부를 변경하는 방법

사용자가 인접하지 않은 셀을 여러 개 선택합니다. VBA는 몇 가지 작업을 수행 한 다음 열을 삽입합니다. 선택한 셀이 열의 오른쪽에있는 경우 내용은 원래 선택된 셀의 한 열 오른쪽으로 이동합니다. exit sub 이전에 원래 내용으로 셀을 다시 선택해야합니다. 예컨대

,

  1. 사용자가 "A1", "C3"을 선택 "D4 : E6를".
  2. VBA를 이제 "B"
  3. "C3"의 내용 및 하나의 열을 삽입 "D4 : E6은"I "는 A1을 선택 VBA 필요"F6 E4 "
  4. "D3 "및 이동 ","D3 "및"E4 : F6 "을 선택하십시오.

이 나는 ​​몇 가지 방법을 고려했다 :

  1. 한 열 오른쪽에있는 전체 선택을 오프셋.

    selection.offset(0,1).select

    이 "A1"는 "B1"로 이동하는 것과 같이 좋은 해결책이 아니다. 사용자가 선택한 셀이 모두 삽입 된 열의 오른쪽에있는 경우에만 확인하면됩니다.

  2. 각 셀 선택 범위 (선택한 범위)를 배열에 넣습니다. 영향을받는 셀의 범위를 변경하십시오. vba를 사용하여 모두 다시 선택하십시오. 문제는 내가 쓴 VBA는 한 번에 범위의 배열 (여러 개의 인접하지 않은 셀)을 선택할 수 없다는 것입니다. 배열의 마지막 셀만 선택합니다. 다음은 요약 된 코드입니다.

    Sub mtArea() 
    
    Dim Cell, Rg, sRg() As Range 
    Dim h, i, j, k, noCell, Cnt As Long 
    Set Rg = Selection 
    
    noCell = Rg.Cells.Count 
    k = 0 
    
    ' assign each cell in selection to a specific array 
    
    If Rg.Areas.Count > 1 Then 
        ReDim sRg(noCell) 
        For Each Cell In Rg 
         k = k + 1 
         Set sRg(k) = Cell 
        Next Cell 
    End If 
    
    ' select the new located cells 
    
    For i = 1 To noCell 
    If sRg(i).Column > 5 Then ' assuming insert column is "E" 
        h = 1 
    Else 
        h = 0 
    End If 
    sRg(i).Offset(0, h).Select 
    Next i 
    
    End Sub 
    

    이 경우 원래 범위의 마지막 셀만 선택됩니다. 전체 sRg() 범위 배열을 선택하는 방법이 있습니까?

  3. I의이 방법 탐색 희망

    :

    Dim Rg as Range 
    Set Rg = Selection 
    

    사용자가 다수의 비 인접 셀을 선택하고, 각 셀은 RG에 변수 위치 범위 변경 VBA하는 방법이 있습니까?

어떻게해야합니까?

감사합니다.

답변

0

당신이 이름을 범위로를 할당하면 시도 세포가 열을 삽입 한 후 조정됩니다 :

Sub RememberTheCells() 
    Range("A1,C3,D4:E6").Select 
    Selection.Name = "Previous" 
    Columns("B:B").Insert Shift:=xlToRight 
    Range("Previous").Select 
    MsgBox Selection.Address 
End Sub 
+0

안녕하세요 게리의 학생, 감사합니다! 이것은 내 프로젝트에 필요한 것입니다. 선택한 범위를 변수 또는 배열에 넣는 대신, 이름을 지정해야합니다! 선택한 셀이 새로 삽입 된 열과 함께 이동했습니다. 훌륭함! 도와 주셔서 감사합니다. – Chen

+0

당신은 아주 환영합니다! –

+0

참고로, 범위를 선택한 후에도 범위 이름을 제거해야합니다. 그렇지 않으면이 범위 이름이 통합 문서에 계속 나타납니다. 범위 ("이전"). Name.Delete – Chen

0

이이

Sub InsertDemo() 
    InsertAndAdjustSelection 2 

End Sub 

Sub InsertAndAdjustSelection(Col As Long) 
    Dim strAddress() As String 
    Dim i As Long 

    ' Save adresses of selected cells 
    strAddress = Split(Selection.Address, ",") 

    ' Insert Column 
    Columns(Col).Insert 

    ' Unpdate saved addresses 
    For i = 0 To UBound(strAddress) 
     If Range(strAddress(i)).Column >= Col Then 
      strAddress(i) = Range(strAddress(i)).Offset(, 1).Address 
     End If 
    Next 

    ' Select range 
    Range(Join(strAddress, ",")).Select 
End Sub 
+0

안녕하세요 크리스, 감사합니다! 코드가 작동했습니다. 그리고 여러 셀을 선택하는 주소를 분할하여 범위를 조작하는 새로운 방법을 가르쳐 주셨습니다. 놀랄 만한. 확실히 가치있는 교훈.고마워요! – Chen

+0

코드와 게리의 학생 코드가 모두 제 상황에서 완벽하게 작동합니다. 그러나 stackoverflow 경우에만 한 솔루션에 투표 할 수 있습니다. 그래서 나는 적은 선으로 하나를 선택한다. :) – Chen