본문 바로가기

VBA/엑사남_기초방93

[기초방] VBA 100제 #74 [ 품목의 계절별 단가 구하기 ] 더보기 Option Explicit Sub 기초방74() Dim rngAll As Range: Set rngAll = [a6:a31] Dim rngA As Range Dim rngX As Range For Each rngA In rngAll Set rngX = [h5].Offset([h5:h9].Find(rngA).Row - 5, [h5:l5].Find(rngA(1, 2)).Column - 8) '= 단가표의 품목에서 row값을 겨울에서 column값을 가져와 rngX 즉 겨절별 품목단가의 위치를 rngX로 설정 rngA(1, 3) = rngX Next rngA End Sub 보통 이러한 문제는 엑셀에서 많이 나오는 문제이다. 해법은 [h5]를 기준으로 행방향으로 품목 열을 / [h5] 기준으로 열방향의.. 2023. 10. 13.
[기초방 [기초방] VBA 100제 #73 [ 문자열에서 숫자만 재정렬하기] 더보기 Option Explicit Sub 기초방73() Dim str$: str = [b4] '= 문자열 Dim Reg As Object: Set Reg = CreateObject("vbscript.regexp") '= 정규식 선언 Dim Mat As Object '= 일치하는 값 Dim V(1 To 65536, 1 To 1), rowV, i&, vtemp With Reg .Pattern = "\d+" '= 1자리 이상 숫자 .Global = True End With Set Mat = Reg.Execute(str) '= 숫자들만 정규식으로 가져와라 rowV = Application.Sequence(Mat.Count) For i = 1 To Mat.Count V(i, 1) = Mat(i - 1) '= 정.. 2023. 10. 12.
[기초방 [기초방] VBA 100제 #72 [ 조건에 맞는 숫자 반환 및 정렬 ] 영역을 순환하면서 50보다 큰 수를 vtemp 배열에 담아라 or Each rngA In rngAll If rngA > 50 And TypeName(Application.Match(rngA, vtemp, 0)) = "Error" Then i = i + 1 vtemp(i, 1) = rngA End If Next rngA 이렇게 하면 vtemp 에 50보다 큰 값들이 모두 쌓이게 되고 / i 변수에는 실제 숫자가 몇개 담겨 있는지 그 갯수가 나온다. 자 여기서 가장 핵심구문이다. 반환되는 영역이 11 x 4 이지 여기에 정확하게 50보다 큰수가 몇개 들어갈지는 모른다. 구해보면 11 x 4 = 44개중 실제로 값은 42개만 들어가게 된다. 그렇다면 vtemp(43,1) 과 vtemp(44,1) 의 값은 비어.. 2023. 10. 12.
[기초방] VBA 100제 #71 [ 전체누적 + 월별누적 ] 자 이번 문제는 전체누계와 월별 누계를 따로 계산해야 하는 문제이다. 전체누계야 그냥 처음부터 계속 더하면서 나가면 될것이고 월별누계가 약간 머리를 써야 한다. 원래는 엑셀 수식처럼 해당일자와 전일 일자와의 월을 비교해서 구하는게 정석이지만, 문제를 만들때 2023-01-01부터 9월까지 쭉 만들어 놓은거라.. DAY 함수를 사용하여 1일 인지를 파악하여 월별 누계를 구하였다. If Day(rngA(1, 0)) = 1 Then Val2 = Val2 * 0 + rngA Else: Val2 = IIf(Val2 = 0, rngA, Val2 + rngA): End If 핵심 구문은 이렇다. 해당일자의 일자가 1일인지를 확인해서 1일이며 새로운 달이 시작한 의미이기 때문에 누계값을 초기화 해준 후 해당일자의 값을.. 2023. 10. 8.