2012-11-12 2 views
6

단일 셀을 사용하고 (NavigateArrow 분석을 통해) 통합 문서의 모든 종속 항목을 식별하고 범위 위치를 배열에 추가하는 VBA 코드를 작성했습니다. 여기에서 각 종속을 업데이트하고 원본 단일 셀에 대한 참조를 다른 단일 지정된 셀로 변경할 수 있기를 원합니다.VBA의 다른 셀 참조로 종속 변수 교체

내가 여기에서 가지고있는 특정 어려움은 각 종속이 어디 있는지 알고 있지만 원래 셀에 대한 참조가 수식의 시작, 중간 또는 끝 부분에있을 수 있으며 행/열/둘 다 고정되어 있고 다른 워크 시트에있을 수 있으므로 그 앞에 워크 시트 참조가 있어야합니다. 따라서 이러한 잠재적 인 차이점 때문에 각 종속 셀에서 찾기 쉽고 바꿀 수 없으며 원래의 고정은 각 셀 참조에 보관됩니다.

이 문제에 대해 우아하고 세련되지 않은 VBA 솔루션이 있습니까?

+1

대체 할 필요가있는 참조/주소의 네 가지 변형 (상대/고정 행/고정 행/고정 행 + 열)이있는 것처럼 보이므로 모든 루프를 반복하고 찾을 수 있으면 바꿀 수 있습니다 (조정 그에 따라 대체 주소) –

+0

그래, 나는 다른 어떤 방법도 볼 수 없다. 그것은 조금 clunky 인 것처럼 수치 스럽다. 당신의 도움을 주셔서 감사합니다! –

+0

나는 그것들이 유일한 변종은 아니라고 생각합니다 - 그것도 명명 된 범위를 포함하지 않을까요? 아니면 별도의 참조로 간주됩니까? –

답변

1

정규 표현식 또는 정규식이 내가 생각하는 바입니다.

([A-Z0-9]*)!(\${0,1})([A-Z]{1,3})(\${0,1})([0-9]*) 

는 "Sheet1에! A1"같은 것을 일치합니다 다음 패턴 "Sheet1에! $ A $ 1", "Sheet1에! $ A1", "Sheet1의! A $ 1"

설명 :

([A-Z0-9]*)! = Find anything that is before "!" 
(\${0,1}) = $ or nothing 
([A-Z]{1,3}) = between one and three letters 
([0-9]*) = Any number 

원하는 패턴 만 수정하면 쉽게 수정할 수 있습니다. 특히 ([A-Z0-9] *)! (\ $ {0,1}) B (\ $ {0,1}) 1은 B ($) 1과 일치합니다 ... 문자열 조작을 사용하여 Regexp 패턴을 구성하고 올바르게 입력해야합니다.

당신이 당신에게 당신의 목표를 달성하기 위해 모든 도구를 제공해야합니다 (도구> 참조)

다음 코드를보십시오 "5.5은 마이크로 소프트 VBScript 정규 표현식"참조해야합니다

Sub ReplaceReference() 
' Reference: Microsoft VBScript Regular Expressions 5.5 

Dim RegEx As Object 
Set RegEx = New RegExp 

Dim s As String 

' Here I have hardcoded the reference to the original cell for demonstration purposes 
s = "Sheet1!$AB$2" 


' Replacement: New sheetname, New Column, new row number 
Dim NewCol As String, NewRow As String 
NewCol = "C" 
NewRow = "10" 

Dim NewSheet As String 
NewSheet = "Sheet2" 


With RegEx 
    .Pattern = "([A-Z0-9]*)!(\${0,1})([A-Z]{1,3})(\${0,1})([1-9]*)" 
    .IgnoreCase = True 
    .Global = True 
End With 


Debug.Print RegEx.Replace(s, NewSheet & "!" & "$2" & NewCol & "$4" & NewRow) 


End Sub 

건배 줄리앙

0

VBA를 잘라내어 원본 셀을 붙여 넣으십시오. 그런 다음 Excel은 영광스러운 다양한 셀 참조를 조정합니다.

참조로 몇 개의 셀을 만든 다음 매크로 레코더를 사용하여 생성 된 VBA에서 셀을 선택하고 내용을 잘라내어 복사 할 때 발생할 수있는 것을 확인했습니다. 예상대로 다음과 같이 동작한다 : 이것은 다음 워크 시트에 적용됩니다

Range("A1").Select 
Selection.Cut 
Range("B1").Select 
ActiveSheet.Paste 

:

A1 1 
A2 =A1 
A3 =$A$1 
A4 =1+A1 
A5 =1+A1+1 

매크로를 실행 한 후, 모든 참조는 B1 대상 셀을 가리 킵니다.