|
식별부호가 붙은 숫자를 음양의 정상기호로 전환하기 <목차로>
다음의 예는 음수의 경우 앞에 "M"을 붙여 표기한 경우 이를 "-"부호로 전환하여 최소값을 구하는 예이다. =MIN(IF(ISTEXT(A1:A10),RIGHT(A1:A10,LEN(A1:A10)-1)*-1,A1:A10)) 여기서 A1:A10 는 작업대상영역이며, 위의 함수는 배열함수이므로 이식을 변경하거나 입력하려면 항상 Ctrl+Shift+Enter 를 동시에 눌러야 한다. MIN을 MAX로 바꾸면 최대값을 구할 수 있다.
>>>>> 또 다른 셀서식 표현방법 이 예는 사용자 서식을 이용하여 입력을 통생의 방법으로 하면 셀에 원하는 형식대로 표현된다. 즉 셀에 123, -123 을 입력하면 123, M123으로 표현된다. 서식>> 셀...>> 사용자정의>> 표시형식 에서 #,##0.00;"M"#,##0.00 과 같이 써준다. 여기서 소숫점 아래에 0을 원하는 대로 넣어 주면 소숫점이하의 자릿수를 나타낼 수 있다 위의 서식에 의하면 "-36.247"은 "M36.25"으로 표시된다. >>>>> 이런 방법도 있군요 이 예는 사용자서식을 사용하지 않고 정상적인 입력값을 음수 일때 '-"대신 "M"을 붙여준다. =IF(A1<0,"M"&TEXT(ABS(A1),"00"),TEXT(A1,"00")) 만약 입력데이터가 M05와 같이 "M"이 있을 경우 다음의 식은 "M"대신에 "-"를 붙여준다. =IF(LEFT(A1)="M", -RIGHT(A1,LEN(A1)-1),A1)
Sub Read_File_Name() Dim x As String x = Dir("*.xls") While x <> "" MsgBox x x = Dir() Wend End Sub
상태표시 Bar 나타내기 (Status Bar Showing ) <목차로> Sub percent_Bar() For R = 1 To 2500 ActiveSheet.Cells(1, 1).Value = R Application.StatusBar = Int(R / 25) & " % done" Next Application.StatusBar = False End Sub
Sub SortSheets() Dim I As Integer, J As Integer For I = 1 To Sheets.Count For J = 1 To I - 1 If UCase(Sheets(I).Name) < UCase(Sheets(J).Name) Then Sheets(I).Move before:=Sheets(J) Exit For End If Next J Next I End Sub
Sub Last_Cell() Set rng = Range("b35:g35") ReDim arr(1 To rng.Count) For i = 1 To rng.Count arr(i) = rng(i).End(xlUp).Row Next MsgBox "마지막 행은 " & Application.Max(arr) & "입니다." End Sub
Sub Setsize() With Worksheets("Sheet1") Set rng1 = .Range("A1").CurrentRegion Set rng1 = rng1.Offset(1, 0).Resize(rng1.Rows.Count - 1) .ComboBox1.ColumnCount = 2 .ComboBox1.ColumnHeads = True .ComboBox1.ColumnWidths = rng1.Columns(1).Width _ & "," & rng1.Columns(2).Width .ComboBox1.Width = rng1.Columns(1).Width + _ rng1.Columns(2).Width + 12 .ComboBox1.ListFillRange = rng1.Address End With End Sub
' The next procedure goes into the sheet module for the sheet with the combobox. Private Sub ComboBox1_Change() strWidth = ActiveSheet.ComboBox1.ColumnWidths iloc = InStr(strWidth, "pt") strlen = Left(strWidth, iloc - 2) Debug.Print strlen ActiveSheet.ComboBox1.Width = CLng(strlen) + 12 End Sub
Sub Find_Exact_Cell() Dim Rng1 As Range Set Rng1 = ActiveSheet.Range("a1:a10").Find(What:="XXX", _ After:=Range("a1"), _ LookIn:=xlFormulas, _ LookAt:=xlPart, _ SearchOrder:=xlRows, _ SearchDirection:=xlNext, _ MatchCase:=False) MsgBox "찾는 셀은" & Rng1.Address & "입니다" End Sub
bcd라는 text만 들어있는 셀을 찾으려면 LookAt:=xlPart 을 LookAt:=xlWhole 로 바꾼다.
<주의> 만약 셀에 다음과 같은 내용이 들어 있다면 a bcd efg hij abcd bcd가 부분적으로 들어 있는 셀을 찾으려면 what:="bcd" 로 고치고 LookAt:=xlPart을 그대로 두면 되고, 결과는 abcd가 있는 셀을 나타낸다. xlPart는 셀 내용중 부분적으로 bcd가 들어 있는 셀을 검색하기 때문임.
CONTROL ITEM 리스트하기 <목차로> 다음의 코드는 현Workbook의 모든 폼에 있는 Control Item의 이름을 List한다. Sub ListFormControls() Set cmpProjectComponents = ThisWorkbook.VBProject.VBComponents For Each cmp In cmpProjectComponents If cmp.Type = vbext_ct_MSForm Then For Each ctl In cmp.Designer.Controls MsgBox cmp.Name & " - " & ctl.Name Next ctl End If Next cmp End Sub
Sub Input_Footer() Dim footermsg As String '변수선언 footermsg = InputBox("바닥글을 넣어주세요", "바닥글 입력상자") ActiveSheet.PageSetup.CenterFooter = footermsg ' 중앙에 쓰려면 ActiveSheet.PageSetup.LeftFooter = footermsg ' 왼쪽에 쓰려면 ActiveSheet.PageSetup.RightFooter = footermsg ' 오른쪽에 쓰려면 End Sub >>>>> 중앙부에 바닥글 넣는 예제 Sub Input_Footer() Dim footermsg As String footermsg = InputBox("머리글을 넣어주세요", "머리글입력상자") ' Default 바닥글 양식 'ActiveSheet.PageSetup.CenterFooter = footermsg ' 바닥글 양식을 바꾸는 예제 ActiveSheet.PageSetup.CenterFooter = "&""궁서체,굵게""&24" & footermsg End Sub >>>> 오른쪽에 날짜를 mm/dd/yy형식으로 바닥글 넣는 루틴 Sub 바닥글() sDate = inputbox("날짜를 mm/dd/yy 형식으로 입력하세요.") ActiveSheet.PageSetup.RightFooter = _ "&""Arial,보통""&9 " & strDate End Sub
여기서 주의하실 점!!! 은 반드시 "&9 뒤에 space 를 한칸 넣어야 한다는 사실입니다.!!!
Sub Auto_Open() With ThisWorkbook.Sheets("Sheet1") .Unprotect password:="Fred" .Range("A1").Value = Now .Protect password:="Fred" End With End Sub
텍스트 데이터를 날짜서식으로 바꾸는 간단한 방법 <목차로> =DATE(RIGHT(A1,2),LEFT(A1, MOD(LEN(A1),5)+1),MID(A1, LEN(A1)-3,2)) < 해설 > RIGHT(A1,2): 셀의 텍스트 중 오른쪽 두 글자를 년도로 가져온다. LEFT(A1, MOD(LEN(A1),5)+1) : 자릿수가 5자리면 1을, 6자리면 2를 만들어 왼쪽으로 부터 읽을 갯수 지정하여 월도를 가져온다. MID(A1, LEN(A1)-3,2) : 글자 수가 5면 두째자리부터,6이면 셋째자리 부터 읽어 날짜로 한다. 이 예는 50298 ==>5/2/98, 121298 ==> 12/12/98 으로 바꾸어 준다.(날짜서식에 따라 다름)
Sub SaveAsTodaysDate() Dim sFileName As String, sPath As String sPath = "C:\" 'change path here sFileName = Format(Now(), "mmddyy") ActiveWorkbook.SaveAs (sPath & sFileName) End Sub
With Columns("B:B").SpecialCells(xlCellTypeBlanks) .EntireRow.Hidden = True End With
Private Function Age(aDate As Date) Dim BThisYear As Date Dim aDate As Date If aDate = 0 Then Age = "*" Else ' 올해의 생일이 언제인가를 결정 BThisYear = DateSerial(Year(Now()), Month(aDate), Day(aDate)) '생일이 이미 지나갔는가? If BThisYear < Now() Then Age = Year(Now()) - Year(aDate) Else Age = Year(Now()) - Year(aDate) - 1 End If End If End Function
문자와 숫자의 조합중 문자를 제외한 숫자만 읽어오기 <목차로> Function LastDigits(s As String) As Integer Dim i For i = 1 To Len(s) If Mid(s, i, 1) Like "#" Then LastDigits = Mid(s, i, 1 + Len(s) - i) Exit For End If Next i End Function
매 2,3번째의 행을 삭제하는 방법 ( 2,3행 5,6행 8,9행 ... 삭제) <목차로> <예제 1> 맨 마지막 행부터 3으로나누어 1이 남는 행번호를 제외하고 삭제 하도록 한 예임 Sub DeleteEverySecondAndThirdRow() Application.ScreenUpdating = False numRows = ActiveSheet.UsedRange.Rows.Count For rowNum = numRows To 1 Step -1 If rowNum Mod 3 <> 1 Then '3으로 나누어 나머지가 1이 아니면 ActiveSheet.Rows(rowNum).EntireRow.Delete shift:=xlUp End If Next rowNum Application.ScreenUpdating = True End Sub
<예제 2> 전체 행의 수를 3으로 나누어 정수를 취하고 3을 곱하고 1을 더한 행 에서 출발하여 세 행씩 올라오며 반복 처리하는 방법을 사용함. Sub DeleteEvery() Dim Ndx As Integer With ActiveSheet For Ndx = Int((.UsedRange.Rows.Count + 1) / 3) * 3 + 1 To 4 Step -3 .Rows(Ndx - 1).Delete .Rows(Ndx - 2).Delete Next Ndx End With End Sub
셀내에 Space만 들어 있는 경우 Space도 하나의 글자로 인식되므로 셀의 내용을 Space Bar 를 이용하여 지운경우 내용이 있는 셀로 Count된다. 따라서 셀의 내용을 지울때는 Del Key를 사용해야한다. {=SUM(IF(LEN(TRIM(A1:A5))=0,1,0))} 위 식은 배열식이므로 양쪽 끝의 대괄호는 제외하고 입력을 한 후 Shift + Control + Enter하여 입력하고 또한 위 식은 0이 입력된 경우 비어 있지 않은 셀로 카운트한다. (옵션에서 "0표시"를 해제한경우 셀에 0이 표시되지 않는다)
셀에 0으로 시작하는 숫자를 입력하면 0이 표시되지 않는다. 그러나 0을 표시하고 싶다면 해당 범위를 선택하고 서식 > 셀 > 표시형식 탭 > 사용자정의 에서 표시하고자 하는 유형을 지정하면 된다. 예로 00012,0123,0001 등의 표현을 하려면 위의 사용자정의 유형에 "0000"을 넣고 확인을 하면 된다. 해당 셀에는 단지 12,123,1을 입력하면 0을 포함하여 표시하여 준다. 이 예는 부품번호, 사번, Serial No 등을 관리할 때 유용하다.
저장할 때 덮어쓰기할 것인지를 묻지 않고 저장하기 <목차로> 다음 예는 저장할 때 동일 이름의 파일이 있는 경우 덮어쓰기를 할것인지 묻는 것을 없애준다. 아래의 코드에서 saved의 속성이 true면 workbook의 내용이 바뀌지 않았다는 것으로 Excel은 판단하여 그대로 저장한다.
Sub SaveNoPrompt() With Activeworkbook .saved = True .save End With End Sub
또 다른 방법으로 경고메세지를 보이지 않도록 하여 저장한 후 다시 그 기능을 돌려 놓으면 된다.
Sub SaveNoPrompt() Application.DisplayAlerts = False Workbooks("BOOK1.XLS").save Application.DisplayAlerts = True End Sub
파일을 열때 Sheet보호 해제/작업수행후 다시 보호하는 방법 <목차로> Sub Auto_Open() Application.ScreenUpdating = False For Each x In ActiveWorkbook.Worksheets x.Unprotect "Fred" '"Fred"는 암호임 x.[a1].Value = Now x.Protect "Fred" Next [YourCode Here] : 파일을 열때 실행하여야할 코드 내용 ActiveWorkbook.Protect "Fred" Application.ScreenUpdating = True End Sub
입력된 내용을 일정위치에 "-"를 넣어 표시하는 방법 <목차로> 다음의 예는 입력된 문자를 6,10번째 자리에 '-"을 넣어 준다. Sub EditBox_Update() txt = DialogSheets(1).EditBoxes(1).Text j = 1 For i = 1 To Len(txt) c = Mid(txt, i, 1) If j = 6 Or j = 10 Then If c = "-" Then hold = hold & c j = j + 1 Else hold = hold & "-" & c j = j + 2 End If ElseIf c <> "-" Then hold = hold & c j = j + 1 End If Next i DialogSheets(1).EditBoxes(1).Text = hold End Sub
다음의 예는 학생의 이름과 성적이 A,B열에 있을때 성적이 제일 낮은 사람의 이름을 C1셀에 나타낸다. C1 = INDEX(A1:A6,MATCH(MIN(B1:B6),B1:B6,0) 위와 같이 입력하면 C1 에 "강현"이 나타난다
특정 셀을 Double Click하면 매크로 실행되게 하기 엑셀97에서 특정 셀을 Double Click하면 지정된 매크로가 실행되게 하면 매우 편리한 경우가 있다. 예를 들면 특정 셀의 값을 변경한 후에 매크로를 샐행시켜 계산을 다시 한다든지 또는 복잡한 작업을 매크로를 실행시켜 작업해야 하는 경우에 일일이 매크로를 실행하지 않아도 되기 때문이다. 아래의 매크로 코드는 모듈이나 대화상자 코드시트가 아닌 해당 시트의 코드시트에 써 넣어야 하며 해당 시트의 A1:A10의 셀을 더블클릭하면 MacroName이라는 매크로가 실행 된다.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target _ If Target.Address = "$A$1:$A$10" Then Call MacroName '실행하고자 하는 매크로 이름을 넣어줍니다. Cancel = True End If End Sub |