【Excel-VBA】모든 패턴 데이터 작성 매크로
4119 단어 ExcelVBA
소개
작성 경위
(정식 명칭을 몰랐지만,)
어느 몇개의 항목을 모두 조합한 패턴 데이터를 작성하는 매크로를 만들고 싶었지만,
생각 외에 시간이 걸렸기 때문에 잊지 않도록 남겨두기로 했다.
매크로로 하고 싶었던 일
입력 정보
3 X 3 X 2=그러므로 18가지의 데이터를 할 수 있을 것.
출력 정보
품목
품목
품목
대단해!
너는 재귀가 약한 친구
뭐야?
대단해!
너는 재귀가 약한 친구
뭐야!
대단해!
너는 물건을 Nothing하지 않는 친구
뭐야?
대단해!
너는 물건을 Nothing하지 않는 친구
뭐야!
대단해!
넌 코피페만 이른 친구
뭐야?
대단해!
넌 코피페만 이른 친구
뭐야!
타노시!
너는 재귀가 약한 친구
뭐야?
타노시!
너는 재귀가 약한 친구
뭐야!
타노시!
너는 물건을 Nothing하지 않는 친구
뭐야?
타노시!
너는 물건을 Nothing하지 않는 친구
뭐야!
타노시!
넌 코피페만 이른 친구
뭐야?
타노시!
넌 코피페만 이른 친구
뭐야!
헤키 헤키,
너는 재귀가 약한 친구
뭐야?
헤키 헤키,
너는 재귀가 약한 친구
뭐야!
헤키 헤키,
너는 물건을 Nothing하지 않는 친구
뭐야?
헤키 헤키,
너는 물건을 Nothing하지 않는 친구
뭐야!
헤키 헤키,
넌 코피페만 이른 친구
뭐야?
헤키 헤키,
넌 코피페만 이른 친구
뭐야!
출처
excel-vba 소스Option Explicit
Const DELIMITER = ","
Dim m_maxCol As Long
Dim m_x As Long
Dim m_shtMain As Variant
Dim m_shtOut As Variant
Dim m_objOutList As Variant
Dim m_outInList As Variant
Private Sub Init()
Set m_shtMain = ThisWorkbook.Sheets("Sheet1")
Set m_shtOut = ThisWorkbook.Sheets("Sheet2")
Application.ScreenUpdating = False
End Sub
Private Sub Main()
Dim maxRow As Long
Dim strVal As String
Dim col As Long
Dim i As Long
strVal = ""
m_x = 1
col = 1
m_maxCol = CLng(InputBox("桁数を入力してください。"))
maxRow = 0
For i = 1 To m_maxCol
If i = 1 Then
maxRow = m_shtMain.Cells(Rows.Count, i).End(xlUp).row
Else
maxRow = maxRow * m_shtMain.Cells(Rows.Count, i).End(xlUp).row
End If
Next i
'最大行数チェック
If Rows.Count >= maxRow Then
'初期化
m_shtOut.Range(m_shtOut.Cells(1, 1), m_shtOut.Cells(Rows.Count, 1)).ClearContents
'リスト生成
m_objOutList = m_shtOut.Range(m_shtOut.Cells(1, 1), m_shtOut.Cells(maxRow, 1))
m_outInList = m_shtMain.Range(m_shtMain.Cells(1, 1), m_shtMain.Cells(maxRow, m_maxCol))
'再帰処理
Call 再帰(strVal, col)
'出力
m_shtOut.Range(m_shtOut.Cells(1, 1), m_shtOut.Cells(maxRow, 1)) = m_objOutList
Else
Call MsgBox("最大行数を超えるのでNG")
End If
End Sub
Private Sub 再帰(ByVal strVal, ByRef col)
Dim row As Long
Dim strBuf As String
Dim i As Long
row = m_shtMain.Cells(Rows.Count, col).End(xlUp).row
strBuf = strVal
For i = 1 To row
If strVal <> "" Then
strVal = strVal & DELIMITER & m_outInList(i, col)
Else
strVal = m_outInList(i, col)
End If
If col < m_maxCol Then
col = col + 1
Call 再帰(strVal, col)
strVal = strBuf
Else
m_objOutList(m_x, 1) = strVal
m_x = m_x + 1
strVal = strBuf
End If
Next i
col = col - 1
End Sub
Private Sub Dest()
Application.ScreenUpdating = True
End Sub
Sub test01()
Call Init
Call Main
Call Dest
End Sub
사용법
excel-vba 소스
Option Explicit
Const DELIMITER = ","
Dim m_maxCol As Long
Dim m_x As Long
Dim m_shtMain As Variant
Dim m_shtOut As Variant
Dim m_objOutList As Variant
Dim m_outInList As Variant
Private Sub Init()
Set m_shtMain = ThisWorkbook.Sheets("Sheet1")
Set m_shtOut = ThisWorkbook.Sheets("Sheet2")
Application.ScreenUpdating = False
End Sub
Private Sub Main()
Dim maxRow As Long
Dim strVal As String
Dim col As Long
Dim i As Long
strVal = ""
m_x = 1
col = 1
m_maxCol = CLng(InputBox("桁数を入力してください。"))
maxRow = 0
For i = 1 To m_maxCol
If i = 1 Then
maxRow = m_shtMain.Cells(Rows.Count, i).End(xlUp).row
Else
maxRow = maxRow * m_shtMain.Cells(Rows.Count, i).End(xlUp).row
End If
Next i
'最大行数チェック
If Rows.Count >= maxRow Then
'初期化
m_shtOut.Range(m_shtOut.Cells(1, 1), m_shtOut.Cells(Rows.Count, 1)).ClearContents
'リスト生成
m_objOutList = m_shtOut.Range(m_shtOut.Cells(1, 1), m_shtOut.Cells(maxRow, 1))
m_outInList = m_shtMain.Range(m_shtMain.Cells(1, 1), m_shtMain.Cells(maxRow, m_maxCol))
'再帰処理
Call 再帰(strVal, col)
'出力
m_shtOut.Range(m_shtOut.Cells(1, 1), m_shtOut.Cells(maxRow, 1)) = m_objOutList
Else
Call MsgBox("最大行数を超えるのでNG")
End If
End Sub
Private Sub 再帰(ByVal strVal, ByRef col)
Dim row As Long
Dim strBuf As String
Dim i As Long
row = m_shtMain.Cells(Rows.Count, col).End(xlUp).row
strBuf = strVal
For i = 1 To row
If strVal <> "" Then
strVal = strVal & DELIMITER & m_outInList(i, col)
Else
strVal = m_outInList(i, col)
End If
If col < m_maxCol Then
col = col + 1
Call 再帰(strVal, col)
strVal = strBuf
Else
m_objOutList(m_x, 1) = strVal
m_x = m_x + 1
strVal = strBuf
End If
Next i
col = col - 1
End Sub
Private Sub Dest()
Application.ScreenUpdating = True
End Sub
Sub test01()
Call Init
Call Main
Call Dest
End Sub
사용법
(엑셀의 최대 자리수를 넘으면 출력할 수 없기 때문에 주의. 거기까지 데이터 만들지 않을까 생각해 처리를 만들지 않았다.)
마지막으로
처음에는 루프 제어만으로 갈 수 있을까 생각했지만,
재귀를 잡지 않으면 어려울까라고 생각해 보았지만 나중에 잘 가지 않고
코피페 프로그래머 스킬밖에 없는 자신과 통감했다.
어쩌면 루프에서도 갈 수 있겠지만 생각하고, 질리기 때문에 끝난다.
일로 재귀를 쓸 수 없는 상황이라고 본 적이 없으니까 아마 괜찮다고 믿는다
Reference
이 문제에 관하여(【Excel-VBA】모든 패턴 데이터 작성 매크로), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/homuhomu20140904/items/f61479c756fd728bfebc
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(【Excel-VBA】모든 패턴 데이터 작성 매크로), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/homuhomu20140904/items/f61479c756fd728bfebc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)