동일한 시트에서 동일한 수식을 선택하는 EXCEL 매크로

7158 단어 VBAExcel

소개



셀에 수식을 입력하고 셀을 복사하면 셀에 설정된 수식은 동일하지만 상대 참조를 사용하면 수식 표시줄에 표시되는 문자열은 달라집니다.
이 때 수식 바에 표시되는 문자열이 다르더라도 상대 참조가 같은 수식의 셀을 선택하는 매크로가 됩니다.

우선 수식을 셀에 입력



먼저 B2, B7, B12, B17 셀에 각각 왼쪽 위 셀을 참조하는 수식을 입력합니다.
그때
B2 셀에는 절대 참조
B7 셀에 상대 참조
B12 셀에는 열만 절대 참조
B17 셀에는 행만 절대 참조
수식을 입력합니다.
그 후 각 셀을 가로 3열, 세로 3행에 각각 복사합니다.
실행 결과는 이렇게 됩니다.


그 내용을 수식으로 표시한 내용은 다음과 같습니다.


이때 괘선으로 둘러싼 부분이 각각 같은 수식이 됩니다.

소스 코드


Public Sub SelectSameFormula()
    'ActiveCellの数式と同一の数式のセルを検索の対象とする
    Dim strFormulaR1C1 As String
    strFormulaR1C1 = ActiveCell.FormulaR1C1
    If strFormulaR1C1 = "" Then
        Exit Sub
    End If

    '総当たりするセルの領域を数式の入力されたセルに限定する
    Dim objFormulaRange As Range
    Set objFormulaRange = Cells.SpecialCells(xlCellTypeFormulas)

    Dim Result As Range
    Set Result = ActiveCell
    Dim objCell As Range

    '数式の入力されたセルを総当たりして同じ数式のセルを取得
    For Each objCell In objFormulaRange
        If objCell.FormulaR1C1 = strFormulaR1C1 Then
            Set Result = Application.Union(Result, objCell)
        End If
    Next

    Call Result.Select
End Sub

사용법



선택한 수식의 입력 셀을 선택하고
SelectSameFormula() 매크로를 실행하십시오.
같은 수식의 입력된 셀이 모두 선택되면 성공입니다.
활성 셀에 수식이 설정되어 있지 않으면 아무 작업도 수행하지 않습니다.

해설



수식을 R1C1 형식으로 표시한 결과를 보면 일목요연처럼,
R1C1 형식으로 얻은 수식이 동일한 셀을 모두 선택하고 있습니다.

여담



여기에서는 다음 기사를 위한 참고 기사가 됩니다.
조건부 서식을 통합하는 EXCEL 매크로

만약 Range 객체의 프로퍼티에 FormulaR1C1이 없고 Formula밖에 없다면 실현이 불가능할까요?
실은 VBA에는 ConvertFormula라는 함수가 준비되어 있어 A1 형식의 수식을 R1C1 형식으로 변환할 수 있습니다.

위의 소스인 FormulaR1C1을 사용하고 있는 개소를 이하에 재기록하면 같은 결과를 얻을 수 있습니다.
변경 전 strFormulaR1C1 = ActiveCell.FormulaR1C1변경 후 strFormulaR1C1 = Application.ConvertFormula(ActiveCell.Formula, xlA1, xlR1C1, , ActiveCell)변경 전 If objCell.FormulaR1C1 = strFormulaR1C1 Then변경 후 If Application.ConvertFormula(objCell.Formula, xlA1, xlR1C1, , objCell) = strFormulaR1C1 Then
중요한 것은 ConvertFormula() 함수의 네 번째 인수와 다섯 번째 인수입니다.
네 번째 인수는 Microsoft의 도움말에 따라 다음과 같습니다.

변환된 참조 형식을 지정하는 XlReferenceType 상수입니다.
이 인수를 생략하면 참조 유형은 변경되지 않습니다.

다섯 번째 인수는 Microsoft 도움말에 따라 다음과 같습니다.

단일 셀을 포함하는 Range 객체를 지정합니다.
이 셀은 상대 참조의 기준점입니다.

Microsoft의 도움말은 여전히 ​​불친절하고 의미가 잘 모르지만,
내용은 변경 전 또는 변경 후의 형식에 R1C1 형식을 지정했을 경우의,
상대 참조의 기점이 되는 셀을 지정하라는 것입니다.
※ 인수를 생략했을 경우는 이하의 실험용 매크로의 결과, 셀 함수로부터 실행되었을 경우는, 셀 함수가 입력되고 있는 셀(Application.ThisCell). 매크로에서 실행되면 ActiveCell이 적용되는 것 같습니다.

즉, 이번 경우에는
네 번째 인수는 생략하여 절대 참조를 절대 참조로 유지하고 상대 참조를 상대 참조로 R1C1 형식으로 변환합니다.
다섯 번째 인수는 변경 후의 형식에 R1C1 형식을 지정했기 때문에 상대 참조시의 기점이 되는 셀(이번 경우에는 수식이 입력되어 있는 셀 그 자체)을 지정합니다.

실험용
'*****************************************************************************
'[概要] ConvertFormula()関数の第5引数を省略した場合のR1C1形式の起点となるセルを調査する
'[戻値] R1C1形式の起点となるセルのアドレス
'*****************************************************************************
Public Function RelativeTo() As String
    Dim str As String
    str = Application.ConvertFormula("A1", xlA1, xlR1C1)
    'A1セルからの相対位置の符号を反転 例:R[-1]C[-1] → R[+1]C[+1]
    str = Replace(str, "-", "+")
    RelativeTo = Application.ConvertFormula(str, xlR1C1, xlA1, , Range("A1"))
End Function

좋은 웹페이지 즐겨찾기