: 엑셀에서 특정한 시트 하나만 남기고 모두 삭제 or 원하는 시트만 남기고 모두 삭제하기
실행 결과
: 지정한 시트만 남고 모두 삭제됨
코드
Sub DeleteSheet()
Dim xWs As Worksheet
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'Error Window Hidden
For Each xWs In Application.ActiveWorkbook.Worksheets
If xWs.Name <> "Sheet1" And xWs.Name <> "남길시트이름" Then 'Sheet1 과 남길시트이름 두개만 남기고 모두 삭제됨
xWs.Delete
End If
Next
Application.DisplayAlerts = True
Application.ScreenUpdating = True
'Error Window Option Activate
End Sub
Dim lastrow As Long
Dim lngE As Long
Dim rngD As Range
Dim i As Long
Dim j As Long
Dim Data As Long
Dim xLastRow As Long
Dim RealDataLastRow As Long
Dim DeletedWantedRow As Long
Dim LastLoopIndex As Long
Dim co As Long
Dim incRow As Long
Dim k As Long
Dim LastDateTime As Long
Dim xWs As Worksheet
lastrow = Sheets("20210421").Cells(Rows.Count, "F").End(xlUp).Row
Sheets("20210421").Range("F2:F" & lastrow).AdvancedFilter _
Action:=xlFilterCopy, _
CopyToRange:=Sheets("Sheet1").Range("B5"), _
Unique:=True
'DIstinct Part
'Dintct 된 데이터 갯수만큼의 전처리시트가 필요
xLastRow = Sheets("Sheet1").Cells(Rows.Count, "B").End(xlUp).Row - 4
' 6 제대로 나왔음 -> 데이터의 총 갯수
For j = 1 To xLastRow
' 1 2 3 4 5 6
lngE = Sheets("20210421").Cells(Rows.Count, "F").End(xlUp).Row
For i = 2 To lngE
If Sheets("20210421").Range("F" & i).Value = Sheets("Sheet1").Range("B" & (4 + j)).Value Then
If rngD Is Nothing Then
Set rngD = Sheets("20210421").Range("F" & i).Offset(0, -5).Resize(1, 6)
Else
Set rngD = Union(rngD, Sheets("20210421").Range("F" & i).Offset(0, -5).Resize(1, 6))
End If
End If
Next
If rngD Is Nothing Then
MsgBox "복사할 범위가 없습니다."
Else
Sheets.Add after:=Sheets(2 + j)
Sheets(3 + j).Range("A1").CurrentRegion.Offset(1, 0).Clear
rngD.Copy Sheets(3 + j).Range("A1")
End If
'시트를 추가하고 데이터 사전 전처리
co = Sheets(3 + j).Range("F1").CurrentRegion.Rows.Count
For incRow = 0 To co
If Sheets("Sheet1").Range("B" & (4 + j)).Value <> Sheets(3 + j).Cells(1, "F").Offset(0, 0).Value Then
'시트와 데이터를 비교
Sheets(3 + j).Range("F1").Select
Selection.EntireRow.Delete
End If
Next
'데이터 사전가공 완료
Next
For k = 1 To xLastRow
LastDateTime = Sheets(3 + k).Cells(Rows.Count, "B").End(xlUp).Row
'모든 시트의 D1에는 데이터가 있음
Sheets(3 + k).Activate
Range("D1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
' 카피부
Sheets("Sheet1").Activate
Cells(5, "E").Offset(k - 1, 0).Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
Sheets("Sheet1").Cells(4 + k, "C").Offset(0, 0).Value = Sheets(3 + k).Range("B1").Value
Sheets("Sheet1").Cells(4 + k, "D").Offset(0, 0).Value = Sheets(3 + k).Range("B" & LastDateTime).Value
Next
'마무리 처리
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For Each xWs In Application.ActiveWorkbook.Worksheets
If xWs.Name <> "Sheet1" And xWs.Name <> "20210421" And xWs.Name <> "Sheet2" Then 'Sheet1 과 남길시트이름 두개만 남기고 모두 삭제됨
xWs.Delete
End If
Next
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Sheets("Sheet1").Activate
OLED 디스플레이 사용을 위해 필요한 라이브러리와 소스코드를 정리했습니다. 먼저 확인해야 할 것은 OLED 디스플레이의 드라이버 칩입니다. 드라이버 칩에 따라 라이브러리와 사용방법이 완전히 틀려집니다.
Adafruit 그래픽 라이브러리 (SSD 1306 및 일부 TFT LCD 등…)
일반적으로 많이 사용. Adafruit 에서 제작한 라이브러리를 사용하거나 좀 더 원시적인 코드로 구동이 가능합니다. Adafruit 라이브러리는 각종 도형 및 폰트, 선, 채우기 함수를 제공하는 대신 그래픽 버퍼로 램을 꽤 많이 잡아 먹습니다. 아두이노가 보통 2KByte 램으로 돌아간다는 점을 생각하면 램이 부족한 경우가 생길 수 있습니다. 램이 부족할 경우 각종 변수값이 이상하게 입력되고 화면이 찢어지는(?) 현상이 발생합니다.
Adafruit 라이브러리는 2개로 구성되어 있습니다. GFX 라이브러리가 공통된 drawing 함수를 제공하고, 드라이버 칩에 따라 적절하게 동작하도록 드라이버 라이브러리가 맞물리도록 되어 있습니다.
SSD1325, ST7565, ST7920, UC1608, UC1610, UC1701, PCD8544, PCF8812, KS0108, LC7981, SBN1661, SSD1306, T6963 등을 지원하는 범용 그래픽 드라이버로 u8glib 라이브러리가 있습니다. 8비트 마이크로 컨트롤러에서 사용할 수 있는 가장 막강한 라이브러리입니다. 화면 업데이트가 조금 느린대신 램을 적게 차지하고 안정적입니다.