【Excel】 한 줄마다 빈 줄을 삽입하여 새 테이블을 만들고 싶은 경우 (비 VBA, VBA 모두에서 해결)

1. 이 기사에 관하여



이런 경우를 상정.
《원래 표가 있어, 그것을 행과 행의 사이에 일행 공행을 연 상태의 다른 표를 만들고 싶다. >>
<< 작성한 다른 테이블에 대해 빈 행에 새로 데이터를 삽입하고 싶습니다. >>

2.하고 싶은 일



↓ 이런 표가 존재할 때.

이런 느낌인 열의 데이터의 행과 행 사이에 일행 공행을 여는 테이블을 만들고 싶다.

【용례】
궁극적으로 새로운 "산지"열을 추가하여 산지별 과일의 가격을 관리한다.


3. 작성한 코드와 해설



VBA가 아닌 함수로 해결 (1)



다음과 같은 함수를 만듭니다.
사용법: 원래 테이블의 최상위 데이터와 동일한 행 번호에 작성할 테이블의 최상위 데이터를 삽입합니다.
=IF(MOD(ROW(),2) = MOD(ROW($C$3),2),
      INDIRECT(
                        ADDRESS(ROW($C$3) + (ROW()-ROW($C$3))/2,
                        COLUMN($C$3))
                       ),
      "")

※C3 셀은 원래가 되는 표의 열(공행을 열고 싶은 데이터의 열)의 번지입니다(자세한 것은 아래와 같은 화상을 부디).

MOD(ROW(),2) = MOD(ROW(\$C$3),2)
함수를 입력하는 셀과 C3 셀의 행 번호의 Even-odd가 일치하지 않으면 공백을 반환합니다.

ADDRESS(ROW(\$C\$3) + (ROW()-ROW(\$C\$3))/2,COLUMN(\$C\$3))
ADDRESS에서 원래 테이블의 데이터 주소를 가져옵니다.
지정하는 행은, 일행 빈 행을 열었을 경우에 입력 셀에 대응하는 원의 테이블의 셀의 번지의 행.

실제로 사용하면 이런 느낌이 듭니다.
(왼쪽이 원래의 표, 오른쪽이 공행 열린 새로운 표(미완성))

H 열의 항목 열에 함수를 복사합니다.

VBA가 아닌 함수로 해결 (2)



친숙한 VLOOKUP 함수로 구현했습니다.
(1)과 달리 조금 준비가 필요합니다.

① 원래 표를 준비한다.

② 먼저 id열만 복사한 새로운 표의 골격을 작성한다.

③함수를 입력한다(이미지라면 M열).


③에서 입력하는 함수에 다음과 같은 함수를 작성.
사용법: 원래 테이블의 최상위 데이터와 동일한 행 번호에 작성할 테이블의 최상위 데이터를 삽입합니다.
=IF(MOD(ROW(),2) = MOD(ROW($C$3),2),
     VLOOKUP(
                       (L3 - 1)/2 + 1,
                       $B$3:$C$10,
                       2),
      "")

(1)의 함수에 비해, VLOOKUP를 사용하기 때문에 가독성은 좋은가라고 생각합니다.

VBA의 자작 함수로 해결



이것은 위의 두 솔루션보다 유연성이 높습니다.

Module_InsertOneRow
'******************************************************************************************
'*関数名    :insertOneRow
'*機能      :一行飛ばしで空行挿入
'*引数(1)   :参照元の範囲
'*引数(2)   :移動先の表の一番上のデータのセルオブジェクト
'*戻り値    :True > 正常終了、False > 異常終了
'******************************************************************************************
Public Function insertOneRow(ByVal myRange As Range, _
                             ByVal topCell As Range) As String

    '定数
    Const FUNC_NAME As String = "insertOneRow"

    '変数
    Dim delta As Long                   '一番上のデータのセルと入力セルの行番号の差

    On Error GoTo ErrorHandler
    '戻り値初期値
    insertOneRow = ""

    '---以下に処理を記述---

    '変数の値を取得
    delta = Application.ThisCell.Row - topCell.Row

    'もしdeltaが範囲のセル数以上なら処理を終了
    If delta >= myRange.Count * 2 Then Exit Function

    'もし一番上のデータのセルと入力セルの行番号の差が偶数ならば値を格納する
    If delta Mod 2 = 0 Then
        '戻り値を格納
        insertOneRow = myRange(delta / 2 + 1)
    End If


ExitHandler:

    Exit Function

ErrorHandler:

        MsgBox "エラーが発生しましたので終了します" & _
                vbLf & _
                "関数名:" & FUNC_NAME & _
                vbLf & _
                "エラー番号" & Err.Number & Chr(13) & Err.Description, vbCritical

        GoTo ExitHandler

End Function


↓예를 들어, 함수의 경우와 같이 바로 옆에 새로운 표를 만드는 경우에도 사용할 수 있고,
(이 경우 첫 번째 인수에는 "\$C\$3:\$C\$10"을 지정하고 두 번째 인수에는 "\$H\$3"을 지정합니다.)


다른 곳에 새 테이블을 만들 수도 있습니다.
↓예를 들면 바로 아래로 만드는 경우
(이 경우 두 번째 인수는 "\$C\$16"을 지정합니다)


4. 끝에



위의 표에 대해 사용한 엑셀북을 github에 들었으므로
좋으면 참조하십시오.

Github : 사이에 한 줄 .xlsm



뭔가 보충이 있으면 댓글주세요.

좋은 웹페이지 즐겨찾기