【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
뭔가 보충이 있으면 댓글주세요.
Reference
이 문제에 관하여(【Excel】 한 줄마다 빈 줄을 삽입하여 새 테이블을 만들고 싶은 경우 (비 VBA, VBA 모두에서 해결)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/dede-20191130/items/ce3ce8f12b9c4a4c1dc3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
↓ 이런 표가 존재할 때.
이런 느낌인 열의 데이터의 행과 행 사이에 일행 공행을 여는 테이블을 만들고 싶다.
【용례】
궁극적으로 새로운 "산지"열을 추가하여 산지별 과일의 가격을 관리한다.
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
뭔가 보충이 있으면 댓글주세요.
Reference
이 문제에 관하여(【Excel】 한 줄마다 빈 줄을 삽입하여 새 테이블을 만들고 싶은 경우 (비 VBA, VBA 모두에서 해결)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/dede-20191130/items/ce3ce8f12b9c4a4c1dc3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
=IF(MOD(ROW(),2) = MOD(ROW($C$3),2),
INDIRECT(
ADDRESS(ROW($C$3) + (ROW()-ROW($C$3))/2,
COLUMN($C$3))
),
"")
=IF(MOD(ROW(),2) = MOD(ROW($C$3),2),
VLOOKUP(
(L3 - 1)/2 + 1,
$B$3:$C$10,
2),
"")
'******************************************************************************************
'*関数名 :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
위의 표에 대해 사용한 엑셀북을 github에 들었으므로
좋으면 참조하십시오.
Github : 사이에 한 줄 .xlsm
뭔가 보충이 있으면 댓글주세요.
Reference
이 문제에 관하여(【Excel】 한 줄마다 빈 줄을 삽입하여 새 테이블을 만들고 싶은 경우 (비 VBA, VBA 모두에서 해결)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/dede-20191130/items/ce3ce8f12b9c4a4c1dc3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)